有一个矩阵 Lambda
,它有 p
列和 n
行,对于每一行都希望将所有的值赋为0,除了第一列的值和其他列中最大的值(在避免第一列后的所有 p - 2
个最小值)。
目前我正在使用 for
循环来完成这个操作,如下所示:
set.seed(60)
(Lambda = matrix(sample.int(30),5))
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 19 20 27 18 15 25
[2,] 16 28 1 4 22 7
[3,] 2 10 8 23 3 12
[4,] 5 6 9 17 11 29
[5,] 26 30 24 13 14 21
m <- ncol(Lambda) - 2
for(ir in seq_len(nrow(Lambda))){
Lambda[ir, match(tail(sort(abs(Lambda[ir, 2:ncol(Lambda)]), decreasing = TRUE), m), Lambda[ir,])] <- 0
}
Lambda
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 19 0 27 0 0 0
[2,] 16 28 0 0 0 0
[3,] 2 0 0 23 0 0
[4,] 5 0 0 0 0 29
[5,] 26 30 0 0 0 0
好的,一行可以得到目标,但如果有很多行,就会出现问题。有没有不使用
for
循环的解决方案?它可能使用lapply
,但我不确定这是否真的有效。也许可以在将矩阵转换后使用data.table
?谢谢!