我有一个列表列,其中每个元素都包含一个长度为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()
经过一天的谷歌搜索后,我仍然卡住了。请指点我的方向.......非常感谢!!!
答案 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的地图解决方案更简洁,更容易推理。