首页 > 解决方案 > 将具有不同长度的列表转换为R中的数据框或数据表

问题描述

我有一个列表列表。这些列表的长度不同。

listXYZ <- list(c("x1", "x2", "x3"),
                c("y1", "y2", "y3", "y4", "y5", "y6"),
                c("z1"))

我想将列表转换为用于打印的表格knitrxtable但我想避免使用plyr,因为我已经加载了 dplyr,并且不希望两者都可用的命令混淆(也不要写package::在所有内容的前面)。没有那个限制,我会使用

 plyr::ldply(listXYZ, rbind)

但我见过的最简单的非 plyr 等价物是

  do.call(rbind, listXYZ)

这通过重复较短的列表来替换空格,直到它达到最长列表的长度。较短列表中的空白应填写 NA,

由于列表长度不同,其他方法会导致错误消息,例如:

 In (function (..., deparse.level = 1)  :
 number of columns of result is not a multiple of vector length (arg 1)

有没有一种方法可以很好地扩展(对于更大的列表)?在我的例子中,列表总是有 5 行,但是列表的长度变化很大。

标签: r

解决方案


您遇到的问题可以通过更新长度属性来解决。

len <- max(lengths(listXYZ))
t(sapply(listXYZ, `length<-`, len))
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,] "x1" "x2" "x3" NA   NA   NA  
[2,] "y1" "y2" "y3" "y4" "y5" "y6"
[3,] "z1" NA   NA   NA   NA   NA 

来自文档:当一个向量被加长时,它会用 NAs 填充到它的新长度


推荐阅读