функция оценивает только первую строку df

#r

#r

Вопрос:

Я написал функцию, которая проверяет, является ли строка пустой (или содержит только пробелы) или нет. Однако, когда я пытаюсь применить ее к фрейму данных, функция просто возвращает 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 () работает должным образом, но тогда функция может обнаруживать только пустые ячейки без пробелов.

Ответ №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 участие внутри функции.