1

我想将矩阵的每一行与向量进行比较,并从第i行生成第一个值的索引,该索引小于向量中的第i个值。矩阵的每一行中的值按降序排序。由于行数非常大,我正在寻找一个矢量化的解决方案,并希望避免循环并应用函数。

比如我想比较下面的矩阵M和向量v,那么输出应该是(3,2,3,NA)。

M = matrix(c(10.2,11.0,10,9.5,9.2,8.9,7.6,8.4,5.4,5.6,6.5,7.2),4,3)
M
     [,1] [,2] [,3]
[1,] 10.2  9.2  5.4
[2,] 11.0  8.9  5.6
[3,] 10.0  7.6  6.5
[4,]  9.5  8.4  7.2

v <- c(8.4,9.5,7.0,6.0)

The output should be (3,2,3,NA).

当我在 R 中使用 'which' 函数时,它适用于每一行但不是矢量化的。

which(M[2,]<v[2])[1]
2

which(M[3,]<v[3])[1]
3

谢谢!

4

2 回答 2

2
apply(M < v, 1, function(x) which(x)[1])
# [1]  3  2  3 NA
于 2020-12-13T17:27:48.017 回答
1

矢量化选项将是max.col

max.col(M < v, 'first') *NA^!rowSums(M < v)
#[1]  3  2  3 NA
于 2020-12-13T17:20:49.643 回答