r - 在 R 中展平嵌套列表并选择数据

标签 r list

我的数据以大量嵌套列表的形式出现,看起来像这样,但要大得多:

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/

相关文章:

r - 在 r 中,如何按组对多个数字列中的最低数值进行排序?

r - 了解R的mle2函数及其参数

MySql 查询 - 查找数据库中缺少的内容

c - <0xC0000005> 插入链表时出错

python - python 列表中的 Writerows - 如何删除括号和撇号

Python 递归 no 'in' 解决方法

r - 具有交互变量的非比例风险 (Cox) 模型的计数过程数据集

r - 如何使用shinyjs一次隐藏/显示多个元素?

r - 从原始矩阵中选择奇数行和奇数列

r - 如何从 get_friends 函数返回的 tibbles 列表中删除空的 tibbles?