问题:我有n
,m
- n by m
矩阵中的长度向量。
这些向量用NA
值填充左边。
示例:
x = matrix( 1:12, ncol=4 )
x[lower.tri(x)] = NA
print(x)
# [,1] [,2] [,3] [,4]
# [1,] 1 4 7 10
# [2,] NA 5 8 11
# [3,] NA NA 9 12
问题:什么是使行正确填充的有效方法?我的实际矩阵是4,000乘25,000。
我想要的是什么:
y = matrix( c( 1, 5, 9, 4, 8, 12,
7, 11, NA, 10, NA, NA ), ncol=4 )
print(y)
# [,1] [,2] [,3] [,4]
# [1,] 1 4 7 10
# [2,] 5 8 11 NA
# [3,] 9 12 NA NA
答案 0 :(得分:1)
以下是两个单行解决方案:
t(apply(x, 1, FUN=function(ii) c(ii[!is.na(ii)],ii[is.na(ii)])))
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 5 8 11 NA
[3,] 9 12 NA NA
matrix(apply(x, 1, FUN=function(ii) c(ii[!is.na(ii)],ii[is.na(ii)])),
byrow=T,ncol=4)
这里的想法只是查看每一行并找到NA沙子将它们移动到非NA的值后面(即!is.na
)。
第二个版本在我的机器上实际上稍快一些:
library(microbenchmark)
microbenchmark(
t(apply(x, 1, FUN=function(ii) c(ii[!is.na(ii)],ii[is.na(ii)]))),
matrix(apply(x, 1, FUN=function(ii) c(ii[!is.na(ii)],ii[is.na(ii)])),
byrow=T,ncol=4)
)
Unit: microseconds
min lq median uq max neval
58.159 61.152 62.2215 66.711 174.475 100
51.317 53.883 54.7380 57.731 127.863 100