【问题标题】:Un-nesting lists within a tibble list column在 tibble 列表列中取消嵌套列表
【发布时间】:2018-05-18 12:48:26
【问题描述】:

我有一个带有列表列的小标题,其中每个元素都包含一个长度为 2 的列表。我尝试使用 unlist()unnest()flatten() 和其他各种组合,但没有运气得到我想要的结果。

一个最小的工作示例如下:

df <- tibble(x = c('A', 'B'),
         preds = list(list(Phi = data.frame(time = 1:2, estimate = c('y1', 'y2')),
                           p = data.frame(time = 1:2, estimate = c('y3', 'y4'))),
                      list(Phi = data.frame(time = 1:2, estimate = c('y5', 'y6')),
                           p = data.frame(time = 1:2, estimate = c('y7', 'y8')))))

预期结果:

output <- tibble(x = rep(c('A', 'B'), each = 4),
             grp = c(rep(c('Phi', 'p'), each = 2 ), rep(c('Phi', 'p'), each = 2 )),
             time = rep(1:2, 4),
             estimate = c('y1', 'y2', 'y3', 'y4', 'y5', 'y6', 'y7', 'y8'))

下面的代码让我分道扬镳,我可以轻松地包含其他列,但它不正确。

df$preds %>% flatten_df()

经过一天的谷歌搜索后,我仍然卡住了。请指出我的方向......非常感谢!!!

【问题讨论】:

  • 试试df %&gt;%mutate(preds = map(preds, bind_rows, .id = 'grp')) %&gt;%unnest
  • @KevinArseneau 无意冒犯你。我只是觉得这不是一个完整的答案

标签: r dplyr purrr


【解决方案1】:

在 akrun 已经很好的答案的基础上,我提供以下内容。

library(tidyr)
library(dplyr)

df %>%
  mutate(
    preds = lapply(
      preds, lapply, mutate, estimate = as.character(estimate)
    ) %>%
    lapply(bind_rows, .id = "grp")
  ) %>%
  unnest

# # A tibble: 8 x 4
#       x   grp  time estimate
#   <chr> <chr> <int>    <chr>
# 1     A   Phi     1       y1
# 2     A   Phi     2       y2
# 3     A     p     1       y3
# 4     A     p     2       y4
# 5     B   Phi     1       y5
# 6     B   Phi     2       y6
# 7     B     p     1       y7
# 8     B     p     2       y8

注意 唯一的改进是将estimate 从因子转换为字符。否则,如果可以在源数据中解决这个问题,akrun 的地图解决方案会更简洁,更容易推理。

【讨论】:

    猜你喜欢
    • 2019-08-07
    • 1970-01-01
    • 2022-07-07
    • 2022-01-11
    • 2021-04-25
    • 2021-03-20
    • 1970-01-01
    • 2018-09-28
    • 2016-12-16
    相关资源
    最近更新 更多