我有几个长度不等的 vector ,我想对其进行cbind
。我将 vector 放入列表中,并尝试结合使用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)
不出所料,结果矩阵中的行数是最长 vector 的长度,较短 vector 的值将被回收以弥补该长度。
相反,我想用
NA
值填充较短的 vector ,以获得与最长的 vector 相同的长度。我希望矩阵看起来像这样:# [,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
我该怎么做呢?
最佳答案
您可以使用索引,如果索引的数字超出对象的大小,它将返回NA
。这适用于用foo
定义的任意数量的行:
nm <- list(1:8,3:8,1:5)
foo <- 8
sapply(nm, '[', 1:foo)
编辑:
或者在一行中使用最大的 vector 作为行数:
sapply(nm, '[', seq(max(sapply(nm,length))))
在
R 3.2.0
中,您可以使用lengths
(“获取列表中每个元素的长度”)代替sapply(nm, length)
:sapply(nm, '[', seq(max(lengths(nm))))
关于list - 合并(合并)不同长度的向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5531471/