正确实施lapply

时间:2013-07-18 15:10:10

标签: r lapply

据我了解,在使用r时,使用lapply等函数而不是for循环(在其他面向对象的语言中经常使用)会更优雅。但是,当我尝试使用命令实现简单任务时,我无法理解语法并且犯了愚蠢的错误。例如:

我使用for循环从csv文件加载了一系列数据帧。以下虚拟数据帧充分描述了数据:

x <- c(0,10,11,12,13)
y <- c(1,NA,NA,NA,NA)
z <- c(2,20,21,22,23)    
a <- c(0,6,5,4,3)
b <- c(1,7,8,9,10)
c <- c(2,NA,NA,NA,NA)
df1 <- data.frame(x,y,z)
df2 <- data.frame(a,b,c)

我首先生成一个数据框名称列表(data_names-我在加载csv文件时执行此操作),然后只想对列进行求和。我的尝试当然不起作用:

lapply(data_names, function(df) {
counts <- colSums(!is.na(data_names))
})

我当然可以使用列表(我从长远来看这可能更好)但是从教学的角度来看,我想更好地理解。

非常感谢任何指针

1 个答案:

答案 0 :(得分:2)

这只是你对is.na的使用,而且你不需要在函数中使用asignment运算符<-lapply返回一个列表,该列表是将FUN应用于输入列表的每个元素的结果。您将lapply的输出分配给变量,例如res <- lapply( .... , FUN )

我也不太确定你最初是如何制作这个名单的,但是下面的内容就足够了。在这种情况下,您也不需要匿名函数,您可以使用命名的colSums并提供na.rm = TRUE参数来处理数据中的persky NA

lapply( list( df1, df2 ) , colSums , na.rm = TRUE )
[[1]]
 x  y  z 
46  1 88 

[[2]]
 a  b  c 
18 35  2

所以你可以这样读:

  • 对于列表中的每个df:
  • 使用参数colSums
  • 应用na.rm = TRUE

结果是一个列表,其中的每个元素都是将colSums应用于列表中每个df的结果。