r - R 中变量的联合出现

标签 r data-manipulation

我想统计变量的个体和组合出现次数(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/

相关文章:

读取 "next line delimited"的文本文件

sql - 条件求和 (Alasql)

r - 如何对行进行分组并在 r 中以列表形式排列它们的单元格关联?

python - 根据其他列的值向前填充

r - 如何使用两列进行条件交换?

r - 使用 R markdown 以编程方式插入文本、标题和列表

r - ggplot2:删除一些图例标题

r - 使用表达式等创建多行标签

r - 将 n 个 ggplots 排列成下三角矩阵形状

R 数据操作。查找列值并进行操作