我有一个像:
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()
,但是我遇到了从嵌套值中保留元素名称的问题。
答案 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)))