R 使用向量的子集矩阵

R 使用向量的子集矩阵,r,subset,R,Subset,所以,我认为这可能是一个基本的问题,但问题来了。假设我有以下矩阵: > str(MatrixA) num [1:20, 1:127] 1 3 2 1 1 2 2 4 1 2 ... 基本上是一个有20行127列的矩阵,每个条目都是一个正整数。我还有以下向量: > n [1] 5 5 5 5 我想做的是用这个向量来子集矩阵。意思是,我想用向量从矩阵中得到前五行,然后是下五行,依此类推。我试图使用subset函数,但无法使其正常工作(它给了我一个错误,即子集必须是逻辑的) 任何帮助都

所以,我认为这可能是一个基本的问题,但问题来了。假设我有以下矩阵:

> str(MatrixA)
num [1:20, 1:127] 1 3 2 1 1 2 2 4 1 2 ...
基本上是一个有20行127列的矩阵,每个条目都是一个正整数。我还有以下向量:

> n
[1] 5 5 5 5
我想做的是用这个向量来子集矩阵。意思是,我想用向量从矩阵中得到前五行,然后是下五行,依此类推。我试图使用subset函数,但无法使其正常工作(它给了我一个错误,即子集必须是逻辑的)

任何帮助都将不胜感激,谢谢

这里有一个选项:

M <- matrix(rnorm(2 * 5), nrow = 5, ncol = 2)
n <- c(2, 1, 2)
Map(function(i, j) M[(i - j + 1):i, , drop = FALSE], cumsum(n), n)
# [[1]]
#            [,1]       [,2]
# [1,] -0.2080075 -0.0146956
# [2,] -1.5513436  0.2253790
#
# [[2]]
#        [,1]       [,2]
# [1,] 0.8447 -0.4891574
#
# [[3]]
#           [,1]       [,2]
# [1,] 0.4916745  1.4980913
# [2,] 0.4789787 -0.3118559
M这里有一个选项:

M <- matrix(rnorm(2 * 5), nrow = 5, ncol = 2)
n <- c(2, 1, 2)
Map(function(i, j) M[(i - j + 1):i, , drop = FALSE], cumsum(n), n)
# [[1]]
#            [,1]       [,2]
# [1,] -0.2080075 -0.0146956
# [2,] -1.5513436  0.2253790
#
# [[2]]
#        [,1]       [,2]
# [1,] 0.8447 -0.4891574
#
# [[3]]
#           [,1]       [,2]
# [1,] 0.4916745  1.4980913
# [2,] 0.4789787 -0.3118559

M作为一般响应,假设您有一个包含
nrow
行的矩阵,并且您希望按每个
k
行生成子集。然后,您可以使用以下代码:

# A sequence until `nrow` every `k` units
  s <- seq(0, nrow, by = k)
# Every, . . . (5 rows)
  k <- 5
# Build M1, . . ., Mk sub-matrices
  for (i in 1:ceiling(nrow/k)){
     assign(paste("M",i,sep ="") ,M[(s[i] + 1): s[i+1],])

  }
#直到每'k'个单位'nrow'的序列

s作为一般响应,假设您有一个包含
nrow
行的矩阵,并且您希望按每个
k
行生成子集。然后,您可以使用以下代码:

# A sequence until `nrow` every `k` units
  s <- seq(0, nrow, by = k)
# Every, . . . (5 rows)
  k <- 5
# Build M1, . . ., Mk sub-matrices
  for (i in 1:ceiling(nrow/k)){
     assign(paste("M",i,sep ="") ,M[(s[i] + 1): s[i+1],])

  }
#直到每'k'个单位'nrow'的序列

如果您不介意强制执行数据帧拆分(如.data.frame(MatrixA),rep.int(seq_-along(n),n))
@rarw,谢谢您的帮助!如果您不介意强制执行数据帧拆分(如.data.frame(MatrixA),rep.int(seq_-along(n),n))
@rarw,谢谢您的帮助!谢谢,这很有帮助,但它使下一步更加困难。如果
n
很短(那么为什么不手动执行这些操作呢?)。否则,使用
assign
和多个对象而不是列表通常是一种不好的做法。是的,我同意您对assign和多个对象的使用,但这种方法会产生:>str(test)num[1:635,1:4]1 3 2 1 0 0 0 0。。。i、 e.它将所有五行的值强制转换为一列。如果我正确理解您的意思,请参阅更新<代码>映射
不会简化结果。是的,您是正确的。这就解决了问题,它的优点是不创建多个对象。基于此,我已将你的答案标记为正确答案。谢谢谢谢,这很有帮助,但它使下一步更加困难。如果
n
很短(那么为什么不手动执行这些操作呢?)。否则,使用
assign
和多个对象而不是列表通常是一种不好的做法。是的,我同意您对assign和多个对象的使用,但这种方法会产生:>str(test)num[1:635,1:4]1 3 2 1 0 0 0 0。。。i、 e.它将所有五行的值强制转换为一列。如果我正确理解您的意思,请参阅更新<代码>映射
不会简化结果。是的,您是正确的。这就解决了问题,它的优点是不创建多个对象。基于此,我已将你的答案标记为正确答案。谢谢是的,这对我来说就是我想要完成的事情!谢谢你是的,这是我想要完成的!非常感谢。