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

6

我写了一个带有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)
  }
}

然而,这似乎是一种“不符合R语言特点”的方法来完成这个任务,最好使用其中之一的apply 函数。然而,在阅读所有内容并尝试它们之后,我无法完成这个看似简单的任务。

这似乎像是一个矩阵,因此apply应该可以工作?

3个回答

10

你可以像使用循环一样使用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
由于这些字符向量的长度相同,您也可以在此处使用“Map”函数来实现相同的结果。就像这样:Map(dummy, nfl_teams, years) - Steve
@Steve 这个不会返回所有的16种组合。 - user1

2
如果您的download_data函数使用nfl_teamsyears构建URL以获取数据,我建议采用以下方法:
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中。如果可能的话,我希望摆脱重复的绑定。

循环遍历并绑定到一个数据框,这正是我正在做的。这似乎是一个更好的方法,感谢您的帮助。 - Chris Fenton

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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接