我一直在考虑我遇到的问题,但我不知道如何表达问题甚至搜索它。如果你能向我解释,我会非常感激。
所以,我有一个数据集,格式如下:
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) {
....
}
我在这个阶段陷入困境,我不知道如何在代码中表达我需要做什么。我很抱歉发布了一个没有进展的代码,一些建议会非常好,我应该怎么做。
提前多多感谢。
答案 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
这里,矩阵dat
由combn
结果的每一列索引,给出两列矩阵(两列要求和)。 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