映射列表并提取元素以在 R 中创建数据框

Map a list and extract elements to create a data frame in R

提问人:Michael 提问时间:10/17/2023 最后编辑:Michael 更新时间:10/17/2023 访问量:58

问:

这与我在这里发布的问题类似。

我使用包和函数来获取特定赛季的游戏列表及其相关信息。nhlapinhl_schedule_seasons

在 2023 赛季使用它,包括以下内容:

install.packages("nhlapi")
library(nhlapi)

schedule <- nhl_schedule_seasons(2023)

返回一个列表,在里面我可以看到游戏信息:

str(schedule, list.len = 8)

List of 1
 $ :List of 8
  ..$ copyright   : chr "NHL and the NHL Shield are registered trademarks of the National Hockey League. NHL and NHL team marks are the "| __truncated__
  ..$ totalItems  : int 1423
  ..$ totalEvents : int 0
  ..$ totalGames  : int 1423
  ..$ totalMatches: int 0
  ..$ metaData    :List of 1
  .. ..$ timeStamp: chr "20231016_233752"
  ..$ wait        : int 10
  ..$ dates       :'data.frame':    198 obs. of  8 variables:
  .. ..$ date        : chr [1:198] "2023-09-23" "2023-09-24" "2023-09-25" "2023-09-26" ...
  .. ..$ totalItems  : int [1:198] 3 12 9 7 9 6 8 10 4 7 ...
  .. ..$ totalEvents : int [1:198] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..$ totalGames  : int [1:198] 3 12 9 7 9 6 8 10 4 7 ...
  .. ..$ totalMatches: int [1:198] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..$ games       :List of 198
  .. .. ..$ :'data.frame':  3 obs. of  30 variables:

如何从列表中提取特定的游戏信息?games

我尝试使用以下内容进行映射:

library(purrr)
library(dplyr)
library(tibble)
library(tidyr)

schedule <- nhl_schedule_seasons(2023) |>
  map(list("dates", "games"))

但是我无法弄清楚如何使用 enframe,可能list_rbind将所有信息提取到数据框中?

我可以像这样访问每个数据帧:

newdf1 <- as.data.frame(schedule[[1]][[1]])
head(newdf1)
      gamePk                              link gameType   season             gameDate
1 2023010001 /api/v1/game/2023010001/feed/live       PR 20232024 2023-09-23T04:05:00Z
2 2023010002 /api/v1/game/2023010002/feed/live       PR 20232024 2023-09-23T19:00:00Z
3 2023010003 /api/v1/game/2023010003/feed/live       PR 20232024 2023-09-24T00:00:00Z

但是我无法弄清楚如何为每个列表获取这些?

我还尝试了以下循环:

schedule <- nhl_schedule_seasons(2023) |>
  map(list("dates", "games"))

df = data.frame()

for (i in 1:198) {
  
  res = as.data.frame(schedule[[1]][[i]])
    bind_rows()
  
  df = rbind(df, res)
}

但是我收到这个错误:

Error in rbind(deparse.level, ...) : 
  numbers of columns of arguments do not match
r dplyr tidyr 咕噜

评论

1赞 jpsmith 10/17/2023
澄清一下,您是否希望将嵌套列表中 198 场比赛的所有数据都放入一个数据帧中?games
0赞 Michael 10/17/2023
抱歉,我应该澄清一下。是的,这就是我正在寻找的最终结果。
0赞 Michael 10/17/2023
再补充一点,有超过 198 款游戏。相同的日期和数据出现在同一个列表中,我无法弄清楚如何提取这些日期和数据。

答:

1赞 Ludwig 10/17/2023 #1

这是否达到了您想要的效果?

schedule <- nhl_schedule_seasons(2023) |>
  map(list("dates", "games"))

res <- bind_rows(map(schedule, ~ bind_rows(.x)))

如果要在包含值来自的列表名称的新数据框中创建列,可以添加到每个绑定行调用中:id = "..."

bind_rows(map(schedule, ~ bind_rows(.x, .id = "inner_list")), .id = "outer_list")

评论

0赞 Michael 10/17/2023
这应该在循环中使用吗?还是在之后?schedule <- nhl_schedule_seasons(2023) |> map(list("dates", "games"))
1赞 Ludwig 10/17/2023
创建时间表后,是的!
0赞 Michael 10/17/2023
我放置了如果在计划之后:我得到bind_rows()schedule <- nhl_schedule_seasons(2023) |> map(list("dates", "games")) |> bind_rows(map(schedule, ~ (bind_rows(.x))))Error in : ! Argument 1 must be a data frame or a named atomic vector.
1赞 Ludwig 10/17/2023
我不是说要去。我会更新答案。
0赞 Michael 10/17/2023
哦,对不起,好的,我会尝试更新。