这可能是一个相当初学者级别的问题。 lapply()在列表的每个组件上应用特定函数时非常有用。但是,当我处理由数据库定期生成的数据时,有时会发生列表中的一个或多个元素为空,而同一类的所有其他组件都是数据帧。
当我使用lapply()来处理整个列表时,当转向空元素时会发生错误,因为某种程度上维度或长度或类不适合。在这种情况下我做的是使用if / else循环,但我想必须有一个巧妙而聪明的方法来解决这个问题。
这是一个例子:
FTSR.site.app <- lapply(sortier.d.f, function(x) {
if(length(x) != 1){
FTSR <- as.numeric(get.FTSR(x))
}else FTSR <- 0})
sortier.d.f是一个由具有大量行和列的数据框组成的列表。如果它们中存在一个空元素,这意味着那里没有生成数据,它将不会单独使用get.FTSR函数(我为特定计算编写),因为后者只能处理数据帧。这个空元素的长度将为1,我猜是因为它仍然存在为0或FALSE。否则,如果没有这些空元素,我可以简单地使用
FTSR.site.app <- lapply(sortier.d.f, get.FTSR(x))
在这种情况下,您能否为空元素问题提出更好的解决方案?
这里有一个更简单的虚拟示例:
test.A <- data.frame(name <- c("Michael", "John", "Mary"),
mathematik <- c(85, 72, 90), physics <- c(67, 82, 94))
test.B <- vector(length = 0, mode = "numeric")
test.L <- list(test.A, test.B)
sum.mean.calc <- function(test){
test$total <- apply(test[,2:3], MARGIN = 1, sum)
test$mean <- apply(test[,2:3], MARGIN = 1, mean)
return(test)
}
test.L <- lapply(test.L, sum.mean.calc)
test.L <- lapply(test.L, function(x){
if(length(x) != 0){
x <- sum.mean.calc(x)
}else x <- 0
return(x)
})
首先尝试使用lapply失败,因为test.B是带有0的1-Dim向量,所以它不能被函数sum.mean.calc处理,所以在第二次尝试中我必须使用额外的循环
if(length(x) != 0){
...
}else x <- 0
处理列表test.L中的所有组件,当我想在该列表上多次使用lapply时,这可能很烦人。