Как удалить столбцы с значениями NA с помощью dplyr [duplicate]

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

data.items[1].name

или

data["items"][1]["name"]

Оба способа равны.

49
задан David Arenburg 17 March 2016 в 12:39
поделиться

6 ответов

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

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

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

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

df[colSums(!is.na(df)) > 0]
89
ответ дан Axeman 25 August 2018 в 15:53
поделиться

Еще одна опция с Filter

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

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

4
ответ дан akrun 25 August 2018 в 15:53
поделиться

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

df %>% select_if(~sum(!is.na(.)) > 0)
22
ответ дан Brad Cannell 25 August 2018 в 15:53
поделиться

Другим вариантом является пакет janitor:

df <- remove_empty_cols(df)

https://github.com/sfirke/janitor

7
ответ дан jsta 25 August 2018 в 15:53
поделиться

Интуитивно понятный скрипт: dplyr::select_if(~!all(is.na(.))). В нем буквально хранятся только столбцы с отсутствующими элементами. (для удаления столбцов с отсутствием всех элементов).

> 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(~!all(is.na(.))) 
   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
6
ответ дан Sibo Jiang 25 August 2018 в 15:53
поделиться

Это похоже на то, что вы хотите удалять ТОЛЬКО столбцы со всеми 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.

21
ответ дан Simon O'Hanlon 25 August 2018 в 15:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: