2016-11-21 14 views
0

次のデータフレームがあり、別の文字列要素内のリスト項目を検出するのに苦労しています。以下のデータフレームで :リスト内の複数の項目を文字列に一致させるR

original_df <- structure(list(title = c("Film Review: Almost Christmas", "Film Review:  Mascots", 
"Women s Basketball Upstages No. 2 California Baptist", "Men s Basketball Goes 2-0 In Opening Home Matchups", 
"Women s Soccer Wins 16th Consecutive Game, Moves Onto Third Round of Tournament", 
"The Hype About Hullabaloo"), tags = c("[u'Arts & Entertainment', u'Films & TV', u'Trending', u'Almost Christmas', u'Danny Glover', u'David E. Talbert', u'family', u'Film', u'Gabrielle Union', u'Holiday', u'JB Smoove', u'movie', u'review']", 
"[u'Arts & Entertainment', u'Films & TV', u'Homepage', u'Trending', u'Chris O\\u2019Dowd', u'Christopher Guest', u'Ed Begley Jr.', u'Film', u'Fred Willard', u'Jane Lynch', u'Mascots', u'movie', u'Netflix', u'Parker Posey', u'review', u'Spinal Tap']", 
"[u'Basketball', u'Homepage', u'Sports', u'Trending', u'Beth Mounier', u'cassie macleod', u'Dalayna Sampton', u'Joleen Yang', u'Mikayla Williams', u'Taylor Tanita', u'UCSD', u\"Women's Basketball\"]", 
"[u'Basketball', u'Homepage', u'Sports', u'Trending', u'Adam Klie', u'Azusa Pacific University', u'CCAA', u'Dixie State', u\"Men's Basketball\", u'Tritons', u'UCSD']", 
"[u'Homepage', u'Soccer', u'Sports', u'Trending', u'Azusa Pacific', u'Jordyn McNutt', u\"Katie O'Laughlin\", u'Mary Reilly', u'NCAA Division-II', u'UCSD', u\"Women's Soccer\"]", 
"[u'Arts & Entertainment', u'Music', u'Slider', u'AS', u'asce', u'Concerts', u'Council', u\"Founder's Day\", u'Hullabaloo', u'Isaiah Rashad', u'Rap', u'Responsible Action Protocol', u'sun god', u'UCSD']" 
)), .Names = c("title", "tags"), row.names = 215:220, class = "data.frame") 

タイトル欄とタグの列があります。データ操作上の理由から、tags列はリストではありません。配列のような文字列です。

私は様々なスポーツのリストであるsportsという別のリストを持っています。

sports <- c("Basketball", "Soccer", "Baseball") 

スポーツが検出されたことを示す元のデータフレームに新しい列を作成したいとします。 は私がgreplを使用し始めて、次の関数を作成:

detectSports <- function(sport_item){ 
    sport_in_tag <- grepl(tolower(sport_item),tolower(original_df$tags)) 
    sport_in_tag 
} 

をし、スポーツのリストにこの機能を適用:

ss <- lapply(sports, detectSports) 

結果が論理ベクトルを持つリストです。 私は元のデータフレームにこれをマッチさせるのに問題があります。私は、コルネームを利用できると思っていますが、それがどのように機能するかは非常に肯定的ではありません。

アドバイスをよろしくお願いいたします。 ありがとう

答えて

1

複数の試合が同時に行なわれている場合(複数の試合が同時に行われた場合、それらのスポーツはコンマで区切られます)、次の試行ができますoriginal_dfの新しい列スポーツ)に空白文字で示さ:

original_df$sports <- unlist(apply(t(do.call(rbind, lapply(sports, detectSports))), 1, 
       function(x) ifelse (any(x), paste(sports[which(x)], collapse=','), ''))) 

original_df$sports 

# [1] ""   ""   "Basketball" "Basketball" "Soccer"  "" 
+0

ありがとう!残念ながら、複数のスポーツマッチがある可能性があります。これはサンプルデータフレームだけでしたが、完全なデータセットには複数の行が含まれています。 – RCN

+1

複数のマッチがある場合、出力は次のようになります(同じコードのカンマで区切られたスポーツ)。 [1] "" "" "バスケットボール、サッカー" "バスケットボール" "サッカー" ""それは大丈夫ですか? –

+0

私の謝罪、私はちょうどその答えを再度読み、テストしました。はい、それは完璧です! – RCN

0

あなただけの)3つの新しい名前の列に、これは(無名の3つの項目リスト、正しい長さのそれぞれを割り当てて行っていた場合は、その必要があるでしょう有用な結果を得ました:

original_df[ , sports] <- ss 
#examine results 
original_df[ , !names(original_df) %in% "tags"] 
                       title Basketball Soccer Baseball 
215             Film Review: Almost Christmas  FALSE FALSE FALSE 
216              Film Review:  Mascots  FALSE FALSE FALSE 
217       Women s Basketball Upstages No. 2 California Baptist  TRUE FALSE FALSE 
218        Men s Basketball Goes 2-0 In Opening Home Matchups  TRUE FALSE FALSE 
219 Women s Soccer Wins 16th Consecutive Game, Moves Onto Third Round of Tournament  FALSE TRUE FALSE 
220              The Hype About Hullabaloo  FALSE FALSE FALSE 
関連する問題