提问人:Michael 提问时间:10/17/2023 最后编辑:Michael 更新时间:10/17/2023 访问量:58
映射列表并提取元素以在 R 中创建数据框
Map a list and extract elements to create a data frame in R
问:
这与我在这里发布的问题类似。
我使用包和函数来获取特定赛季的游戏列表及其相关信息。nhlapi
nhl_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
答:
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
哦,对不起,好的,我会尝试更新。
评论
games