如何取消列列表?

时间:2018-04-18 00:16:37

标签: r tidyverse

我有一个像:

tibble(a = c('first', 'second'), 
       b = list(c('colA' = 1, 'colC' = 2), c('colA'= 3, 'colB'=2))) 

# A tibble: 2 x 2
  a      b        
  <chr>  <list>   
1 first  <dbl [2]>
2 second <dbl [2]>

想要变成这种形式:

# A tibble: 2 x 4
  a       colA  colB  colC
  <chr>  <dbl> <dbl> <dbl>
1 first     1.   NA     2.
2 second    3.    2.   NA 

我尝试使用unnest(),但是我遇到了从嵌套值中保留元素名称的问题。

2 个答案:

答案 0 :(得分:4)

你可以通过将列表列中的元素强制转换为你喜欢的数据框来实现这一点,这将是不可取的:

library(tidyverse)

tibble(a = c('first', 'second'), 
       b = list(c('colA' = 1, 'colC' = 2), c('colA'= 3, 'colB'=2))) %>% 
    mutate(b = invoke_map(tibble, b)) %>% 
    unnest()
#> # A tibble: 2 x 4
#>   a       colA  colC  colB
#>   <chr>  <dbl> <dbl> <dbl>
#> 1 first     1.    2.   NA 
#> 2 second    3.   NA     2.

执行强制操作有点棘手,因为您不希望最终得到2x1数据帧。有很多种方法,但直接路由是purrr::invoke_map,它会在列表中的每个元素上调用purrr::invoke(如do.call)函数。

答案 1 :(得分:0)

对于tidyr 1.0.0,我们可以使用unnest_wider直接添加新列。

tidyr::unnest_wider(df,b)
# A tibble: 2 x 4
#  a       colA  colC  colB
#  <chr>  <dbl> <dbl> <dbl>
#1 first      1     2    NA
#2 second     3    NA     2

数据

df <- tibble(a = c('first', 'second'), 
   b = list(c('colA' = 1, 'colC' = 2), c('colA'= 3, 'colB'=2)))