关于用lapply()替换嵌套for循环的疑问:嵌套循环逻辑解析
理解嵌套for循环与lapply替代方案的逻辑
我来帮你把这段代码的逻辑拆解得明明白白,解决你困惑的点~
先搞懂variable1和variable2的作用
首先看数据生成部分:
# Generate random data: allCountries <- LETTERS[1:10] allYears <- 1990:2012 myData <- expand.grid(allCountries, allYears) # create a dataframe with all possible combinations colnames(myData) <- c("Country", "Year") myData$variable1 <- rnorm(nrow(myData)) myData$variable2 <- rnorm(nrow(myData))
variable1和variable2就是用来做计算的输入数据:通过rnorm()生成了两组服从正态分布的随机数,每一行(也就是每一个国家-年份的组合)都对应一对variable1和variable2的值,后续的所有计算都是围绕这两个值展开的。
拆解嵌套for循环的执行逻辑
我们一步步看这个双层循环:
### Doubly-nested loop ### myData$computedFigure <- NA # Make an "empty" variable in my data.frame for(ii in allCountries){ for(jj in allYears){ tempX <- myData[myData$Country == ii & myData$Year == jj, c("variable1")] tempY <- myData[myData$Country == ii & myData$Year == jj, c("variable2")] # "Save" results into appropriate location in my data.frame myData[myData$Country == ii & myData$Year == jj, c("computedFigure")] <- myFunction(tempX, tempY) } }
- 初始化:先给
myData新增一列computedFigure,全部填充NA,用来存后续的计算结果。 - 外层循环:遍历每一个国家(从A到J),
ii就是当前循环的国家。 - 内层循环:对于当前国家
ii,再遍历每一个年份(从1990到2012),jj就是当前年份。- 这两步结合起来,每一次内层循环都对应一个唯一的国家-年份组合(比如A-1990、A-1991……J-2012)。
- 取临时变量:
tempX和tempY就是取出当前这个国家-年份组合对应的variable1和variable2的值(因为expand.grid生成的是所有组合,所以每个(ii,jj)刚好对应myData里的一行)。 - 最后一行的核心操作:把
myFunction(tempX, tempY)的计算结果,精准地存回myData中对应这个国家-年份组合的computedFigure位置。简单说就是:算出当前组合的结果,然后放到它该放的地方,把之前的NA替换掉。
为什么lapply可以替代?
再看lapply的实现:
### Simple lapply() approach ### computedFigureList <- lapply(1:nrow(myData), function(x){ tempX <- myData[x, c("variable1")] tempY <- myData[x, c("variable2")] # "Save" results into appropriate location in my data.frame myFunction(tempX, tempY) }) myData$computedFigure2 <- unlist(computedFigureList)
其实逻辑和嵌套循环完全一致,只是换了一种遍历方式:
- 不再按国家→年份的层级遍历,而是直接遍历myData的每一行(x从1到总行数),每一行就是一个国家-年份组合。
- 每一行取出对应的
variable1和variable2,计算后返回结果,存在列表里。 - 最后用
unlist()把列表转成向量,赋值给computedFigure2,所以最后用plot(computedFigure, computedFigure2)会看到一条完美的直线——因为两个列的结果完全一样。
内容的提问来源于stack exchange,提问作者Nneka
相关产品推荐
相关产品推荐

