R-我可以将此循环写为apply函数吗?

时间:2018-08-13 14:25:20

标签: r apply

我创建了以下循环,但希望将其编写为lapply函数。 这可能吗?我正在努力使自己了解Apply函数,但还没有完全掌握它。

Decay <- function(x, decay=y) stats::filter(x, decay, method = "recursive")

d<-iris[,c("Sepal.Length","Sepal.Width","Petal.Length","Petal.Width")]

DecayX <- c(0.1,0.3,0.6,0.8,0.95)
DecVars = c("Sepal.Length","Petal.Width")

for (j in DecVars){
  for (i in DecayX){
    VarName <- paste(colnames(d[j]),i*100,"DEC",sep="_")
    d[[VarName]]<-Decay(d[j],i)
  }
}

2 个答案:

答案 0 :(得分:4)

我看不出有任何理由使用申请家庭。

您可以使用mapply

vars <- c(expand.grid(DecayX,DecVars,stringsAsFactors = F))
invisible(
mapply(function(x,DecV){VarName <- paste(colnames(d[DecV]),x*100,"DEC",sep="_");
                        d[[VarName]]<<-Decay(d[DecV],x)},x=vars[[1]],DecV=vars[[2]])
)

我认为在双循环的情况下,我不会使用apply系列。

答案 1 :(得分:1)

另一种方法是用sapply()替换每个for循环,该循环比for循环快,并且不需要使用expand.grid()

invisible(
  sapply(DecVars, function(j) {
    sapply(DecayX, function(i) {
      VarName <- paste(colnames(d[j]),i*100,"DEC",sep="_")
      d[[VarName]] <<- Decay(d[j],i)
    })
  })
)

您可以看到,这比使用for循环快得多,也比使用mapply()grid.expand()循环要快:

library(microbenchmark)

microbenchmark(
  'mapply' = {
    vars <- c(expand.grid(DecayX,DecVars,stringsAsFactors = F))
    invisible(
      mapply(function(x,DecV){VarName <- paste(colnames(d[DecV]),x*100,"DEC",sep="_");
      d[[VarName]]<<-Decay(d[DecV],x)},x=vars[[1]],DecV=vars[[2]])
    )},
  'sapply' = {
    invisible(
      sapply(DecVars, function(j) {
        sapply(DecayX, function(i) {
          VarName <- paste(colnames(d1[j]),i*100,"DEC",sep="_")
          d1[[VarName]] <<- Decay(d1[j],i)
        })
      })
    )
  },
  'for-loop' = {
    for (j in DecVars){
      for (i in DecayX){
        VarName <- paste(colnames(d[j]),i*100,"DEC",sep="_")
        d[[VarName]]<-Decay(d[j],i)
      }
    }
  },
  times = 1000)

请注意:如果您忽略expand.grid()步骤,mapply()的速度会更快。