我的数据以大量嵌套列表的形式出现,看起来像这样,但要大得多:
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()?)将此列表列表转换为仅包含选定数据的数据帧列表?
我正在寻找这样的结果:
$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
提前非常感谢您!
最佳答案
如果我们只想使用tidyverse
,则使用map
循环到内部嵌套层,提取感兴趣的元素('info','parameters'),转换为 tibble,删除“color”列,将它们绑定(bind)在每个嵌套层中 (_dfr
)
library(dplyr)
library(purrr)
map(data_in, ~
map_dfr(.x, ~ .x[c("info", "parameters")] %>%
map_dfc(as_tibble_row)) %>% select(-color))
或者使用递归函数(rrapply
)提取元素并转换为tibble
(因为它是一个命名向量),然后在内层绑定(bind)数据集,在使用 map
library(rrapply)
library(tidyr)
rrapply(data_in, condition = \(x, .xname) .xname %in%
c("info", "parameters"), as_tibble_row, how = "prune" ) %>%
map(~ bind_rows(.x) %>%
unnest(where(is.list)) %>%
select(-color))
-输出
$a
# A tibble: 3 × 4
ID treatment v d
<chr> <chr> <dbl> <dbl>
1 C.1 C 2 2
2 C.2 C 2 2
3 L.1 L 2 2
$b
# A tibble: 3 × 4
ID treatment v d
<chr> <chr> <dbl> <dbl>
1 C.1 C 2 2
2 C.2 C 2 2
3 L.1 L 2 2
$c
# A tibble: 3 × 4
ID treatment v d
<chr> <chr> <dbl> <dbl>
1 C.1 C 2 2
2 C.2 C 2 2
3 L.1 L 2 2
关于r - 在 R 中展平嵌套列表并选择数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75512203/