唯一列组合的总和

Sum of unique column combinions

我正在尝试对我目前拥有的数据集做两件事:

    ID    IV1 DV1 DV2 DV3 DV4 DV5 DV6 DV7
1  97330   3   0   0   0   0   0   1   0
2 118619   0   0   0   0   0   1   1   0
3 101623   2   0   0   0   0   0   0   0
4 202626   0   0   0   0   0   0   0   0
5 182925   1   1   0   0   0   0   0   0
6 179278   1   0   0   0   0   0   0   0
  1. 求出7个二进制的列组合的唯一数目 自变量 (DV1 - DV7)
  2. 按每个唯一组求独立计数变量 (IV1) 的总和。

我已经能够使用以下方法确定唯一列组合的数量:

uniq <- unique(dat[,c('DV1','DV2','DV3','DV4','DV5','DV6','DV7')])

这表示数据集中存在 101 个唯一组合。我 还没有 弄清楚的是如何确定如何对每个唯一组的变量 "IV1" 求和。我一直在这个网站上阅读,我相当确定有一个简单的 dplyr 答案,但到目前为止我还没有找到它。

注意:我实际上是在尝试找到一个 R 解决方案来执行 "conjunctive analysis",它显示在 this paper 中。文末有SPSS、SAS和STATA的示例代码

library(dplyr)
group_by(dat, DV1, DV2, DV3, DV4, DV5, DV6, DV7) %>%
    summarize(sumIV1 = sum(IV1))

结果中的行数是数据中存在的唯一组合的数量。当然,sumIV1 列的分组总和为 IV1

感谢 Frank 的评论,我们可以使用带有 group_by_ 的字符串来简化:

group_by_(dat, .dots = paste0("DV", 1:7)) %>%
         summarize(sumIV1 = sum(IV1))

这是一个可重现的例子:

library(data.table)
DT <- data.table(X = c(1, 1, 1 , 1), Y = c(2, 2 , 3 , 4), Z = c(1,1,3,1))

其中 X、Y ... 是您的列。

然后使用Reduce函数:

DT[, join_grp := Reduce(paste,list(X,Y,Z))]

这给出:

DT
   X Y Z join_grp
1: 1 2 1    1 2 1
2: 1 2 1    1 2 1
3: 1 3 3    1 3 3
4: 1 4 1    1 4 1

并且我们可以找到:

unique(DT[, join_grp])
[1] "1 2 1" "1 3 3" "1 4 1"

总和:

DT[ , sum(X), by = join_grp]

只需将您想要求和的任何列放在 X

的位置

简洁的解决方案

DT[, join_grp := Reduce(paste,list(X,Y,Z))][ , sum(X), by = join_grp]

DT[ , sum(X), by = list(Reduce(paste,list(X,Y,Z)))]