【问题标题】:Select one data point per row using indexing vector with negative values使用带负值的索引向量每行选择一个数据点
【发布时间】:2019-12-18 23:38:56
【问题描述】:

假设你有一个矩阵a

a <- matrix(1:9, 3, 3)
a
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

和一个向量b 指示您要提取的每一行的哪个元素。即向量b表示元素所在的列,例如:

b <- c(1, 3, 1)

如果我们想提取指定的数据点,我们可以像这样简单地索引每个所需的元素:

a[cbind(1:nrow(a),b)]
[1] 1 8 3

我想用一个负索引向量来做。也就是说,R 应该返回一个矩阵,其中每行恰好省略一个元素(在本例中为 3x2 矩阵)。如果我以一种天真的方法尝试它,R 会抛出一个错误:

c = -b
a[cbind(1:nrow(a),c)]
Error in a[cbind(1:nrow(a), c)] : 
  negative values are not allowed in a matrix subscript

谢谢!

【问题讨论】:

  • 在什么意义上省略?替换为 NA、空格、某个数字?
  • 空白空间,我想输入我的 3x3 矩阵并得到一个 3x2 矩阵作为输出,其中在每一行中,向量 b 中指示的元素被省略。

标签: r matrix indexing


【解决方案1】:

也许这是另一种幼稚的做法。我们遍历矩阵中的每一行并删除b中指定的索引。

t(sapply(seq_len(nrow(a)), function(x) a[x, -b[x]]))

#     [,1] [,2]
#[1,]    4    7
#[2,]    2    5
#[3,]    6    9

或者使用mapplysplit

t(mapply(`[`, split(a, seq_len(nrow(a))), -b))

【讨论】:

    【解决方案2】:

    不漂亮,但你可以做到

    b <- c(1, 3, 1) + 3 * 0:2
    matrix(c(t(a))[-b], 3, 2, byrow = TRUE)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-18
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      相关资源
      最近更新 更多