将矩阵的每第3行放在一个新矩阵中

Kev*_*oth 4 r matrix

我想从更大的矩阵创建3个矩阵.新矩阵应包含:

  • 新矩阵1:1st, 4th, 7th....旧矩阵的元素
  • 新矩阵2:2nd, 5th, 8th....旧矩阵的元素
  • 新矩阵3:3rd, 6th, 9th....旧矩阵的元素

所以,如果我的矩阵看起来像这样:

    m<-matrix(c(1:3),nrow=12, ncol=2)
      [,1] [,2]
 [1,]    1    1
 [2,]    2    2
 [3,]    3    3
 [4,]    1    1
 [5,]    2    2
 [6,]    3    3
 [7,]    1    1
 [8,]    2    2
 [9,]    3    3
[10,]    1    1
[11,]    2    2
[12,]    3    3
Run Code Online (Sandbox Code Playgroud)

我用这样的for循环尝试了它

for(i in 1:4){
  m1<-m[i+3,]
  m2<-m[i+4,]
  m3<-m[i+5,]
}
Run Code Online (Sandbox Code Playgroud)

但这不仅不能给我第1 /第2 /第3行,而且也不会给我所有行.

必须有一种更优雅的方式来做到这一点.

Psi*_*dom 8

利用R中索引的循环规则:

m[c(T, F, F),]
#      [,1] [,2]
# [1,]    1    1
# [2,]    1    1
# [3,]    1    1
# [4,]    1    1

m[c(F, T, F),]
#      [,1] [,2]
# [1,]    2    2
# [2,]    2    2
# [3,]    2    2
# [4,]    2    2

m[c(F, F, T),]
#      [,1] [,2]
# [1,]    3    3
# [2,]    3    3
# [3,]    3    3
# [4,]    3    3
Run Code Online (Sandbox Code Playgroud)

当我们使用与矩阵的行数不同的向量索引矩阵时,这里具有较小长度的向量将循环直到它们的长度匹配,因此例如,第一种情况,实际的索引向量是扩展到c(T, F, F, T, F, F, T, F, F)将按预期获得第一,第四和第七行.第二种情况和第三种情况也是如此.


akr*_*run 5

我们可以用它seq来做到这一点.这对于大数据集来说会更快.

 m[seq(1, nrow(m), by =3),]
Run Code Online (Sandbox Code Playgroud)