组合不同长度的(cbind)向量

Nic*_*ick 30 merge r list matrix

我有几个长度不等的向量,我想要cbind他们.我把矢量放到一个列表中,我试图结合使用do.call(cbind, ...):

nm <- list(1:8, 3:8, 1:5)
do.call(cbind, nm)

#      [,1] [,2] [,3]
# [1,]    1    3    1
# [2,]    2    4    2
# [3,]    3    5    3
# [4,]    4    6    4
# [5,]    5    7    5
# [6,]    6    8    1
# [7,]    7    3    2
# [8,]    8    4    3
# Warning message:
#   In (function (..., deparse.level = 1)  :
#         number of rows of result is not a multiple of vector length (arg 2)
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,结果矩阵中的行数是最长向量的长度,并且较短向量的值被再循环以弥补长度.

相反,我想用NA值填充较短的向量,以获得与最长向量相同的长度.我希望矩阵看起来像这样:

#      [,1] [,2] [,3]
# [1,]    1    3    1
# [2,]    2    4    2
# [3,]    3    5    3
# [4,]    4    6    4
# [5,]    5    7    5
# [6,]    6    8    NA
# [7,]    7    NA   NA
# [8,]    8    NA   NA
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?

Sac*_*amp 30

如果索引的数字超出了它返回的对象的大小,则可以使用索引NA.这适用于使用foo以下定义的任意数量的行:

nm <- list(1:8,3:8,1:5)

foo <- 8

sapply(nm, '[', 1:foo)
Run Code Online (Sandbox Code Playgroud)

编辑:

或者使用最大向量作为行数在一行中:

sapply(nm, '[', seq(max(sapply(nm,length))))
Run Code Online (Sandbox Code Playgroud)

R 3.2.0您可以使用lengths("获取列表中的每个元素的长度"),而不是sapply(nm, length):

sapply(nm, '[', seq(max(lengths(nm))))
Run Code Online (Sandbox Code Playgroud)

  • '['的意思是什么! (2认同)

Woj*_*ala 5

在调用do.call之前,你应该用NA填充向量.

nm <- list(1:8,3:8,1:5)

max_length <- max(unlist(lapply(nm,length)))
nm_filled <- lapply(nm,function(x) {ans <- rep(NA,length=max_length);
                                    ans[1:length(x)]<- x;
                                    return(ans)})
do.call(cbind,nm_filled)
Run Code Online (Sandbox Code Playgroud)