我在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列。
很抱歉,如果这是一个基本问题或已经解决,我是一个初学者。先感谢您!
答案 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()
的方式来生成数据的文本版本。
我注意到的几件事:
matrix(nrow = 500, ncol = 49)
X
的长度为1000,因此它将尝试查找比population
中的最大行索引高的行。看看tail(X)
,您会发现它到1999年为止。这是一个带有我制作的一些虚拟数据的小例子。与您的示例相比,值得注意的变化是:
population
相同的列数和一半的行数)nrow(population)
的一半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 ]
}