【问题标题】:Sum of unique column combinions唯一列组合的总和
【发布时间】:2015-10-14 15:11:42
【问题描述】:

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

    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 解决方案来执行显示在this paper 中的“联合分析”。文末附有SPSS、SAS、STATA的示例代码。

【问题讨论】:

  • 对于 dplyr 的 #1:dat %&gt;% select(DV1:DV7) %&gt;% distinct %&gt;% nrow。这个命令应该适用于整个dat %&gt;% group_by(DV1:DV7) %&gt;% summarise(tot_IV1 = sum(IV1)),但看起来他们没有为那个用例编码group_by

标签: r aggregate dplyr summary


【解决方案1】:
library(dplyr)
group_by(dat, DV1, DV2, DV3, DV4, DV5, DV6, DV7) %>%
    summarize(sumIV1 = sum(IV1))

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

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

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

【讨论】:

  • 确实,这会产生预期的结果。我不知道使用“group_by”的解决方案如此简单。非常感谢!
  • @DavidArenburg 肯定是这样,但根据弗兰克的评论“这个命令应该可以工作......但看起来他们没有为那个用例编码group_by。”
  • 啊,你就是这样做的!我总是忘记我需要命名 .dots 才能让它工作。
【解决方案2】:

这是一个可重现的例子:

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

【讨论】:

  • OP 的示例也可以通过很少的工作重现。
  • 我认为简洁的解决方案就是DT[ , .N, by = .(X, Y, Z)],不是吗?
  • @DavidArenburg 我认为 OP 需要 sum(X),而不是 .N。无论出于何种原因,当我运行 DT[ , sum(X), by = .(X, Y, Z)] 时,我没有得到正确的总和
  • 如果列是组的一部分,它只出现一次,这就是为什么你得到一个值。
  • 为什么要坚持这个具体案例?这不是 OP 正在处理的问题。
猜你喜欢
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 2019-11-10
相关资源
最近更新 更多