【问题标题】:statement to skip empty data frames in a function在函数中跳过空数据帧的语句
【发布时间】:2021-12-27 02:56:16
【问题描述】:

我在R 中有一个类似的函数,它使用df 作为主要参数。但是,df 可能为空,如果我使用 lapply 运行该函数,我想跳过这些 例如lapply(FileNames, function(y) my.function(y))

我的函数是这样的

my.function <- function(table) {
file <- read.csv(table, header=T)

  if(nrow(table) == 0) 
   {next}

#skip the df if is empty and stop processing that df
#do more stuffs if not empty
}

到目前为止我已经尝试过了,但是如果数据框为空,整个过程就会崩溃,有什么提示吗?

【问题讨论】:

  • 你可以使用return,或者return(NULL),而不是next,这取决于你的函数的使用方式。

标签: r function if-statement


【解决方案1】:

假设你有一个这样的数据框列表:

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 日创建

【讨论】:

  • 如果我想跳过它但还要写一个txt说“这个文件是空的”怎么办?有什么建议吗?
  • “写一个txt”是什么意思?写在哪里?你想在你的列表中有一个文本字符串说“这个文件是空的”,还是你想在控制台上打印一条警告消息?
  • @LilaMcPhee 查看我的更新
猜你喜欢
  • 1970-01-01
  • 2016-11-15
  • 2015-09-04
  • 1970-01-01
  • 2020-08-05
  • 2019-12-22
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
相关资源
最近更新 更多