R: удалить несколько пустых столбцов символьных переменных

У меня есть фрейм данных, где все переменные имеют символьный тип. Многие из столбцов полностью пусты, то есть есть только заголовки переменных, но нет значений. Есть ли способ выложить пустые столбцы?

Ответ 1

Если ваши пустые столбцы - действительно пустые столбцы символов, то должно работать следующее: Его нужно будет изменить, если ваши "пустые" столбцы символов включают, скажем, пробелы.

Пример данных:

mydf <- data.frame(
  A = c("a", "b"),
  B = c("y", ""),
  C = c("", ""),
  D = c("", ""),
  E = c("", "z")
)
mydf
#   A B C D E
# 1 a y      
# 2 b       z

Идентификация и удаление "пустых" столбцов.

mydf[!sapply(mydf, function(x) all(x == ""))]
#   A B E
# 1 a y  
# 2 b   z

В качестве альтернативы, как рекомендовано @Roland:

> mydf[, colSums(mydf != "") != 0]
  A B E
1 a y  
2 b   z

Ответ 2

Вы можете выполнить одно из следующих действий:

emptycols <- sapply(df, function (k) all(is.na(k)))
df <- df[!emptycols]

или

emptycols <- colSums(is.na(df)) == nrow(df)
df <- df[!emptycols]

Если пустым вы имеете в виду, что они "", второй подход можно адаптировать так:

emptycols <- colSums(df == "") == nrow(df)

Ответ 3

У меня похожая ситуация: я работаю с большой базой данных общедоступных записей, но когда я уменьшаю ее до нужного диапазона дат и категории, которые мне нужны, есть тонна столбцов, которые не используются. Некоторые из них пусты, а некоторые - NA.

Выбранный ответ: fooobar.com/questions/2046958/... не работал у меня, но это произошло:

df[!sapply(df, function (x) all(is.na(x) | x == ""))]

Ответ 4

Если вы говорите о столбцах, где все значения NA, используйте remove_empty("cols") из пакета janitor.

Если у вас есть символьные векторы, где каждое значение является пустой строкой "", вы можете сначала преобразовать эти значения в NA по всему вашему data.frame с помощью na_if из пакета dplyr:

dat <- data.frame(
  x = c("a", "b", "c"),
  y = c("", "", ""),
  z = c(NA, NA, NA),
  stringsAsFactors = FALSE
)

dat
#>   x y  z
#> 1 a   NA
#> 2 b   NA
#> 3 c   NA

library(dplyr)
library(janitor)

dat %>%
  mutate_all(funs(na_if(., ""))) %>%
  remove_empty("cols")
#>   x
#> 1 a
#> 2 b
#> 3 c

Ответ 5

Это зависит от того, что вы подразумеваете под пустым: это NA или "", или это может быть даже " "? Возможно, что-то подобное:

df[,!apply(df, 2, function(x) all(gsub(" ", "", x)=="", na.rm=TRUE))]

Ответ 6

Вот что можно изменить, чтобы исключить столбцы, содержащие любые указанные переменные.

newdf= df[, apply(df, 2, function(x) !any({is.na(x) | x== "" | 
x== "-4"} ) )] 

Ответ 7

Если вы знаете индексы столбца, вы можете использовать

df[,-c(3, 5, 7)]

Это приведет к опущению столбцов 3, 5, 7.

Ответ 8

Это также может быть сделано dplyr и select_if

'select_if(df,function(x){any(!is.na(x))})'

или с помощью is.null() или x=="" в зависимости от того, как в ваших данных определены пустые значения.