【问题标题】:Subset Matrix using a vector使用向量的子集矩阵
【发布时间】:2018-03-26 12:47:46
【问题描述】:

所以,我认为这可能是一个基本问题,但它就在这里。想象一下,我有以下矩阵:

> 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

我想要做的是使用这个向量对矩阵进行子集化。意思是,我想使用向量从矩阵中获取前五行,然后是接下来的五行,依此类推。我尝试使用子集函数,但无法使其工作(它给了我一个错误,说子集必须是逻辑的)。

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

【问题讨论】:

  • 如果您不介意强制使用数据框 split(as.data.frame(MatrixA), rep.int(seq_along(n), n))
  • @rarw,感谢您的帮助!

标签: r subset


【解决方案1】:

这是一种选择:

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

【讨论】:

  • 谢谢,这很有帮助,但它使接下来的步骤更加困难。干杯
  • 也许,如果n 很短(但是为什么不手动完成所有这些操作呢?)。否则使用 assign 和多个对象而不是列表通常是一种不好的做法。
  • 是的,我同意你关于使用assign和multiple对象的观点,但是这种方法会产生: > str(test) num [1:635, 1:4] 1 3 2 1 1 0 0 0 0 0 ...即它将所有五行的值强制转换为一列
  • 如果我理解正确您的意思,请查看更新; Map 不会简化结果。
  • 是的,你是对的。这解决了这个问题,并且它具有不创建多个对象的优点。基于此,我已将您的答案标记为正确答案。谢谢!
【解决方案2】:

作为一般响应,假设您有一个包含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],])

  }

所以,现在您只需拨打M1, 。 . . M4 以获取子矩阵

【讨论】:

  • 是的,这适用于我想要完成的任务!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
  • 2018-05-03
  • 2011-08-20
  • 2016-02-22
  • 2015-01-17
  • 1970-01-01
相关资源
最近更新 更多