Подмножество строк, содержащих значения NA (отсутствует) в выбранном столбце кадра данных
У нас есть кадр данных из файла CSV. В кадре данных DF
имеются столбцы, содержащие наблюдаемые значения и столбец (VaR2
), который содержит дату, в которую было выполнено измерение. Если дата не была записана, файл CSV содержит значение NA
, для отсутствия данных.
Var1 Var2
10 2010/01/01
20 NA
30 2010/03/01
Мы хотели бы использовать команду подмножества для определения нового фрейма данных new_DF
, чтобы он содержал только строки со значением NA'
из столбца (VaR2
). В приведенном примере в новом DF
будет содержаться только строка 2.
Команда
new_DF<-subset(DF,DF$Var2=="NA")
не работает, результирующий фрейм данных не имеет записей в строке.
Если в исходном CSV файле значение NA
обменивается с NULL
, эта же команда дает желаемый результат: new_DF<-subset(DF,DF$Var2=="NULL")
.
Как я могу заставить этот метод работать, если для символьной строки значение NA
указано в исходном CSV файле?
Ответы
Ответ 1
Никогда не используйте == 'NA' для проверки отсутствующих значений. Вместо этого используйте is.na()
. Это должно сделать это:
new_DF <- DF[rowSums(is.na(DF)) > 0,]
или если вы хотите проверить конкретный столбец, вы также можете использовать
new_DF <- DF[is.na(DF$Var),]
Если у вас есть значения символов NA, сначала запустите
Df[Df=='NA'] <- NA
чтобы заменить их отсутствующими значениями.
Ответ 2
NA - специальное значение в R, не смешивайте значение NA с строкой "NA". В зависимости от способа импорта данных ваши ячейки "NA" и "NULL" могут иметь различный тип (поведение по умолчанию заключается в преобразовании строк "NA" в значения NA, а строки "NULL" - как есть).
Если вы используете read.table() или read.csv(), вы должны рассмотреть аргумент "na.strings" для чистого импорта данных и всегда работать с реальными значениями R NA.
Пример, работающий в обоих случаях: "NULL" и "NA":
DF <- read.csv("file.csv", na.strings=c("NA", "NULL"))
new_DF <- subset(DF, is.na(DF$Var2))
Ответ 3
complete.cases
дает TRUE
, когда все значения в строке не NA
DF[!complete.cases(DF), ]
Ответ 4
Попробуйте изменить это:
new_DF<-dplyr::filter(DF,is.na(Var2))
Ответ 5
Печатает все строки с данными NA:
tmp <- data.frame(c(1,2,3),c(4,NA,5));
tmp[round(which(is.na(tmp))/ncol(tmp)),]