r中的成对计算

时间:2014-01-12 16:06:17

标签: r

我一直在考虑我遇到的问题,但我不知道如何表达问题甚至搜索它。如果你能向我解释,我会非常感激。

所以,我有一个数据集,格式如下:

10 6 4 4
10 6 4 4
7 6 4 4

我想进行成对计算,我需要逐个将每个元素相加到另一个元素。那是1是2,1是3,1和4,2有3,2有4和3有4。

我想在R中做一个嵌套的循环我读到它并且我开始这样:

for (i in 1:r-1) { ## r the number of columns
for (j in (i+1):r) {
....
}

我在这个阶段陷入困境,我不知道如何在代码中表达我需要做什么。我很抱歉发布了一个没有进展的代码,一些建议会非常好,我应该怎么做。

提前多多感谢。

3 个答案:

答案 0 :(得分:3)

使用combn创建“对”:

(pairs <- combn(4,2))
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    1    1    2    2    3
[2,]    2    3    4    3    4    4

然后apply跨数据行,通过应用这些对的列来对这些子集求和:

dat <- matrix(c(10,10,7,6,6,6,4,4,4,4,4,4),ncol=4)
t(apply(dat, 1, function(x) apply(combn(4,2),2,function(y) sum(x[y]))))
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]   16   14   14   10   10    8
[2,]   16   14   14   10   10    8
[3,]   13   11   11   10   10    8

答案 1 :(得分:0)

你可以稍微修改你的循环:

d <- read.table(text='
10 6 4 4
10 6 4 4
7 6 4 4')

nc <- ncol(d)
r <- NULL
for (i in 1:nc) {
  for (j in 1:nc) {
    if (i < j) {                      # crucial condition
      r <- cbind(r, d[, i] + d[, j])  # calculate new column and bind to calculated ones
    } 
  }
}

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]   16   14   14   10   10    8
[2,]   16   14   14   10   10    8
[3,]   13   11   11   10   10    8

答案 2 :(得分:0)

combn的另一个应用,但也许更容易理解:

apply(combn(ncol(dat),2), 2, function(x) rowSums(dat[,x]))
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]   16   14   14   10   10    8
## [2,]   16   14   14   10   10    8
## [3,]   13   11   11   10   10    8

这里,矩阵datcombn结果的每一列索引,给出两列矩阵(两列要求和)。 rowSums然后做算术。

因为我非常喜欢包功能,所以上面的内容略有不同:

apply(combn(ncol(dat),2), 2, Compose(Curry(`[`, dat, i=seq(nrow(dat))), rowSums))

应该注意的是,combn方法比使用嵌套for循环进行此类计算更灵活。特别是,它很容易适应任意数量的列总和:

f <- function(dat, num=2) 
{
  apply(combn(ncol(dat),num), 2, function(x) rowSums(dat[,x,drop=FALSE])) 
}

这将提供num列的所有组合,并将它们相加:

f(dat, 1)
##      [,1] [,2] [,3] [,4]
## [1,]   10    6    4    4
## [2,]   10    6    4    4
## [3,]    7    6    4    4
f(dat, 2)
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]   16   14   14   10   10    8
## [2,]   16   14   14   10   10    8
## [3,]   13   11   11   10   10    8
f(dat, 3)
##      [,1] [,2] [,3] [,4]
## [1,]   20   20   18   14
## [2,]   20   20   18   14
## [3,]   17   17   15   14
f(dat, 4)
##      [,1]
## [1,]   24
## [2,]   24
## [3,]   21