使用apply系列函数替换R中的嵌套for循环

时间:2015-07-25 14:50:21

标签: r

我写了一个带有3个参数的函数:

download_data <- function(team, year, df) {
    ...
}

我想用两个字符向量分别为上面的函数提供第一个和第二个参数,这样就可以调用每个向量的组合一次:

nfl_teams <- c("bills", "dolphins", "jets", "patriots")

years <- c("2002", "2003", "2004", "2005")

我可以使用嵌套的for循环轻松地完成这项工作:

for (i in 1:4) {
  for ( j in 1:4) {
    salary_data <- download_data(nfl_teams[i], years[j], salary_data)
  }
}

然而,似乎这是一种“un-R”方式来实现这一点,并且最好使用其中一个apply函数。然而,在阅读了所有这些并尝试了它们之后,我无法完成这个看似简单的任务。

似乎这可能是一个矩阵,因此适用会起作用吗?

3 个答案:

答案 0 :(得分:2)

您可以像循环一样使用apply函数,但语法不同

dummy <- function(x, y) paste(x, y)
sapply(1:4, function(i) sapply(1:4, function(j) dummy(nfl_teams[i], years[j])))

答案 1 :(得分:1)

如果您的download_data函数正在使用nfl_teamsyears来构建用于提取数据的网址,我建议使用以下方法:

URL <- expand.grid(nfl_teams = c("bills", "dolphins", "jets", "patriots"),
    years = c("2002", "2003", "2004", "2005"),
    stringsAsFactors = FALSE)
URL$url <- paste0(...) # build your url string here

salary_data <- lapply(URL$url, download_data)
salary_data <- do.call("rbind", salary_data)

此方法假定您将download_data的每次迭代绑定到现有salary_data。如果可能的话,我想要摆脱的重复绑定。

答案 2 :(得分:0)

另一种方法是将对象强制转换为列表,并避免使用嵌套的apply族函数。

 unlist(lapply(as.list(nfl_teams), function(x) dummy(x, years) ))
 [1] "bills 2002"    "bills 2003"    "bills 2004"    "bills 2005"   
 [5] "dolphins 2002" "dolphins 2003" "dolphins 2004" "dolphins 2005"
 [9] "jets 2002"     "jets 2003"     "jets 2004"     "jets 2005"    
[13] "patriots 2002" "patriots 2003" "patriots 2004" "patriots 2005"