首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用purrr重组列表

使用purrr重组列表
EN

Stack Overflow用户
提问于 2018-07-18 21:30:44
回答 0查看 121关注 0票数 0

当我用R和purrr清理复杂的列表时,我有以下问题。示例将清除这一点。

所需的包

代码语言:javascript
复制
library(jsonlite)
library(purrr)
library(tibble)
library(dplyr)

让我们从NHL json获取示例数据。

代码语言:javascript
复制
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是由选择的向量/列从列表的不同部分创建。以下是我失败的尝试:

代码语言:javascript
复制
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]>

这里有一种笨拙的方法来做这件事并纠正结果。

代码语言:javascript
复制
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]>
EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51403324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档