如何在R中添加表或矩阵的总和行?

时间:2018-11-12 16:56:56

标签: r loops matrix add rows

我在R中有一个矩阵,如下所示:

     [,1] [,2] [,3] [,4]
[1,]    0   1     1    1
[2,]    2   12   22   32
[3,]    3   13   23   33
[4,]    4   14   24   34
[5,]    5   15   25   35
[6,]    6   16   26   36
[7,]    7   17   27   37
[8,]    8   18   28   38
[9,]    9   19   29   39
[10,]   10   20   30   40

我想将每两行加在一起,以便[1,]和[2,]创建一个新向量(例如A)。我需要重复执行此操作(因此,[3,]和[4,]等)。我需要以循环或其他方式(如果我的实际数据有49列和1000行)来执行此操作。如果可能的话,我希望它创建一个包含所有新数据的新矩阵,那么从我的原始数据来看,我将有500行,或者这里有5行?

我尝试了以下代码:

 dips = matrix()
 X <- seq(1, by = 2, len = 1000)
 for(i in X)
 {
 dips[i] = population[i,] + population[i+1,]
}

我不断收到警告,“要更换的物品数量不是更换长度的倍数”。并且生成的数据不包含所有49列。

很抱歉,如果这是一个基本问题或已经解决,我是一个初学者。先感谢您!

2 个答案:

答案 0 :(得分:4)

这可能是重复的,但是我无法快速找到合适的匹配项,所以这里...您可以使用rowsum

my_matrix <- structure(c(0L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 12L, 
                         13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 1L, 22L, 23L, 24L, 25L, 
                         26L, 27L, 28L, 29L, 30L, 1L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 
                         39L, 40L), .Dim = c(10L, 4L), .Dimnames = list(NULL, NULL))

rowsum(my_matrix, as.integer(gl(nrow(my_matrix), 2, nrow(my_matrix))))
#   [,1] [,2] [,3] [,4]
# 1    2   13   23   33
# 2    7   27   47   67
# 3   11   31   51   71
# 4   15   35   55   75
# 5   19   39   59   79

答案 1 :(得分:0)

将来,请确保提供一个可重现的数据示例,以使我们更容易理解!您可以展示如何创建虚拟数据(请参见下面的示例),或使用类似dput()的方式来生成数据的文本版本。

我注意到的几件事:

  1. 如果要像这样通过引用进行添加,则需要使输出矩阵具有适当的大小。像matrix(nrow = 500, ncol = 49)
  2. 如果您有1000行,并且希望将彼此加在一起,则实际上只希望进行500次加法。您的X的长度为1000,因此它将尝试查找比population中的最大行索引高的行。看看tail(X),您会发现它到1999年为止。
  3. 最后,您遍历每隔一个数字(1、3、5等)的向量,并将该向量用作行索引,因此要填充的矩阵将彼此之间有空白行,我想不是你想要的。 (如果我错了,请纠正我)。

这是一个带有我制作的一些虚拟数据的小例子。与您的示例相比,值得注意的变化是:

  1. 使输出矩阵具有所需的行数和列数(与population相同的列数和一半的行数)
  2. X的长度是nrow(population)的一半
  3. 在我的for循环中使用1:length(X)代替1:X

示例:

population <- matrix(1:400, byrow = F, ncol = 4)

sum <- matrix(nrow = nrow(population)/2, ncol = 4)
X <- seq(1, by = 2, len = nrow(population)/2)
for (i in 1:length(X)){
  sum[i,] <- population[ X[i] ] + population[ X[i]+1 ]
}