У меня есть data.frame, содержащий несколько столбцов со всеми значениями NA, как я могу их удалить из data.frame.
Можно ли использовать функцию
na.omit(...)
с указанием дополнительных аргументов?
У меня есть data.frame, содержащий несколько столбцов со всеми значениями NA, как я могу их удалить из data.frame.
Можно ли использовать функцию
na.omit(...)
с указанием дополнительных аргументов?
Один из способов сделать это:
df[, colSums(is.na(df)) != nrow(df)]
Если число NA в столбце равно количеству строк, оно должно быть полностью NA.
Или аналогично
df[colSums(!is.na(df)) > 0]
Кажется, вы хотите удалить столбцы ТОЛЬКО с ВСЕ 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
.
Вот решение dplyr:
df %>% select_if(~sum(!is.na(.)) > 0)
Другой вариант с Filter
Filter(function(x) !all(is.na(x)), df)
ПРИМЕЧАНИЕ. Данные из сообщения @Simon O'Hanlon.
Другим вариантом является пакет janitor
:
df <- remove_empty_cols(df)
Просто используйте 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