【问题标题】:Function to extract all list elements from a dataframe column into individual columns将数据框列中的所有列表元素提取到各个列中的函数
【发布时间】:2018-09-12 02:06:30
【问题描述】:

在时间序列列表列中使用purrr:map 后,我最终得到了一个 tibble 列表中的结果(我可能在这里有一些术语错误,但希望该示例能够解决问题)。是否可以在不指定每个列表元素名称的情况下将结果列表中的每一列提取为数据框列?

示例数据:

tmp <- tibble(col1 = c("A1", "A2") , 
              col2 = c("B1", "B2"), 
              col3 = list(
                  list(x = TRUE, b = list(data.frame(y1=c(1,2,3), y2=c(4,5,6)))), 
                  list(x = FALSE, b = list(data.frame(y1=c(1,2,3), y2=c(4,5,6))))))

所需的输出(但不必键入每一列 - 实际上我还有很多):

tmp %>% mutate(x = map(tmp$col3, "x")[[1]],
               b = map(tmp$col3, "b")[[1]])

编辑:我已经意识到我上面的“手动解决方案”是错误的.. 我不确定如何手动提取 b,但对于 x,它应该是:

tmp %>% mutate(x = map_lgl(col3, "x"))

【问题讨论】:

  • Base R 咒语如果有人感兴趣,也可以这样做 - tmp &lt;- cbind(tmp, do.call(Map, c(rbind,tmp$col3)))
  • 获得正确结果的替代方法的知识总是很有趣(至少对我来说)!谢谢 - 我认为我以前没有使用过 Map 或 do.call ......还有其他东西可以处理(除了 purrr 的工作原理)

标签: r purrr


【解决方案1】:

一种方法是先将列表列 (col3) 的每一行转换为 tibble,然后再取消嵌套结果

library(tidyverse)
tmp %>% mutate(new_col = map(col3, as_tibble)) %>% unnest(new_col)

#> # A tibble: 2 x 5
#>   col1  col2  col3       x     b                   
#>   <chr> <chr> <list>     <lgl> <list>              
#> 1 A1    B1    <list [2]> TRUE  <data.frame [3 × 2]>
#> 2 A2    B2    <list [2]> FALSE <data.frame [3 × 2]>

【讨论】:

  • 请问,你是怎么知道的/有推荐的参考资料吗?
  • 我能想到的最好的参考资料是 Jenny Bryan 的面向行的工作流材料,它展示了在不同情况下使用嵌套/取消嵌套是如何有用的 (github.com/jennybc/row-oriented-workflows)。我真的只是通过经常使用 tidyr 和 purrr 包才知道这一点,所以可能有比这更好/更惯用的解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
  • 2021-11-30
  • 2022-07-31
  • 1970-01-01
相关资源
最近更新 更多