通过将另一个矩阵的行求和在R中创建新矩阵



所以我有以下矩阵(我们称其为输出):

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

最新更新