所以我有以下矩阵(我们称其为输出):
> output
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 1 1 0 0 1
[2,] 1 1 1 0 0 1
[3,] 1 1 1 0 0 1
[4,] 0 0 0 0 0 0
[5,] 1 0 1 1 0 0
[6,] 1 0 1 1 0 0
我想做的是通过在两个小组中添加行来创建一个新的矩阵(output2)。例如,新矩阵的第一行是:
output2[1,] <- output[1,] + output[2,]
新矩阵输出的第二行将由旧输出矩阵的第三和第四行组成:
output2[2,] <- output[3,] + output[4,]
等等。考虑到我需要对更大的矩阵做同样的事情,我想知道最好的编码方法是什么。我正在考虑使用seq()函数以及可能的循环创建虚拟变量。
有更简单的方法吗?
编辑:
dput(输出)
结构(c(1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,0,0,0,0,1,1,0,0,0,00,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0、0、1、0、0、0、0、0、0、0、0、0、0、1、0、0、0、0、0、0、0、0、0、0、0,0,00、1、0、0、0、0、0、0、0、0、0、0、1、0、0、0、0、0、0、0、0、0、0、0、0,0,01,0,0,0,0,0,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0、0、0、0、0),.dim = c(10l,19l))
如果m
是您的矩阵,请尝试以下操作:
m[seq(1,by=2,to=nrow(m)),]+m[seq(2,by=2,to=nrow(m)),]
另一个选项是使用向量回收:
matrix(output[c(TRUE, FALSE)] + output[c(FALSE, TRUE)], ncol = ncol(output))
这两个:
- 处理行的偶数和奇数
- 用k 替换2来概括为k行
- 很短 - 一行代码或可以轻松地做一行
- (1)仅使用基本函数,即没有包装和(2)可以轻易推广到sum以外的功能。
1)rowsum 使用rowsum
的第二个参数c(1, 1, 2, 2, ..., 5, 5)
,它易于使用gl
:
nr <- nrow(output)
rowsum(output, gl(nr, 2, nr))
2)rollapply 另一种可能性是使用动物园使用rollapply。如果我们知道行的数量是,我们甚至可以选择省略一致和部分论点。
library(zoo)
rollapply(output, 2, by = 2, sum, align = "left", partial = TRUE)