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)
在调用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)