据我了解,在使用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))
})
我当然可以使用列表(我从长远来看这可能更好)但是从教学的角度来看,我想更好地理解。
非常感谢任何指针
答案 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
所以你可以这样读:
colSums
na.rm = TRUE
结果是一个列表,其中的每个元素都是将colSums
应用于列表中每个df的结果。