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

时间:2017-01-23 09:55:18

标签: 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的总和不一定等于数据框中的行数。

2 个答案:

答案 0 :(得分:2)

我们可以使用简单基础R 解决方案与table一起计算unlist list之后的频率,然后基于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

的其他选项
as.data.frame.table

或者如评论中提到的@alexis_laz,替代方案是as.data.frame(table(group = unlist(df$y)), responseName = "n")

(def mydata #{{:rank 2 :page 1 :group "fish"}
              {:rank 1 :page 1 :group "mammal"}
              {:rank 3 :page 2 :group "bird"}})

答案 1 :(得分:2)

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

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