r语言 - 将一列列表嵌套到 tidyr 中的许多列



例如,我有一个像这样的整洁数据框:

df <- tibble(id=1:2,
ctn=list(list(a="x",b=1),
list(a="y",b=2)))
# A tibble: 2 x 2
id        ctn
<int>     <list>
1     1 <list [2]>
2     2 <list [2]>

如何ctn列向右取消嵌套,以便数据框如下所示:

# A tibble: 2 x 3
id     a     b
<int> <chr> <dbl>
1     1     x     1
2     2     y     2

带有dplyrpurrr

df %>% 
mutate(ctn = map(ctn, as_tibble)) %>%
unnest()
# A tibble: 2 x 3
id     a     b
<int> <chr> <dbl>
1     1     x     1
2     2     y     2

一个选项是

library(data.table)
setDT(df)[, unlist(ctn, recursive = FALSE), id]
#   id a b
#1:  1 x 1
#2:  2 y 2

或与tidyr

library(tidyverse)
df$ctn %>%
setNames(., df$id) %>%
bind_rows(., .id = 'id')
# A tibble: 2 x 3
#   id     a     b
#  <chr> <chr> <dbl>
#1     1     x     1
#2     2     y     2

我们现在可以使用rowwise()以下命令(dplyr1.0.2及以上(以整洁的方式执行此操作:

df %>% rowwise() %>% mutate(as_tibble(ctn))
# A tibble: 2 x 4
# Rowwise: 
id ctn              a         b
<int> <list>           <chr> <dbl>
1     1 <named list [2]> x         1
2     2 <named list [2]> y         2

坚持purrr我们还可以:

df %>% mutate(map_dfr(ctn, as_tibble))
# A tibble: 2 x 4
id ctn              a         b
<int> <list>           <chr> <dbl>
1     1 <named list [2]> x         1
2     2 <named list [2]> y         2

最新更新