【问题标题】:Splitting a list column into an entry per column将列表列拆分为每列一个条目
【发布时间】:2019-03-29 18:52:26
【问题描述】:

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

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

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

但这需要一些额外的清理,我认为这不是一般情况。有没有办法一举搞定?

【问题讨论】:

  • 您可以使用map 循环浏览列表。但是,您想要的 NA 尚不清楚
  • NA 将是出现在少于最大数量 (7) 部电影中的角色的值

标签: r list dplyr nested tidyr


【解决方案1】:

“电影”列是 list 中的 vectors。如果我们想创建具有 7 列的 data.frame,即“电影”的 maximum length 并将其存储为 list,请将 length 分配给整个列的最大长度,将其转换为 @ 987654328@

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' 列,将其转换为 n map 内的 tibble,与除 'films' 之外的 'starwars' 列绑定

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

【讨论】:

  • 这几乎与我想要的相反。我想要一个名为 A 的列,其值为克隆人的攻击,一个名为 B 的列,其值为西斯的复仇......。不过感谢您的快速回复!
  • @RayVelcoro 与您想要的相反。
  • 我想在名为 A, B, ... 的星球大战数据集中添加一列,其中包含已分解的电影值。我已经编辑了帖子以反映这一点。
  • @RayVelcoro 我更新了这两个解决方案,希望现在能有所帮助
  • 后面的 pull 正是我想要的。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 2019-10-12
相关资源
最近更新 更多