首页 > 解决方案 > 将列表列拆分为每列一个条目

问题描述

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

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

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    ...

但这需要一些额外的擦洗,我不认为这是普遍的。有没有办法一口气做到这一点?

标签: rlistdplyrnestedtidyr

解决方案


“电影”列是lists的一个vector。如果我们想创建data.frame7 列,即“电影”的max最大数并将其存储为 ,则将整个列的最大长度分配给lengthlistlengthdata.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'films' 列,将其转换为tibblen 内map,与除 'films' 之外的 'starwars' 列绑定

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

推荐阅读