假设你有一个这样的数据框列表:
my_list <- list(data.frame(a = 1:3, b = 1:3),
data.frame(a = c(), b = c()),
data.frame(a = 1:5, b = 1:5))
my_list
#> [[1]]
#> a b
#> 1 1 1
#> 2 2 2
#> 3 3 3
#>
#> [[2]]
#> data frame with 0 columns and 0 rows
#>
#> [[3]]
#> a b
#> 1 1 1
#> 2 2 2
#> 3 3 3
#> 4 4 4
#> 5 5 5
那么你的函数可能是这样的:
my_func <- function(df) {
# return NULL and stop function if dataframe has zero rows
if(nrow(df) == 0) return(NULL)
# Do work on dataframes with one or more rows
data.frame(sum = df$a + df$b)
}
所以现在如果我们lapply 我们得到:
result <- lapply(my_list, my_func)
result
#> [[1]]
#> sum
#> 1 2
#> 2 4
#> 3 6
#>
#> [[2]]
#> NULL
#>
#> [[3]]
#> sum
#> 1 2
#> 2 4
#> 3 6
#> 4 8
#> 5 10
如果您想从列表中删除 NULL 值,您可以这样做:
result[!sapply(result, is.null)]
#> [[1]]
#> sum
#> 1 2
#> 2 4
#> 3 6
#>
#> [[2]]
#> sum
#> 1 2
#> 2 4
#> 3 6
#> 4 8
#> 5 10
更新
如果遇到空文件,要在函数中包含警告消息,我们可以这样做:
my_func <- function(df) {
# return NULL and stop function if dataframe has zero rows
if(nrow(df) == 0) {
warning("This file is empty")
return(NULL)
}
# Do work on dataframes with one or more rows
data.frame(sum = df$a + df$b)
}
由reprex package (v2.0.0) 于 2021 年 11 月 15 日创建