R语言 如何“展开”一个列表栏?

kmbjn2e3  于 2024-01-03  发布在  其他
关注(0)|答案(3)|浏览(127)

考虑这个简单的例子

mydf <- data_frame(regular_col = c(1,2),
                   normal_col = c('a','b'),
                   weird_col = list(list('hakuna', 'matata'),
                                 list('squash', 'banana')))

> mydf
# A tibble: 2 x 3
  regular_col normal_col weird_col 
        <dbl> <chr>      <list>    
1           1 a          <list [2]>
2           2 b          <list [2]>

字符串
我想提取weird_col的元素(以编程方式,元素的数量可能会改变),以便将每个元素放置在不同的列中。

> data_frame(regular_col = c(1,2),
+           normal_col = c('a','b'),
+           weirdo_one = c('hakuna', 'squash'),
+           weirdo_two = c('matata', 'banana'))
# A tibble: 2 x 4
  regular_col normal_col weirdo_one weirdo_two
        <dbl> <chr>      <chr>      <chr>     
1           1 a          hakuna     matata
2           2 b          squash     banana


然而,我无法用简单的术语来做到这一点。例如,使用经典的unnest在这里就失败了,因为它扩展了嵌套框架,而不是将列表中的每个元素放在不同的列中。

> mydf %>% unnest(weird_col)
# A tibble: 4 x 3
  regular_col normal_col weird_col
        <dbl> <chr>      <list>   
1           1 a          <chr [1]>
2           1 a          <chr [1]>
3           2 b          <chr [1]>
4           2 b          <chr [1]>


tidyverse中是否有解决方案?

ztigrdn8

ztigrdn81#

您可以从unnest的输出中提取值,稍微处理一下以生成列名,然后返回spread。请注意,我使用flatten_chr是因为您的深度为1的列表列,但如果它是嵌套的,您可以使用flatten,而spread也可以在列表列上工作。

library(tidyverse)
#> Warning: package 'dplyr' was built under R version 3.5.1
mydf <- data_frame(
  regular_col = c(1, 2),
  normal_col = c("a", "b"),
  weird_col = list(
    list("hakuna", "matata"),
    list("squash", "banana")
  )
)
mydf %>%
  unnest(weird_col) %>%
  group_by(regular_col, normal_col) %>%
  mutate(
    weird_col = flatten_chr(weird_col),
    weird_colname = str_c("weirdo_", row_number())
    ) %>% # or just as.character
  spread(weird_colname, weird_col)
#> # A tibble: 2 x 4
#> # Groups:   regular_col, normal_col [2]
#>   regular_col normal_col weirdo_1 weirdo_2
#>         <dbl> <chr>      <chr>    <chr>   
#> 1           1 a          hakuna   matata  
#> 2           2 b          squash   banana

字符串
reprex package(v0.2.0)于2018-08-12创建。

rqdpfwrv

rqdpfwrv2#

unnest垂直开发列表和向量,水平开发一行数据框。所以我们可以做的是将您的列表更改为数据框(具有足够的列名),然后再使用unnest

mydf %>% mutate(weird_col = map(weird_col,~ as_data_frame(
  setNames(.,paste0("weirdo_",1:length(.)))
  ))) %>% 
  unnest

# # A tibble: 2 x 4
#   regular_col normal_col weirdo_1 weirdo_2
#         <dbl>      <chr>    <chr>    <chr>
# 1           1          a   hakuna   matata
# 2           2          b   squash   banana

字符串

h7appiyu

h7appiyu3#

tidyr 1.0引入unnest_wider()正是为了这个目的。

library(dplyr)
library(tidyr)

mydf <- data_frame(regular_col = c(1,2),
                   normal_col = c('a','b'),
                   weird_col = list(list('hakuna', 'matata'),
                                    list('squash', 'banana')))

mydf %>% unnest_wider(weird_col, names_sep = '_')
#> # A tibble: 2 × 4
#>   regular_col normal_col weird_col_1 weird_col_2
#>         <dbl> <chr>      <chr>       <chr>      
#> 1           1 a          hakuna      matata     
#> 2           2 b          squash      banana

字符串
创建于2023-12-15使用reprex v2.0.2

相关问题