2016-07-25 85 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

相關問題