2017-09-19 19 views
0

我的数据集看起来像这样,我有一个数据列表。使用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) 

} 
+0

您没有为'audpc_Canopyinfactionrate()'函数的'DAI ='参数指定一个值。因此,错误消息:*参数“DAI”丢失,没有默认*。实际上,它看起来并不像你已经传递了该函数的任何参数。 – thelatemail

+0

谢谢。这实际上是来自农业的功能。如果我像这样运行单个数据框:audpc_Canopyinfactionrate(X17YO1001 $'Canopy_infection_rate',X17YO1001 $'DAI')。它工作正常。 – Helen

+1

功能的来源在这里没有什么不同,我不认为。你基本上完成了'f < - function(x,y)x + y; lapply(1:3,f)' - 您需要将所有必需的参数传递给函数以避免错误 - f < - function(x,y)x + y;例如,lapply(1:3,f,y = 2:4)。 – thelatemail

回答

1

正如在评论中指出,问题就出在你使用lapply的方式。

此功能是这样构建的:lapply(X, FUN, ...)FUN是一个函数的名称,用于应用于data.frame/list中名为X的元素。到现在为止还挺好。

返回您的案例:您想对lst中的所有数据帧应用功能audpc_Canopyinfactionrate()。这个函数有两个参数。我认为这是代码中混淆的东西。请确保您了解以您使用的方式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也可以用w^ith多于1个参数,通过使用lapply(X, FUN, ...)中的...。不过,就你而言,我认为这不是最好的选择。

+0

感谢您的回复。这工作! – Helen

相关问题