我正在映射json级别(x)的一系列条目。对于每个级别 x,都有嵌套级别 (x+1),其中包含一些我想要组合到数据框中的信息以及来自 x 的一些信息。
这是我用来在 R中学习purrr
和处理的玩具示例。json
例如
(entry) <- level x
(year: 2016) <- want this
(category: "physics") <- want this
(winners)
(1) <- level x+1
(name: "bob" ) <- want this
(id: ) <- want this
(2..n) <- level x+1
(name: "steve" ) <- want this
(id: ) <- want this
制作数据框:
name id year category
bob 1 2016 physics
steve 2 2016 physics
mel 3 2016 chemistry .. etc
我已经解决了这个问题,但它map
在 x 的每一层都使用了嵌套,并且非常脆弱:
library(purr)
library(tidyverse)
library(stringr)
library(jsonlite)
# get example data
winners <- fromJSON("http://api.nobelprize.org/v1/prize.json", simplifyDataFrame=FALSE)
x <- winners$prizes %>%
map_df(function(prize) {
map_df(prize$laureates, function(person) {
tibble(id = person$id, firstname = person$firstname,
surname=ifelse(!is.null(person$surname),
person$surname, NA),
category=prize$category, year=prize$year)
})
})
有没有更好的方法来做到这一点?上述代码的担忧:
- 有没有不必嵌套 map 调用的替代方法?是否有一些
purrr
我不知道我可以使用的功能? - 处理丢失键的更好方法?在上面,测试数据的元素 22 没有姓氏键。如果不将 surfname 包装在 an 中
ifelse
,它将失败。从技术上讲,我应该将所有内容都包含在tibble
调用中,ifelse
但是它变得非常冗长并且感觉不是正确的解决方案。