【问题标题】:function only evaluates first row of df函数只计算 df 的第一行
【发布时间】:2020-10-18 08:06:46
【问题描述】:

我编写了一个函数来检查字符串是否为空(或仅包含空格)。但是,当我尝试将其应用于数据框时,该函数只会为每一列返回一次 FALSE。我希望该函数的工作方式类似于单独评估数据帧的每个元素的 is.na() 函数。

is_empty <- function(x) {
 result <- gsub(" ", "", x)
 ifelse(is.na(result), return(FALSE), return(result == ""))
}

> is_empty("")      # TRUE
> is_empty("   ")   # TRUE
> is_empty(0)       # FALSE
> is_empty(NA)      # FALSE
> is_empty("foo")   # FALSE

> df = data.frame(c("",2,""), c(4, "  ", 6), c("", 8, 9), c(1,2,4))

> is_empty(df)
 [1] FALSE FALSE FALSE FALSE

> is.na(df)
      c.....2..... c.4........6. c.....8..9. c.1..2..4.
 [1,]        FALSE         FALSE       FALSE      FALSE
 [2,]        FALSE         FALSE       FALSE      FALSE
 [3,]        FALSE         FALSE       FALSE      FALSE

(我知道 NA 意味着我们不知道元素是否为空,但出于实际原因,我希望它为 FALSE。)

我的函数减去 gsub() 函数按预期工作,但该函数只能检测没有空格的空单元格。

【问题讨论】:

    标签: r


    【解决方案1】:

    我建议编写函数is_empty,它适用于向量而不是数据帧。

    is_empty <- function(x) {
        trimws(x) == ''
        #You can also use
        #gsub('\\s+', '', x) == ''
    }
    
    is_empty(c("",2,"   "))
    #[1]  TRUE FALSE  TRUE
    

    现在应用到数据框的每一列使用sapply/lapply

    df = data.frame(a = c("",2,""), b = c(4, "  ", 6), c = c("", 8, 9), d = c(1,2,4))
    sapply(df, is_empty)   
    
    #         a     b     c     d
    #[1,]  TRUE FALSE  TRUE FALSE
    #[2,] FALSE  TRUE FALSE FALSE
    #[3,]  TRUE FALSE FALSE FALSE
    

    显然,如果您希望函数在数据帧上工作,您可以在函数中使用 sapply 部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-27
      • 2015-06-05
      相关资源
      最近更新 更多