我想统计变量的个体和组合出现次数(1 代表存在,0 代表不存在)。这可以通过多次使用table
函数来获得(参见下面的MWE)。是否可以使用更有效的方法来获得下面给出的所需输出?
set.seed(12345)
A <- rbinom(n = 100, size = 1, prob = 0.5)
B <- rbinom(n = 100, size = 1, prob = 0.6)
C <- rbinom(n = 100, size = 1, prob = 0.7)
df <- data.frame(A, B, C)
table(A)
A
0 1
48 52
table(B)
B
0 1
53 47
table(C)
C
0 1
34 66
table(A, B)
B
A 0 1
0 25 23
1 28 24
table(A, C)
C
A 0 1
0 12 36
1 22 30
table(B, C)
C
B 0 1
0 21 32
1 13 34
table(A, B, C)
, , C = 0
B
A 0 1
0 8 4
1 13 9
, , C = 1
B
A 0 1
0 17 19
1 15 15
所需输出
我需要类似以下内容:
A = 52
B = 45
C = 66
A + B = 24
A + C = 30
B + C = 34
A + B + C = 15
最佳答案
扩展 Sumedh 的答案,您还可以动态地执行此操作,而不必每次都指定过滤器。如果您要合并的列不止 3 列,这将很有用。
你可以这样做:
lapply(seq_len(ncol(df)), function(i){
# Generate all the combinations of i element on all columns
tmp_i = utils::combn(names(df), i)
# In the columns of tmp_i we have the elements in the combination
apply(tmp_i, 2, function(x){
dynamic_formula = as.formula(paste("~", paste(x, "== 1", collapse = " & ")))
df %>%
filter_(.dots = dynamic_formula) %>%
summarize(Count = n()) %>%
mutate(type = paste0(sort(x), collapse = ""))
}) %>%
bind_rows()
}) %>%
bind_rows()
这将:
1) 生成df的所有列的组合。首先是一个元素的组合(A、B、C),然后是两个元素的组合(AB、AC、BC),依此类推。
这是外部lapply
2) 然后对于每个组合都会创建一个动态公式。例如,对于 AB,公式为 A==1 & B==1,正如 Sumedh 所建议的那样。这是dynamic_formula
位。
3)将使用动态生成的公式过滤数据框并计算行数
4) 将所有内容绑定(bind)在一起(两个 bind_rows
)
输出将是
Count type
1 52 A
2 47 B
3 66 C
4 24 AB
5 30 AC
6 34 BC
7 15 ABC
关于r - R 中变量的联合出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38078611/