通过将另一个矩阵的行相加来在R中创建新矩阵。

5

我有一个矩阵(我们称它为output):

> 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的第二行将由旧输出矩阵的第三行和第四行之和组成:
output2[2,] <- output[3,] + output[4,]

等等。考虑到我需要对更大的矩阵执行相同的操作,你认为最好的编码方式是什么?我正在考虑使用seq()函数和for循环创建虚拟变量。

有更简单的方法吗?

编辑:

dput(output)

结构(c(1,1,1,0,1,1,1,1,1,1,1,1,1,0,0,0,1, 1,0,1,1,1,1,0,1,1,1,1,1,1,0,0,0,0,1,1,0,0, 1,0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,0,1,0,0, 0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,0,1, 0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1,0,0,1, 0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0, 0,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,1,0,0,0,0,0,0,0),.Dim = c(10L,19L))


1
请发布 dput(yourMatrix) - Andre Elrico
3个回答

1
如果您的矩阵是m,请尝试以下操作:
m[seq(1,by=2,to=nrow(m)),]+m[seq(2,by=2,to=nrow(m)),]

是的,我认为这符合我的想法!非常感谢! - João Carvalho

1

以下两种方法:

  • 可以处理偶数和奇数行
  • 通过将2替换为k来推广到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 另一个可能性是使用zoo中的rollapply。如果我们知道行数是偶数,我们可以选择省略align和partial参数。

library(zoo)
rollapply(output, 2, by = 2, sum, align = "left", partial = TRUE)

两个都运行良好!但是rollapply()似乎有点慢。谢谢您的时间! - João Carvalho

1
另一个选择是使用向量回收:
matrix(output[c(TRUE, FALSE)] + output[c(FALSE, TRUE)], ncol = ncol(output))

这个解决方案对我也有效。感谢你的帮助! - João Carvalho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接