【问题标题】:Subset a matrix according to a columns vector根据列向量对矩阵进行子集
【发布时间】:2015-01-17 09:11:25
【问题描述】:

我有一个矩阵 H。我想从每一行中选择一个值,从向量 P 中选择列。

H = matrix(data=runif(6),ncol=2)
P = c(2,1,2)

我所追求的输出是一个包含

的向量
c(H[1,P[1]],H[2,P[2]],H[3,P[3]])

我正在处理更大的数据,因此采用通用方法会很好。

这工作 diag(H[,P]),但是:a) 我不明白为什么 H[,P] 返回一个方阵,并且 b) 我宁愿不使用额外的函数(在这种情况下是 diag)。

如果之前有人问过这个问题,我深表歉意。

【问题讨论】:

  • diag(H[,P]) 有效,因为它在调用 diag 之前将列添加到 P 的长度,这在大型矩阵上效率会降低。下面大卫的回答非常好。

标签: r matrix


【解决方案1】:

试试

H[cbind(seq_len(nrow(H)), P)]
## [1] 0.6733731 0.7396847 0.5953580

这里我们按P中指示的连续行和列进行索引


关于您的问题,H[, P] 返回矩阵的原因是因为您告诉 R:

从矩阵“H”中选择列中的所有行:2、1、2

因此,您得到的结果是一个具有相同第一列和第三列的矩阵。

【讨论】:

  • 谢谢。一个简单的速度测试表明,这种方法比 diag(H[,P])
  • 1:dim(H)[2] 的速度大约是 seq_len(nrow(H)) 的两倍
  • 数据集的大小是多少?
  • 试试这个:rm(list= ls() )H = array(data=0, dim=c(10e3,10e3))system.time( for(loop in 1:10e4) 1:dim(H)[2])system.time( for(loop in 1:10e4) seq_len(nrow(H)))H = array(data=0, dim=c(10e1,10e1))H = array(data=0, dim=c(10e1,10e1))system.time( for(loop in 1:10e6) 1:dim(H)[2])system.time( for(loop in 1:10e6) seq_len(nrow(H)))
【解决方案2】:

这可行,但是:a)我不明白为什么 H[,P] 返回一个正方形 矩阵,

H[,P] 返回一个方阵,因为 P 是一个长度为 3 的向量。在这里,您基本上是说您希望再次返回包含第 2、1 和 2 列的矩阵。

如果你想要一个单一的值,那么你也需要传递一行。如果您希望它随机选择一行或给它一个特定的行,您可以传递一个随机数或其他东西。例如,第 1 行:

H[1,P]

或随机(但在整个矩阵中相同)行:

H[floor(runif(1, 1, dim(H)[1])),P]

【讨论】:

  • 感谢您。我试过 h[1:3,P] 希望这会给我想要的结果,但它没有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
  • 2016-12-25
  • 1970-01-01
  • 2021-03-26
  • 2018-03-01
  • 1970-01-01
相关资源
最近更新 更多