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