我有一个像:
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()
,但我遇到了从嵌套值中保留元素名称的问题。
最佳答案
您可以通过将列表列中的元素强制为按您喜欢的方式排列的数据框来做到这一点,这将很好地取消嵌套:
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
)在列表中的每个元素上。
关于r - 如何取消嵌套列列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49889246/