Сопоставьте несколько элементов в списке со строкой в ​​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")

есть столбец заголовка и столбец тегов. По причинам обработки данных столбец тегов не является списком. Это строка, которая выглядит как массив.

У меня есть отдельный список под названием спорт, который представляет собой список различных видов спорта.

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)

Результатом является список с логическими векторами. У меня возникли проблемы с сопоставлением этого с моим исходным фреймом данных. Я считаю, что мог бы использовать имена столбцов, но не совсем уверен, как это работает.

Рад любым советам! Спасибо


person RCN    schedule 21.11.2016    source источник


Ответы (2)


Предполагая, что у вас есть не более одного матча с любым видом спорта для каждой строки (если у вас одновременно несколько матчей, эти виды спорта будут разделены запятыми), вы можете попробовать следующее (отсутствие совпадения с каким-либо видом спорта обозначается пробелом в строке). новый столбец спорт в 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"     ""   
person Sandipan Dey    schedule 21.11.2016
comment
спасибо! К сожалению, возможно, что существует более одного спортивного матча. Это был только образец фрейма данных, однако полный набор данных содержит строки с более чем одной строкой. - person RCN; 21.11.2016
comment
Если совпадений несколько, вывод будет выглядеть следующим образом (разделенные запятыми виды спорта с одинаковым кодом): [1] Basketball,Soccer Basketball Soccer , это выглядит нормально? - person Sandipan Dey; 21.11.2016
comment
Мои извинения, я только что перечитал и проверил ответ. Да Это идеально! - person RCN; 21.11.2016

Если бы вы только что сделали это (назначили безымянный список из трех элементов, каждый с правильной длиной, трем столбцам с новыми именами), вы бы получили полезные результаты:

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
person IRTFM    schedule 21.11.2016