唯一列组合的总和

时间:2015-10-14 15:11:43

标签: r aggregate dplyr summary

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

    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)的总和。
  3. 我已经能够使用以下内容确定唯一列组合的数量:

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

    这表明数据集中存在101个唯一组合。我没有能够弄清楚的是如何确定如何对变量求和&#34; IV1&#34;由每个独特的小组。我一直在这个网站上阅读,我相当肯定有一个简单明了的答案,但到目前为止它还没找到我。

    注意:我基本上试图找到一个R解决方案来执行&#34;联合分析&#34;显示在this paper中。本文末尾有SPSS,SAS和STATA的示例代码。

2 个答案:

答案 0 :(得分:3)

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))

答案 1 :(得分:1)

这是一个可重复的例子:

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)))]