【发布时间】:2019-12-22 05:47:16
【问题描述】:
给定一个包含多个元素的列表,目标是将它们放入数据框中。 purr 包中的 map_df 函数对于常规列表非常有用,但对于不规则列表会出错。
例如,按照this 教程,以下工作:
library(purrr)
library(repurrrsive) # The data comes from this package
map_dfr(got_chars, magrittr::extract, c("name", "culture", "gender", "id", "born", "alive"))
A tibble: 30 x 6
name culture gender id born alive
<chr> <chr> <chr> <int> <chr> <lgl>
1 Theon Greyjoy Ironborn Male 1022 In 278 AC or 279 AC, at Pyke TRUE
2 Tyrion Lannister "" Male 1052 In 273 AC, at Casterly Rock TRUE
3 Victarion Greyjoy Ironborn Male 1074 In 268 AC or before, at Pyke TRUE
4 Will "" Male 1109 "" FALSE
5 Areo Hotah Norvoshi Male 1166 In 257 AC or before, at Norvos TRUE
6 Chett "" Male 1267 At Hag's Mire FALSE
7 Cressen "" Male 1295 In 219 AC or 220 AC FALSE
8 Arianne Martell Dornish Female 130 In 276 AC, at Sunspear TRUE
9 Daenerys Targaryen Valyrian Female 1303 In 284 AC, at Dragonstone TRUE
10 Davos Seaworth Westeros Male 1319 In 260 AC or before, at King's Landing TRUE
# … with 20 more rows
但是,如果从列表中删除一个元素,则该函数将失败。
got_chars[[1]]["gender"]<-NULL
map_dfr(got_chars, magrittr::extract, c("name", "culture", "gender", "id", "born", "alive"))
#Error: Argument 3 is a list, must contain atomic vectors
所需的输出将是缺少元素的NA 值。什么是优雅的解决方案?我怀疑解决方案包括使用purrr:possibly(),但我还没有弄清楚。
【问题讨论】:
-
您可以尝试添加一个步骤,从结果with Filter() as in this answer 中删除
NULL值,因为bind_rows()将填入NA。我可能会为此创建一个新功能,但使用波浪号编码可能看起来像map_dfr(got_chars, ~magrittr::extract(.x, c("name", "culture", "gender", "id", "born", "alive") ) %>% Filter(Negate(is.null), .) )
标签: r list dictionary purrr