首页 > 解决方案 > 将嵌套列表转换为 data.frame

问题描述

我有一个嵌套列表l,每个项目都是一个 2 级列表。例如:

l1 = list("a", list("a1"= "a1v"))
l2 = list("b", list("b1" = "b1v", b2 = "b2v"))
l3 = list("c", list("c1" = c("c1v1", "c1v2", "c1v3")))
l = list(l1, l2, l3)

如何将其转换为这样的 data.frame:

df = data.frame(A = c("a", "b", "b", "c", "c", "c"), B= c("a1", "b1", "b2", "c1", "c1", "c1"), C=c("a1v", "b1v", "b2v", "c1v1", "c1v2", "c1v3"))

> df
  A  B    C
1 a a1  a1v
2 b b1  b1v
3 b b2  b2v
4 c c1 c1v1
5 c c1 c1v2
6 c c1 c1v3

尝试过seperate_rowsmap_df但都未能处理不一致的.x[[2]]物品尺寸。

更新1:

@akrun 的解决方案不适合我: 在此处输入图像描述

标签: rtidyverse

解决方案


如果您问题中的样本数据准确地反映了您的实际数据,您可以尝试以下方法之一:

library(data.table)
data.table(l)[, list(names(unlist(l)), 
                     unlist(l, use.names = FALSE))][
                       , V3 := V2[1], cumsum(V1 == "")][V1 != ""]
##     V1   V2 V3
## 1:  a1  a1v  a
## 2:  b1  b1v  b
## 3:  b2  b2v  b
## 4: c11 c1v1  c
## 5: c12 c1v2  c
## 6: c13 c1v3  c

reshape2::melt(setNames(lapply(l, "[[", -1), lapply(l, "[[", 1)))
##   value L2 L1
## 1   a1v a1  a
## 2   b1v b1  b
## 3   b2v b2  b
## 4  c1v1 c1  c
## 5  c1v2 c1  c
## 6  c1v3 c1  c

推荐阅读