嘿伙计,所以我有这个函数从NBA统计网站返回JSON数据的数据框。该函数接收某个游戏的游戏ID,并返回该游戏的半场盒子得分的数据框。
getstats<- function(game=x){
for(i in game){
url<- paste("http://stats.nba.com/stats/boxscoretraditionalv2?EndPeriod=10&
EndRange=14400&GameID=",i,"&RangeType=2&Season=2015-16&SeasonType=
Regular+Season&StartPeriod=1&StartRange=0000",sep = "")
json_data<- fromJSON(paste(readLines(url), collapse=""))
df<- data.frame(json_data$resultSets[1, "rowSet"])
names(df)<-unlist(json_data$resultSets[1,"headers"])
}
return(df)
}
所以我想用这个函数做的是获取几个游戏ID的向量,并为每个游戏ID创建一个单独的数据框。例如:
gameids<- as.character(c(0021500580:0021500593))
我想要使用矢量&#34; gameids&#34;,并创建十四个数据帧。如果有人知道我将如何做到这一点,将不胜感激!谢谢!
答案 0 :(得分:6)
您可以通过设置以下功能将data.frames保存到列表中:
getstats<- function(games){
listofdfs <- list() #Create a list in which you intend to save your df's.
for(i in 1:length(games)){ #Loop through the numbers of ID's instead of the ID's
#You are going to use games[i] instead of i to get the ID
url<- paste("http://stats.nba.com/stats/boxscoretraditionalv2?EndPeriod=10&
EndRange=14400&GameID=",games[i],"&RangeType=2&Season=2015-16&SeasonType=
Regular+Season&StartPeriod=1&StartRange=0000",sep = "")
json_data<- fromJSON(paste(readLines(url), collapse=""))
df<- data.frame(json_data$resultSets[1, "rowSet"])
names(df)<-unlist(json_data$resultSets[1,"headers"])
listofdfs[[i]] <- df # save your dataframes into the list
}
return(listofdfs) #Return the list of dataframes.
}
gameids<- as.character(c(0021500580:0021500593))
getstats(games = gameids)
请注意,我无法对此进行测试,因为网址似乎无法正常运行。我在下面收到连接错误:
Error in file(con, "r") : cannot open the connection
答案 1 :(得分:0)
使用lapply(或sapply)将函数应用于列表并将结果作为列表获取。因此,如果您获得了几个游戏ID的向量以及执行您想要执行的操作的函数,则可以使用lapply来获取数据帧列表(作为函数返回df)。
我还没能测试你的代码(我在你提供的功能上出错了),但这样的事情应该有效:
library(RJSONIO)
gameids<- as.character(c(0021500580:0021500593))
df_list <- lapply(gameids, getstats)
getstats<- function(game=x){
url<- paste0("http://stats.nba.com/stats/boxscoretraditionalv2?EndPeriod=10&EndRange=14400&GameID=",
game,
"&RangeType=2&Season=2015-16&SeasonType=Regular+Season&StartPeriod=1&StartRange=0000")
json_data<- fromJSON(paste(readLines(url), collapse=""))
df<- data.frame(json_data$resultSets[1, "rowSet"])
names(df)<-unlist(json_data$resultSets[1,"headers"])
return(df)
}
df_list将包含您在gameids中提供的每个Id的1个数据帧。
再次使用lapply进行额外的数据处理,包括将数据帧保存到磁盘。
如果你需要处理大量数据,data.table是一个很好的包。特别是rbindlist允许您根据需要将列表中包含的所有dt(= df)转换为单个(拆分将执行相反的操作)。
答案 2 :(得分:-1)
根据Abdou的回答,你可以使用 assign()函数创建动态数据框来保存每个gameID的结果
for(i in 1:length(games)){ #Loop through the numbers of ID's instead of the ID's
#You are going to use games[i] instead of i to get the ID
url<- paste("http://stats.nba.com/stats/boxscoretraditionalv2?EndPeriod=10&
EndRange=14400&GameID=",games[i],"&RangeType=2&Season=2015-16&SeasonType=
Regular+Season&StartPeriod=1&StartRange=0000",sep = "")
json_data<- fromJSON(paste(readLines(url), collapse=""))
df<- data.frame(json_data$resultSets[1, "rowSet"])
names(df)<-unlist(json_data$resultSets[1,"headers"])
# create a data frame to hold results
assign(paste('X',i,sep=''),df)
}
assign函数将创建与游戏IDS数相同的数据帧。它们被标记为X1,X2,X3 ...... Xn。希望这可以帮助。