我有data.frame
:
tmp <- data.frame(C1=c(1,1,2),C2=c(2,3,3), CS=c(5,7,9))
> tmp
C1 C2 CS
1 1 2 5
2 1 3 7
3 2 3 9
我需要计算data.frame
对的所有唯一组合的总和,其中C1
和C2
定义对的组合,CS
定义两个术语总和。通常情况下,nrow(tmp)
等于n
。
第一个组合,常用数字 1 :( 1 和2)和( 1 和3)给出5 + 7 = 12 。
第二个组合,常用数字 2 :( 1和 2 )和( 2 和3)给出5 + 9 = 14
第3组合,常用数字 3 :( 1和 3 )和(2和 3 )给出7 + 9 = 16
预期结果是向量(12,14,16)。
有人会想知道如何组织所有独特组合的完整半身像吗?
答案 0 :(得分:3)
通过docker create
或stack
然后melt
或aggregate
或tapply
或dplyr
制作一个长数据集,按组求和。基础R的一次尝试:
data.table
答案 1 :(得分:1)
我真的不确定为什么要这样做。必须有更好的方法来存储这些数据。总之...
library(dplyr)
## create an accumulating list
output <- list()
## for each 'common number', find the rows (slice) for which that number
## is either in the first or second column, then sum the value of
## CS in those columns.
for (pairNo in 1:3) {
output[[pairNo]] <- tmp %>%
slice(which(pairNo== C1 | pairNo== C2)) %>%
summarise(pairNo=pairNo, result=sum(CS))
}
## > output
## [[1]]
## pairNo result
## 1 1 12
##
## [[2]]
## pairNo result
## 1 2 14
##
## [[3]]
## pairNo result
## 1 3 16
该列表的清洁输出取决于您。
答案 2 :(得分:1)
不一定更好,但可能比我的其他答案更清洁;
library(dplyr)
library(tidyr)
tmp %>%
gather(CS, "common") %>%
data.frame %>% ## avoids the duplicated name from a simple gather
select(-CS.1) %>%
group_by(common) %>%
summarise(sum(CS))
## common sum(CS)
## 1 1 12
## 2 2 14
## 3 3 16