将列表转换为数据框

时间:2019-02-07 22:01:15

标签: r xml list loops dataframe

我有一系列复杂的列表,我试图将其转换为R中的数据帧格式。每个列表将分别转换为一个数据帧。某些列表的某些值为空白,因此很难将列表转换为数据框。

我尝试了lapply / sapply来找到列表的最大长度,但都没有用。此外,使用do.call和unlist不会以我想要的格式提供数据(丢失列标题并将表格式化为三列,而不是许多列)。我发现以下代码可用于前5个列表:

max_list<-max(rapply(List, length))
df<-as.data.frame(rapply(List, function(x) 'length<-'(x, max_list), how="list"))

但是,当我尝试对所有列表进行循环应用时,出现以下错误。

Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,  : arguments imply differing number of rows: 3, 0

我的最终目标是将列表中缺少值的部分转换为“ NA”。

我可以添加一些代码来避免该错误吗?还是我还有其他方法可以转换行数不同的那些列表?

编辑:

我无法在线输入输入的确切代码,但是列表是嵌套的,非常复杂。

示例输入:

iter1 <- list(item1 = 1, item2 = "a",item3="b")
iter2 <- list(item1 = 2, item2 = "c")
List <- list(iter1 = iter1, iter2 = iter2)

理想情况下,我希望将此输出作为数据框:

V1     V2     V3     V4     V5
1      a      b      2      c

如上所述,我能够通过上面的代码获得此结果。但是,我不确定将代码应用于更复杂的列表后为什么会失败。

1 个答案:

答案 0 :(得分:0)

您可以使用unlist和参数recursive = T

df <- data.frame(as.list(unlist(x = List, recursive = T, use.names = F)))
names(df) <- paste0("V", 1:ncol(df))
df

  V1 V2 V3 V4 V5
1  1  a  b  2  c

为了便于阅读:

library(dplyr)

unlist(x = List, recursive = T, use.names = F) %>%
  as.list() %>%
  data.frame() %>%
  setNames(nm = paste0("V", 1:ncol(.)))

  V1 V2 V3 V4 V5
1  1  a  b  2  c