Подтвердить что ты не робот

Как удалить столбцы, содержащие ТОЛЬКО НС?

У меня есть data.frame, содержащий несколько столбцов со всеми значениями NA, как я могу их удалить из data.frame.

Можно ли использовать функцию

na.omit(...) 

с указанием дополнительных аргументов?

4b9b3361

Ответ 1

Один из способов сделать это:

df[, colSums(is.na(df)) != nrow(df)]

Если число NA в столбце равно количеству строк, оно должно быть полностью NA.

Или аналогично

df[colSums(!is.na(df)) > 0]

Ответ 2

Кажется, вы хотите удалить столбцы ТОЛЬКО с ВСЕ NA s, оставив столбцы с некоторыми строками, которые имеют NA s. Я бы сделал это (но я уверен, что существует эффективный векторный код:

#set seed for reproducibility
set.seed <- 103
df <- data.frame( id = 1:10 , nas = rep( NA , 10 ) , vals = sample( c( 1:3 , NA ) , 10 , repl = TRUE ) )
df
#      id nas vals
#   1   1  NA   NA
#   2   2  NA    2
#   3   3  NA    1
#   4   4  NA    2
#   5   5  NA    2
#   6   6  NA    3
#   7   7  NA    2
#   8   8  NA    3
#   9   9  NA    3
#   10 10  NA    2

#Use this command to remove columns that are entirely NA values, it will elave columns where only some vlaues are NA
df[ , ! apply( df , 2 , function(x) all(is.na(x)) ) ]
#      id vals
#   1   1   NA
#   2   2    2
#   3   3    1
#   4   4    2
#   5   5    2
#   6   6    3
#   7   7    2
#   8   8    3
#   9   9    3
#   10 10    2

Если вы обнаружите, что хотите удалить столбцы с любыми значениями NA, вы можете просто изменить команду all выше на any.

Ответ 3

Вот решение dplyr:

df %>% select_if(~sum(!is.na(.)) > 0)

Ответ 4

Другой вариант с Filter

Filter(function(x) !all(is.na(x)), df)

ПРИМЕЧАНИЕ. Данные из сообщения @Simon O'Hanlon.

Ответ 6

Просто используйте dplyr::select_if(is.numeric).

> df <- data.frame( id = 1:10 , nas = rep( NA , 10 ) , vals = sample( c( 1:3 , NA ) , 10 , repl = TRUE ) )

> df %>% glimpse()
Observations: 10
Variables: 3
$ id   <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
$ nas  <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ vals <int> NA, 1, 1, NA, 1, 1, 1, 2, 3, NA

> df %>% select_if(is.numeric)
   id vals
1   1   NA
2   2    1
3   3    1
4   4   NA
5   5    1
6   6    1
7   7    1
8   8    2
9   9    3
10 10   NA
#nas column is removed since it is not numeric