![](/img/trans.png)
[英]How to replace mutiple nested for loops with apply family functions in R?
[英]Using apply family of functions to replace nested for loop in 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
函数。 然而,在阅读并尝试了所有这些之后,我无法完成这个看似简单的任务。
看起来这可能是一个矩阵,因此apply
会起作用吗?
您可以像循环一样使用apply
函数,但语法不同
dummy <- function(x, y) paste(x, y)
sapply(1:4, function(i) sapply(1:4, function(j) dummy(nfl_teams[i], years[j])))
如果您的download_data
函数使用nfl_teams
和years
来构建从中提取数据的 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
。 如果可能的话,这是我想要摆脱的重复绑定。
另一种方法是将对象强制为列表,并避免嵌套的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"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.