当我用R和purrr清理复杂的列表时,我有以下问题。示例将清除这一点。
所需的包
library(jsonlite)
library(purrr)
library(tibble)
library(dplyr)让我们从NHL json获取示例数据。
url <- c("https://statsapi.web.nhl.com/api/v1/game/2017010002/feed/live", "https://statsapi.web.nhl.com/api/v1/game/2017010005/feed/live")
data_list <- map(url, fromJSON)这是一个相当复杂的列表,但最后我想要的是result,这是最后的。主要的想法是,我想有列表列与tibble在它,但tibble是由选择的向量/列从列表的不同部分创建。以下是我失败的尝试:
wrong <- tibble(
gamepk = map_chr(data_list, c("gamePk"), .default = NA),
home = map_chr(data_list, c("gameData", "teams", "home", "triCode"), .default = NA),
away = map_chr(data_list, c("gameData", "teams", "away", "triCode"), .default = NA),
test = list(tibble(event = map(data_list, c("liveData", "plays", "allPlays", "result", "event"), .default = NA),
x_cord = map(data_list, c("liveData", "plays", "allPlays", "coordinates", "x"), .default = NA),
y_cord = map(data_list, c("liveData", "plays", "allPlays", "coordinates", "y"), .default = NA)))
)
# A tibble: 2 x 4
gamepk home away test
<chr> <chr> <chr> <list>
1 2017010002 VAN VGK <tibble [2 x 3]>
2 2017010005 BUF CAR <tibble [2 x 3]>这里有一种笨拙的方法来做这件事并纠正结果。
result <- tibble(
gamepk = map_chr(data_list, c("gamePk"), .default = NA),
home = map_chr(data_list, c("gameData", "teams", "home", "triCode"), .default = NA),
away = map_chr(data_list, c("gameData", "teams", "away", "triCode"), .default = NA))
test1 <- bind_cols(event = data_list[[1]]$liveData$plays$allPlays$result$event,
x_cord = data_list[[1]]$liveData$plays$allPlays$coordinates$x,
y_cord = data_list[[1]]$liveData$plays$allPlays$coordinates$y)
test2 <- bind_cols(event = data_list[[2]]$liveData$plays$allPlays$result$event,
x_cord = data_list[[2]]$liveData$plays$allPlays$coordinates$x,
y_cord = data_list[[2]]$liveData$plays$allPlays$coordinates$y)
result$test[1] <- list(test1)
result$test[2] <- list(test2)
result
# A tibble: 2 x 4
gamepk home away test
<chr> <chr> <chr> <list>
1 2017010002 VAN VGK <tibble [314 x 3]>
2 2017010005 BUF CAR <tibble [283 x 3]>https://stackoverflow.com/questions/51403324
复制相似问题