解决数据框列中的列表列表

eme*_*hex 15 r tidyr

要删除数据框,我可以使用:

df <- data_frame(
    x = 1,
    y = list(a = 1, b = 2)
)

tidyr::unnest(df)
Run Code Online (Sandbox Code Playgroud)

但是,如何在数据框列内的列表中删除列表?

df <- data_frame(
    x = 1,
    y = list(list(a = 1, b = 2))
)
tidyr::unnest(df)
Run Code Online (Sandbox Code Playgroud)

错误:

每列必须是向量列表或数据帧列表[y]

ali*_*ire 16

purrr,这对列表很好,

library(purrr)

df %>% dmap(unlist)
## # A tibble: 2 x 2
##       x     y
##   <dbl> <dbl>
## 1     1     1
## 2     1     2
Run Code Online (Sandbox Code Playgroud)

这或多或少相当于

as.data.frame(lapply(df, unlist))
##   x y
## a 1 1
## b 1 2
Run Code Online (Sandbox Code Playgroud)

更新:

dmap已被弃用并转移到purrrlyr,这是一个有趣但功能不良的功能的家,现在会向你发出许多弃用警告.您可以将基本R惯用语翻译为tidyverse:

df %>% map(unlist) %>% as_data_frame()
Run Code Online (Sandbox Code Playgroud)

哪种情况适用于这种情况,但不适用于多行(这些方法面临的问题).一个更强大的解决方案可能是

library(tidyverse)

df %>% bind_rows(df) %>%    # make larger sample data
    mutate_if(is.list, simplify_all) %>%    # flatten each list element internally 
    unnest()    # expand
#> # A tibble: 4 × 2
#>       x     y
#>   <dbl> <dbl>
#> 1     1     1
#> 2     1     2
#> 3     1     1
#> 4     1     2
Run Code Online (Sandbox Code Playgroud)

  • dmap 似乎不在 purrr 中 (2认同)

Moo*_*per 5

这可以通过一个简单的步骤来完成,unnest_longer()因为tidyr 1.0.0

df <- tibble::tibble(
  x = 1,
  y = list(list(a = 1, b = 2))
)

library(tidyr)
unnest_longer(df,y,indices_include = FALSE)
#> # A tibble: 2 x 2
#>       x     y
#>   <dbl> <dbl>
#> 1     1     1
#> 2     1     2
Run Code Online (Sandbox Code Playgroud)

reprex 包(v0.3.0)于 2019 年 9 月 14 日创建