1

据我了解,在使用 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))
})

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

非常感谢您的任何指点

4

1 回答 1

2

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

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

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 的结果。

于 2013-07-18T15:15:57.727 回答