我的数据以大量嵌套列表的形式出现,这些列表看起来像这样,但要大得多:
data_in <-list(a=list(list(info=c(ID="C.1", treatment="C", color="green"), parameters=c(v=2, d=2), data=mtcars),
list(info=c(ID="C.2", treatment="C", color="green"), parameters=c(v=2, d=2), data=mtcars),
list(info=c(ID="L.1", treatment="L", color="green"), parameters=c(v=2, d=2), data=mtcars)),
b=list(list(info=c(ID="C.1", treatment="C", color="green"), parameters=c(v=2, d=2), data=mtcars),
list(info=c(ID="C.2", treatment="C", color="green"), parameters=c(v=2, d=2), data=mtcars),
list(info=c(ID="L.1", treatment="L", color="green"), parameters=c(v=2, d=2), data=mtcars)),
c=list(list(info=c(ID="C.1", treatment="C", color="green"), parameters=c(v=2, d=2), data=mtcars),
list(info=c(ID="C.2", treatment="C", color="green"), parameters=c(v=2, d=2), data=mtcars),
list(info=c(ID="L.1", treatment="L", color="green"), parameters=c(v=2, d=2), data=mtcars)))
是否有一个优雅的解决方案(使用map()或unlist()?)将这个列表列表转换为只包含选定数据的 Dataframe 列表?
我期待的结果是这样的:
$a
ID treatment v d
1 C.1 C 2 2
2 C.2 C 2 2
3 L.1 L 2 2
$b
ID treatment v d
1 C.1 C 2 2
2 C.2 C 2 2
3 L.1 L 2 2
$c
ID treatment v d
1 C.1 C 2 2
2 C.2 C 2 2
3 L.1 L 2 2
先谢谢你了!
2条答案
按热度按时间hzbexzde1#
如果我们只想使用
tidyverse
,那么用map
循环到内部嵌套层,提取感兴趣的元素('info','parameters'),转换为tibble,删除'color'列,在每个嵌套层中绑定它们(_dfr
)或者使用递归函数(
rrapply
)提取元素并转换为tibble
(因为它是一个命名向量),然后绑定内层中的数据集,在使用map
循环外部列表时取消嵌套rta7y2nd2#
下面是另一种方法,首先使用
rrapply(..., how = "bind")
将嵌套列表转换为宽数据.frame,然后使用tidyr
进一步取消嵌套。使用base::split()
而不是dplyr::group_split()
的原因是base::split()
会自动命名数据. frame的输出列表,而dplyr::group_split()
不会。