r - 按包含元素列表的变量中的元素对数据框进行分组

标签 r group-by tidyverse

我想执行一个不平凡的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 之和不一定等于数据框中的行数。

最佳答案

我们可以使用带有table简单基础R解决方案来计算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

或者正如@alexis_laz在评论中提到的,替代方案是as.data.frame.table

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

关于r - 按包含元素列表的变量中的元素对数据框进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41803446/

相关文章:

r - 如何在保持列名顺序的同时扩展 tidyr::spread()?

r - 使用 purrr::map2 (?) 向数据框添加新列

javascript - R shiny 中的绝对面板隐藏在传单输出后面

sql - 无法在 Group By 中强制转换时间戳

r - R 中有没有类似于 bash 中的 "here document"的东西?

php - mySQL 排序和不同

mysql - 在 SQL 查询中过滤 double 值

r - 将单元格中的列表取消列出到单独的列中 - 错误

r - tidyverse 中的 Slice_max

r - 按年和月聚合 POSIX 变量