2016-07-25 139 views
-1

我已经完成了DataCamp上的第一对夫妇R课程,为了增强我的技能,我决定使用R来为幻想足球赛季做准备,因此我已经开始玩nflscrapR包。功能遍历列表,合并结果到一个数据框

使用nflscrapR软件包,可以使用season_games()函数来获取游戏信息,该函数只是返回一个包含游戏ID,游戏日期,主客场球队缩写的数据框。

实施例:

games.2012 = season_games(2012) 
head(games.2012) 
     GameID  date home away season 
1 2012090500 2012-09-05 NYG DAL 2012 
2 2012090900 2012-09-09 CHI IND 2012 
3 2012090908 2012-09-09 KC ATL 2012 
4 2012090907 2012-09-09 CLE PHI 2012 
5 2012090906 2012-09-09 NO WAS 2012 
6 2012090905 2012-09-09 DET STL 2012 

最初我复制并粘贴原有的功能和手动改变的最后一位为每个季节,然后rbinded所有的季节到一个数据帧,games

games.2012 <- season_games(2012) 
games.2013 <- season_games(2013) 
games.2014 <- season_games(2014) 
games.2015 <- season_games(2015) 
games = rbind(games2012,games2013,games2014,games2015) 

我想写一个函数来简化这个过程。 我失败的尝试:

gameID <- function(years) { 
    for (i in years) { 
    games[i] = season_games(years[i]) 
    } 
} 

随着years = list(2012, 2013)用于测试目的,产生了以下:

错误strsplit(头, “\ r \ n”):非字符参数从调用 : strsplit(标题,“\ r \ n”)

在此先感谢!

回答

1

你应该看看一些流行的清单工作答案,特别是How do I make a list of data frames?What's the difference between [ and [[?

没有理由把你的年数放在list。它们只是整数,所以只需做一个法向量。

years = 2012:2015 

然后我们就可以得到你的函数的工作(我们需要将之前的循环来初始化一个空列表):

gameID <- function(years) { 
    games = list() 
    for (i in years) { 
    games[[i]] = season_games(years[i]) 
    } 
    return(games) 
} 

阅读我上面的链接,为什么我们使用[[与该列表和[与向量。我们可以像这样运行:

game_list = gameID(2012:2015) 

但这这样一个简单的功能,它更容易使用lapply。你的函数只是一个for循环的包装,它返回list,这就是,正好是什么lapply也是。但是,如果您的功能有season_games硬编码,lapply可以使用任何功能。

game_list = lapply(2012:2015, season_games) 
# should be the same result as above 

在任何情况下,我们有数据帧的列表,并希望将其合并成一个大的数据帧。基本R方法是rbinddo.call,但dplyrdata.table有更有效的版本。

# pick your favorite 
games = do.call(rbind, args = game_list) # base 
games = dplyr::bind_rows(game_list) 
games = data.table::rbindlist(game_list) 
+0

是的......我很快意识到我需要回顾并回顾这些介绍性DataCamp课程的各个部分。感谢您的输入! – FabricatedSavant

2

尽管@Gregor有一个明显的解决方案,但他没有运行它,因为这不是一个简单的例子。我搜索了一下,发现并尝试使用这些代码,至少在不重要的时间内它不起作用。

另一方面,我从Vivek Patil的博客取了this code

library(XML) 
weeklystats = as.data.frame(matrix(ncol = 14)) # Initializing our empty dataframe 

names(weeklystats) = c("Week", "Day", "Date", "Blank", 
         "Win.Team", "At", "Lose.Team", 
         "Points.Win", "Points.Lose", 
         "YardsGained.Win", "Turnovers.Win", 
         "YardsGained.Lose", "Turnovers.Lose", 
         "Year") # Naming columns 

URLpart1 = "http://www.pro-football-reference.com/years/" 
URLpart3 = "/games.htm" 

#### Our workhorse function #### 

getData = function(URLpart1, URLpart3) { 
    for (i in 2012:2015) { 
    URL = paste(URLpart1, as.character(i), URLpart3, sep = "") 
    tablefromURL = readHTMLTable(URL) 
    table = tablefromURL[[1]] 
    names(table) = c("Week", "Day", "Date", "Blank", "Win.Team", "At", "Lose.Team", 
        "Points.Win", "Points.Lose", "YardsGained.Win", "Turnovers.Win", 
        "YardsGained.Lose", "Turnovers.Lose") 
    table$Year = i # Inserting a value for the year 
    weeklystats = rbind(table, weeklystats) # Appending happening here 
    } 
    return(weeklystats) 
} 

我张贴这是因为,它的工作原理,你可能会学到一些关于网页抓取你不知道,这11秒运行一次。

system.time(weeklystats <- getData(URLpart1, URLpart3)) 
    user system elapsed 
    0.870 0.014 10.926 
+1

不错的调查!事实上,没有测试我的答案 - 我会高兴地保证它的工作取决于问题中报告的'season_games'函数。 – Gregor

+0

这太棒了!虽然我现在主要关注nflscrapR软件包,但我肯定会为此加上书签,以便彻底地探索。再次感谢! – FabricatedSavant

+0

欢迎您,欢迎您致电:) – shayaa