唯一列组合的总和
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
- 求出7个二进制的列组合的唯一数目
自变量 (DV1 - DV7)
- 按每个唯一组求独立计数变量 (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)))]
我正在尝试对我目前拥有的数据集做两件事:
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
- 求出7个二进制的列组合的唯一数目 自变量 (DV1 - DV7)
- 按每个唯一组求独立计数变量 (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)))]