【问题标题】:Match multiple items in list to string in R将列表中的多个项目与R中的字符串匹配
【发布时间】:2016-11-21 19:38:48
【问题描述】:

我有以下数据框,并且正在努力检测单独字符串元素中的列表项。 在以下数据框中:

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)

结果是一个带有逻辑向量的列表。 我无法将它与我的原始数据框匹配。我相信我可以使用 colnames,但不太肯定它是如何工作的。

感谢任何建议! 谢谢

【问题讨论】:

    标签: r list vector grepl


    【解决方案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"     ""   
    

    【讨论】:

    • 谢谢!不幸的是,有可能不止一场体育比赛。这只是一个示例数据框,但完整的数据集确实包含多个行。
    • 如果有多个匹配项,那么输出将如下所示(使用相同代码的逗号分隔运动): [1] "" "" "Basketball,Soccer" "Basketball" "足球""",这样好看吗?
    • 抱歉,我只是重新阅读并测试了答案。是的,这是完美的!
    【解决方案2】:

    如果您刚刚这样做(将未命名的三项列表分配给 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
    

    【讨论】:

      猜你喜欢
      • 2018-07-11
      • 2021-08-02
      • 2020-05-02
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      相关资源
      最近更新 更多