处理lapply()

时间:2015-11-12 00:30:15

标签: r dataframe lapply

这可能是一个相当初学者级别的问题。 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时,这可能很烦人。

0 个答案:

没有答案