Підмножина рядків, що містять значення NA (відсутні) у вибраному стовпці кадру даних


96

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

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

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

Команда

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

не працює, отриманий фрейм даних не має записів рядків.

Якщо у вихідному файлі CSV цінний NAобмінюються з NULL, та ж команда виробляє бажаний результат: new_DF<-subset(DF,DF$Var2=="NULL").

Як я можу змусити цей метод працювати, якщо для рядка символів значення NAнадається у вихідному файлі CSV?

Відповіді:


146

Ніколи не використовуйте == 'NA' для перевірки відсутніх значень. Використовуйте is.na()замість цього. Це має зробити це:

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

або якщо ви хочете перевірити певний стовпець, ви також можете використовувати

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

Якщо у вас є значення символів NA, спочатку запустіть

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

щоб замінити їх відсутніми значеннями.


2
Дякуємо за вашу швидку відповідь (це було швидко)! Дійсно, через csv-доставку даних, 'NA' - це символьні значення, і ваше друге твердження може бути дуже корисним. Чи можете ви також пояснити своє перше твердження? Використання rowSums () для мене незрозуміле, оскільки я перевірятиму лише певний стовпець (стовпців багато). Якщо у цьому конкретному стовпці (у прикладі це буде стовпець Var2) є рядок символів 'NA' (я заміню його вашим другим твердженням), тоді я хотів би вибрати весь рядок як частину нового кадру даних .
Джон

@ John: оновлено. Суть полягає у використанні is.na, я неправильно інтерпретував, що ви хотіли перевірити всі змінні.
Джоріс Мейс,

3
це повинно бути new_DF <- DF[is.na(DF$Var),], тобто після цього здається зайва (дужка DF[?
PatrickT

39

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))

1
Дякую за вашу відповідь. Якщо я правильно розумію, перше твердження буде робити те саме, що Df [Df == 'NA'] <- NA у прикладі Йоріса? Тоді (невеликою) різницею буде те, що це робиться у вашому статусі безпосередньо на початку, коли створюється фрейм даних (це дуже чистий метод програмування, і тому мені це подобається).
Джон

Точно так. Йоріс запропонував замінити рядки "NA" значеннями NA вручну, тут я пропоную лише використовувати функцію "na.strings" read.table () для досягнення тієї ж мети.
maressyl

Відповідь Йоріса насправді є «кращим» способом досягнення цього подвигу (якщо ви пишете це сценарієм). Див .: stackoverflow.com/questions/9860090/…
Джонатан

@ Джонатан: Дві різні ідеї тут, тема, яку ви цитуєте, говорить, що "[" слід віддавати перевагу "підмножині", але ми говорили про аргумент "na.strings" у read.table (), моя підмножина була тут лише для візуалізації ефект.
maressyl


12
new_data <- data %>% filter_all(any_vars(is.na(.))) 

Це має створити новий фрейм даних (new_data ) із лише відсутніми значеннями.

Найкраще працює для відстеження значень, які ви можете пізніше скинути, оскільки вони мали деякі стовпці з відсутніми спостереженнями (NA).


3

Спробуйте змінити це:

new_DF<-dplyr::filter(DF,is.na(Var2)) 

Не могли б ви пояснити, чому це працює, що це робить тощо?
csilk

new_DF <-dplyr :: filter (DF, is.na (Var2)) він, в основному, використовує функцію фільтра пакета dplyr і відфільтровує будь-яке спостереження у стовпці Var2, що задовольняє умові is.na, тобто вони вибирають все спостереження з NA
drhnis

1
Більш красиво виражене як DF %>% filter(is.na(Var2))після library(dplyr).
Джо

-1

Друкує всі рядки з даними NA:

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

@ZheyuanLi Якщо вам не подобається відповідь, просто проголосуйте за неї. Редагування відповіді, щоб рекомендувати позначення, НЕ є відповідною дією. Залиште коментар, якщо відчуваєте необхідність.
Манфред Радлвіммер,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.