【问题标题】:Group data frame by elements from a variable containing lists of elements按包含元素列表的变量中的元素对数据框进行分组
【发布时间】:2017-06-07 18:59:42
【问题描述】:

我想执行一个重要的group_by,通过在其中一个变量中找到的列表的单个元素对数据框进行分组和汇总。

df <- data.frame(x = 1:5)
df$y <- list("A", c("A", "B"), "C", c("B", "D", "C"), "E")
df
 x       y
1 1       A
2 2    A, B
3 3       C
4 4 B, D, C
5 5       E

现在按y 分组(并说计算行数),这是一个保存元素列表的变量,所需的最终结果应该是:

data.frame(group = c("A", "B", "C", "D", "E"), n = c(2,2,2,1,1))
  group n
1     A 2
2     B 2
3     C 2
4     D 1
5     E 1

因为“A”出现在 2 行中,“B”出现在 2 行中等等。

注意:n 的总和不一定等于数据框中的行数。

【问题讨论】:

    标签: r group-by tidyverse


    【解决方案1】:

    我们可以使用simple base R解法和table来计算unlistlist之后的频率,然后基于该表对象创建data.table

    tbl <- table(unlist(df$y))
    data.frame(group = names(tbl), n = as.vector(tbl))
    #  group n
    #1     A 2
    #2     B 2
    #3     C 2
    #4     D 1
    #5     E 1
    

    或者tidyverse的另一个选项

    library(dplyr)
    library(tidyr)
    unnest(df) %>% 
         group_by(group = y) %>% 
         summarise(n=n())
    #     <chr> <int>
    #1     A     2
    #2     B     2
    #3     C     2
    #4     D     1
    #5     E     1
    

    或者如 cmets 中提到的 @alexis_laz,另一种选择是 as.data.frame.table

    as.data.frame(table(group = unlist(df$y)), responseName = "n")
    

    【讨论】:

    • 一个方便的选择是as.data.frame.table -- as.data.frame(table(group = unlist(df$y)), responseName = "n")
    • 我更喜欢tidyverse 解决方案,因为汇总函数不一定计数。行数,谢谢。
    【解决方案2】:

    简单的基础 R 解决方案:(实际上这是一个 dup 问题,但无法找到它)

    sapply(unique(unlist(df$y)), function(x) sum(grepl(x, df$y))
    # A B C D E 
    # 2 2 2 1 1 
    

    【讨论】:

      猜你喜欢
      • 2020-11-05
      • 1970-01-01
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多