将左边填充的行更改为右边填充的行

时间:2014-02-15 04:53:14

标签: r matrix padding

问题:我有nm - 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

1 个答案:

答案 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