在tibble列列

时间:2017-12-04 23:40:10

标签: r dplyr purrr

我有一个列表列,其中每个元素都包含一个长度为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'))

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

df$preds %>% flatten_df()

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

1 个答案:

答案 0 :(得分: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
  

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