【问题标题】:R - Counting total occurrences of word from list that appears in data frame, and groupedR - 计算出现在数据框中的列表中单词的总出现次数,并分组
【发布时间】:2020-02-05 22:14:24
【问题描述】:

我有一个这样的数据框:

ID   Word
1    Tree
1    House
1    Tree
2    Snail
2    Tree
3    Car

我有一个要检查的关键字列表:

(House, Tree, Bird)

我想知道对于每个 ID,我的关键字列表中的任何单词出现了多少次。

即House, Tree or Bird这个词在ID(1)中出现了3次,而House, Tree or Bird在ID(2)中只出现了一次,在ID(3)中没有出现过

ID   Count
1     3
2     1
3     0

我不确定如何解决这个问题。我知道如何计算一个单词在每个 ID 中出现的次数,但不知道另一个列表中的单词出现的次数。

感谢您的任何建议/指导等。

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以创建一个逻辑索引并获取按“ID”分组的sum。不确定'v1'是vector还是list(如果是list,则unlist(v1)并使用相同的代码)

    library(dplyr)
    df1 %>% 
       group_by(ID) %>% 
       summarise(Count = sum(Word %in% v1))
    # A tibble: 3 x 2
    #     ID Count
    #  <int> <int>
    #1     1     3
    #2     2     1
    #3     3     0
    

    或者filter 然后做一个count

    df1 %>% 
       filter(Word %in% v1) %>%
       count(ID, .drop = FALSE)
    

    数据

    v1 <- c("House", "Tree", "Bird")
    df1 <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 3L), Word = c("Tree", 
    "House", "Tree", "Snail", "Tree", "Car")), class = "data.frame", 
    row.names = c(NA, 
    -6L))
    

    【讨论】:

    • 哇,太快了。完美运行。真的非常感谢你!我花了几个小时在这上面!我会尽快将您的答案标记为正确:)
    【解决方案2】:

    在基础 R 中,我们可以使用 table 来计算每个 ID 中包含 vecWord 的数量。

    table(df$ID, df$Word %in% vec)
    
    #    FALSE TRUE
    #  1     0    3
    #  2     1    1
    #  3     1    0
    

    这里的 rownames (1, 2, 3) 是 ID 的 FALSE 是每个 vec 中不存在的 Word 的计数 IDTRUE 是计数Word 存在于每个 ID 中。

    为了获得准确的预期输出,我们可以将表格转换为数据框,并仅将 TRUEcolumn 作为计数。

    data <- as.data.frame.matrix(table(df$ID, df$Word %in% vec))
    data.frame(ID = rownames(data), count = data$`TRUE`)
    
    #  ID count
    #1  1     3
    #2  2     1
    #3  3     0
    

    【讨论】:

    • 感谢您在 base R 中提供的替代选项。真的很有用:)
    猜你喜欢
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2013-12-25
    • 2014-08-24
    相关资源
    最近更新 更多