R,矩阵:逐行减去最大值,移除 NA
R, matrices: subtract maximum row-wise, removing NAs
给定一个非方矩阵 a
我需要从每一行中减去它自己的最大值。矩阵包含 NA
s,将被丢弃。矩阵的维度是预先知道的并且是固定的。此外,如果此信息有帮助,所有 NA
都在主对角线下,即 a
的形式为
a11 a12 a13 a14 ...
NA a22 a23 a24 ...
NA NA a33 a34 ...
...
目前我正在使用
a <- a - apply(a,1,function(x){max(x, na.rm=TRUE)})
(顺便提一下,它比 t(apply(a,1,function(x){x-max(x, na.rm=TRUE)}))
快)。
不知道有没有更快的解决办法,因为这个操作要重复很多次。
在 Whosebug 中,我找到了类似问题的答案,建议使用 pmax
,但这需要将矩阵转换为列表,我相信这会比我的解决方案慢得多。一些答案建议使用 dplyr
中的 rowwise
,但这似乎需要先将矩阵转换为数据框。
感谢您的建议!
我们可以尝试使用 matrixStats
包中的 rowMaxs
,通常速度更快
a - matrixStats::rowMaxs(a, na.rm = TRUE)
给定一个非方矩阵 a
我需要从每一行中减去它自己的最大值。矩阵包含 NA
s,将被丢弃。矩阵的维度是预先知道的并且是固定的。此外,如果此信息有帮助,所有 NA
都在主对角线下,即 a
的形式为
a11 a12 a13 a14 ...
NA a22 a23 a24 ...
NA NA a33 a34 ...
...
目前我正在使用
a <- a - apply(a,1,function(x){max(x, na.rm=TRUE)})
(顺便提一下,它比 t(apply(a,1,function(x){x-max(x, na.rm=TRUE)}))
快)。
不知道有没有更快的解决办法,因为这个操作要重复很多次。
在 Whosebug 中,我找到了类似问题的答案,建议使用 pmax
,但这需要将矩阵转换为列表,我相信这会比我的解决方案慢得多。一些答案建议使用 dplyr
中的 rowwise
,但这似乎需要先将矩阵转换为数据框。
感谢您的建议!
我们可以尝试使用 matrixStats
包中的 rowMaxs
,通常速度更快
a - matrixStats::rowMaxs(a, na.rm = TRUE)