2

我想通过在其中一个变量中找到的列表的单个元素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不一定等于数据框中的行数。

4

2 回答 2

3

我们可以使用简单的基本 R解决方案来计算ingtable之后的频率,然后基于该表对象创建一个unlistlistdata.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")
于 2017-01-23T09:59:45.343 回答
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 
于 2017-01-23T10:27:58.590 回答