将列表列分为每列一个条目

时间:2019-03-29 18:52:26

标签: r list dplyr nested tidyr

我想将列表列元素拆分为单独的列。

例如,在星球大战数据集中,

data("starwars")

我想要这个列表列(第7行中的条目)

c("Attack of the Clones", "Revenge of the Sith", "A New Hope")

要与电影的值一起分成A,B,C ...列

   A                          B                   C       D    ...
Attack of the Clones   Revenge of the Sith   A New Hope   NA   ...

我有点想办法做到这一点

starwars %>% separate(films, into= letters[1:7],sep = ",")

这将导致输出

       A                          B                   C             D     ...
c("Attack of the Clones"   "Revenge of the Sith"   "A New Hope")    NA    ...

但这将需要一些额外的清理,而且我认为这不是一般性的。有没有办法一口气做到这一点?

1 个答案:

答案 0 :(得分:1)

“电影”列是list中的vector个。如果我们要创建包含7列(即“电影”的data.framemax)的7列length并将其存储为list,请为length指定最大长度从整个列中将其转换为data.frame

library(tidyverse)
mx <- max(lengths(starwars$films))
starwars %>% 
   mutate(films = map(films, ~ `length<-`(.x, mx) %>% 
                  as.data.frame.list %>% 
                  set_names(LETTERS[seq_len(mx)]))) %>%
   unnest(films)

或者另一个选择是pull的“电影”列,将其转换为tibble中的map,并与“星球大战”的列绑定,除了“电影”

starwars %>% 
    pull(films) %>% 
    map_df(~ t(.x) %>% 
               as_tibble) %>%
    bind_cols(starwars %>% 
                 select(-films), .)