【问题标题】:How to expand a data.frame containing a column with a list如何扩展包含带有列表的列的 data.frame
【发布时间】:2018-06-21 21:51:18
【问题描述】:

我有一个 data.frame,其中一列包含一个值列表:

d <- data.frame(id=1:2, parent=c("Jon", "Mark"))
d$children <-  list(c("Mary", "James"), c("Greta", "Sally"))

如何将此 data.frame 转换为以下结构:

target_df <- data.frame(id=1:4, parent=c("Jon", "Jon","Mark", "Mark"), children = c("Mary", "James","Greta", "Sally"))

【问题讨论】:

  • 您是否打算在翻译中丢失id?或者在这里id=rep(1:2,each=2) 更有意义?

标签: r dataframe


【解决方案1】:

您应该使用tidyr 中的unnest,或者您可以映射tidyverse,对不起,我已经映射了tidyverse .Rprofile 文件。总之

library(tidyverse) #or map library(tidyr) whatever suits you
d %>% 
  unnest(children) %>%
  mutate(id = 1:row_number()) #You may not want to run this if you want to keep your original id

也以 base R 方式:

d_new <- do.call('rbind', do.call('Map', c(data.frame, d)))

同样,要重置 id,我们必须使用1:nrow(d)

d_new$id <- 1:nrow(d) #This may not be required if you don't want to reset your id

感谢所有 cmets,他们都受到欢迎,是的,我不知所措。 感谢@Ronak Shah,@r2evans

【讨论】:

  • 这可能是 OP 需要,但它不会产生问题中当前列出的预期输出。在那里,@ 987654329@,并且没有澄清我建议反对@ 987654330@ 或类似的kludge。
  • 您可以使用管道将其导入mutate(id = row_number()) 以更正id 功能
  • ...@DaveGruenewald,这正是我建议 反对 做的事情(请参阅我的其他 cmets),因为它正在丢失信息。
  • @r2evans 啊,我提交的时候你编辑了你的。同意,您显然会丢失信息,但最终取决于 OP 的需求。
猜你喜欢
  • 2022-01-21
  • 1970-01-01
  • 2020-12-23
  • 2019-09-06
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
相关资源
最近更新 更多