Подмножество строк, содержащих NA (отсутствующие) значения в выбранном столбце фрейма данных - PullRequest
83 голосов
/ 02 ноября 2011

У нас есть фрейм данных из файла CSV. Фрейм данных DF имеет столбцы, которые содержат наблюдаемые значения, и столбец (VaR2), который содержит дату, когда было выполнено измерение. Если дата не была записана, файл CSV содержит значение NA для отсутствующих данных.

Var1  Var2 
10   2010/01/01
20   NA
30   2010/03/01

Мы хотели бы использовать команду subset для определения нового фрейма данных new_DF, чтобы он содержал только те строки, которые имеют значение NA' из столбца (VaR2). В приведенном примере только строка 2 будет содержаться в новом DF.

Команда

new_DF<-subset(DF,DF$Var2=="NA") 

не работает, в результирующем фрейме данных нет записей строк.

Если в исходном CSV-файле значение NA заменено на NULL, та же команда дает желаемый результат: new_DF<-subset(DF,DF$Var2=="NULL").

Как заставить этот метод работать, если для строки символов в исходном CSV-файле указано значение NA?

Ответы [ 6 ]

126 голосов
/ 02 ноября 2011

Никогда не используйте == 'NA' для проверки пропущенных значений.Вместо этого используйте is.na().Это должно сделать это:

new_DF <- DF[rowSums(is.na(DF)) > 0,]

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

new_DF <- DF[is.na(DF$Var),]

Если у вас есть значения символов NA, первый запуск

Df[Df=='NA'] <- NA

, чтобы заменить их пропущенными значениями.

37 голосов
/ 02 ноября 2011

NA - это специальное значение в R, не путайте значение NA со строкой «NA».В зависимости от способа импорта данных ваши ячейки «NA» и «NULL» могут быть различного типа (поведение по умолчанию - преобразовать строки «NA» в значения NA и оставить строки «NULL» как есть).

Если вы используете read.table () или read.csv (), вы должны учитывать аргумент «na.strings» для чистого импорта данных и всегда работать с реальными значениями R NA.

AnНапример, работая в обоих случаях ячейки "NULL" и "NA":

DF <- read.csv("file.csv", na.strings=c("NA", "NULL"))
new_DF <- subset(DF, is.na(DF$Var2))
26 голосов
/ 03 ноября 2017

complete.cases дает TRUE, когда все значения в строке не NA

DF[!complete.cases(DF), ]
5 голосов
/ 27 июля 2018
new_data <- data %>% filter_all(any_vars(is.na(.))) 

Это должно создать новый фрейм данных (new_data) с пропущенными значениями.

Лучше всего работает для отслеживания значений, которые вы можете позже отбросить, потому что в них есть несколько столбцов с пропущенными наблюдениями (NA).

3 голосов
/ 22 ноября 2017

Попробуйте изменить это:

new_DF<-dplyr::filter(DF,is.na(Var2)) 
0 голосов
/ 29 мая 2016

Печатает все строки с данными NA:

tmp <- data.frame(c(1,2,3),c(4,NA,5));
tmp[round(which(is.na(tmp))/ncol(tmp)),]
...