我有几个不等长的向量,我想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)
正如预期的那样,结果矩阵中的行数是最长向量的长度,并且较短向量的值被回收以弥补长度。
相反,我想用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
我该怎么做呢?
6条答案
按热度按时间v7pvogib1#
你可以使用索引,如果你索引一个超过对象大小的数字,它会返回
NA
。这适用于任何用foo
定义的任意数量的行:编辑:
或者在一行中使用最大向量作为行数:
在
R 3.2.0
中,你可以使用lengths
(“获取列表中每个元素的长度”)来代替sapply(nm, length)
:cbeh67ev2#
在调用do.call之前,应该用NA填充vectors。
n1bvdmb63#
这是Wojciech解决方案的简化版本。
nbnkbykc4#
下面是使用
stri_list2matrix
fromstringi
的选项ocebsuys5#
迟到了,但您可以将
rowr
包中的cbind.fill
与fill = NA
一起使用如果您有一个命名的
list
,并且希望维护头文件,则可以使用setNames
cbeh67ev6#
你必须使用
length<-
使所有列表元素具有相同的长度,然后你可以使用cbind
得到一个矩阵。基准
在这种情况下,使用
length<-
比[
快4倍。