我的数据集看起来像这样,我有一个数据列表。
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)
}
答案 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_rate
和DAI
:
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, ...)
也可以与多个参数一起使用。但是,在您的情况下,我认为这不是最好的选择。