使用lapply将函数应用于列表中的多个数据帧时出现错误消息。

时间:2017-09-19 02:16:42

标签: r lapply

我的数据集看起来像这样,我有一个数据列表。

   Plot_ID Canopy_infection_rate DAI 
1  YO01    5                     7   
2  YO01    8                     14
3  YO01    10                    21

我想要做的是将一个名为“audpc_Canopyinfactionrate”的函数应用于数据帧列表。

然而,当我运行lapply时,我收到如下错误:

Error in FUN(X[[i]], ...) : argument "DAI" is missing, with no default

我已经检查了我的列表,我的数据没有移动列。

有谁知道它有什么问题吗?感谢

以下是我的代码的一部分:

#Read files in to list

for(i in 1:length(files)) {
  lst[[i]] <- read.delim(files[i], header = TRUE,  sep=" ")
}

#Apply a function to the list
densities <- list()
densities<- lapply(lst, audpc_Canopyinfactionrate)

#canopy infection rate 
audpc_Canopyinfactionrate <- function(Canopy_infection_rate,DAI){
  n <- length(DAI)
  meanvec <- matrix(-1,(n-1))
  intvec <- matrix(-1,(n-1))
  for(i in 1:(n-1)){
    meanvec[i] <- mean(c(Canopy_infection_rate[i],
                         Canopy_infection_rate[i+1]))
    intvec[i] <- DAI[i+1] - DAI[i]
  }

  infprod <- meanvec * intvec
  sum(infprod)

}

1 个答案:

答案 0 :(得分:2)

正如评论中所指出的,问题在于您使用lapply的方式。

此功能构建如下:lapply(X, FUN, ...)FUN是用于应用到名为X的data.frame / list中的元素的函数的名称。到目前为止一切都很好。

回到您的案例:您希望将函数audpc_Canopyinfactionrate()应用于lst中的所有数据框。该函数有两个参数。而且我认为这是代码中混淆的地方。确保您了解使用lapply的方式,使用lst[[1]]lst[[2]]等作为audpc_Canopyinfactionrate()中仅参数,实际上它需要两个参数!

如果稍微重新构造函数,可以使用lst[[1]]lst[[2]]作为函数的唯一参数,因为您知道该参数包含您需要的列 - Canopy_infection_rateDAI

audpc_Canopyinfactionrate <- function(df){
  n <- nrow(df)
  meanvec <- matrix(-1, (n-1))
  intvec  <- matrix(-1, (n-1))
  for(i in 1:(n-1)){
    meanvec[i] <- mean(c(df$Canopy_infection_rate[i],
                         df$Canopy_infection_rate[i+1]))
    intvec[i] <- df$DAI[i+1] - df$DAI[i]
  }

  infprod <- meanvec * intvec
  return(sum(infprod))    
}

以下列方式致电lapply

lapply(lst, audpc_Canopyinfactionrate)

注意:使用lapply中的...lapply(X, FUN, ...)也可以与多个参数一起使用。但是,在您的情况下,我认为这不是最好的选择。