我想要矢量化(apply)矩阵X上的which操作,如下面的for循环所示,其结果是向量ind
X = matrix( 1:20, 4, 5 )
V = sample( 1:20, 4 )
ind = numeric()
for( i in 1:nrow(X) ) ind[i] = max( c(0, which(X[i,] < V[i]) ))该操作在ind中返回X中每一行的索引,该元素的最高值小于V的X行对应元素所指示的值。
操作max将所有合格索引的向量映射到标量。或者,我会很高兴地看到一个操作返回,例如,所有索引的list (我可以lapply max)。
发布于 2020-02-06 15:05:19
如果矩阵的值增加了,就像你所分享的例子(当然,我对此表示怀疑),但是如果它增加了,你可以简单地做,
rowSums(X < V)
#[1] 4 3 4 0但是,如果不是这样的话,那么一个简单的apply就足够了。
apply(X < V, 1, function(i)max(which(i)))
#[1] 4 3 4 -Inf请记住,所有的数学运算都是矢量化的,所以<是矢量化的。
您可以像往常一样替换-Inf
发布于 2020-02-06 15:06:53
apply(
(X < V) * X
, 1
, which.max
)发布于 2020-02-06 14:59:26
下面是一个简单的示例
X = matrix( 1:20, 4, 5 )
V = sample( 1:20, 4 )
ind = numeric()
for( i in 1:nrow(X) ) ind[i] = max( c(0, which(X[i,] < V[i]) ))
mymax = function(matrix, sample) {
whichlist = which(matrix < sample)
max(0, whichlist)
}
ind2 = unlist(lapply(1:nrow(X), function(r) mymax(X[r,], V[r])))
identical(ind, ind2)
# [1] TRUEhttps://stackoverflow.com/questions/60097628
复制相似问题