데이터 프레임의 선택한 열에서 NA (결측) 값을 포함하는 행의 하위 집합


96

CSV 파일의 데이터 프레임이 있습니다. 데이터 프레임 DF에는 관찰 된 값이 포함 된 열과 VaR2측정이 수행 된 날짜가 포함 된 열 ( )이 있습니다. 날짜가 기록되지 않은 경우 CSV 파일에는 NA누락 된 데이터에 대한 값이 포함 됩니다.

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

하위 집합 명령을 사용 하여 열 ( ) new_DFNA'값 이있는 행만 포함 하도록 새 데이터 프레임을 정의하려고 VaR2합니다. 주어진 예에서 행 2 만 새 DF.

명령

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

작동하지 않으면 결과 데이터 프레임에 행 항목이 없습니다.

원본 CSV 파일에서 값 NA이와 교환되는 NULL경우 동일한 명령이 원하는 결과를 생성합니다 new_DF<-subset(DF,DF$Var2=="NULL")..

문자열의 값 NA이 원본 CSV 파일에 제공된 경우이 방법을 어떻게 작동시킬 수 있습니까?

답변:


145

결 측값을 테스트하기 위해 == '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

@John : 업데이트되었습니다. 요점은 is.na를 사용하는 것인데, 모든 변수를 확인하고 싶다고 잘못 해석했습니다.
Joris Meys 2011

3
그것은해야 new_DF <- DF[is.na(DF$Var),]여분이있을 나타납니다, 즉 (후 브라켓 DF[?
PatrickT 2013

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
답변 해 주셔서 감사합니다. 내가 그것을 올바르게 이해한다면 첫 번째 문장은 Joris의 예에서 Df [Df == 'NA'] <-NA와 똑같이 할 것입니다. (작은) 차이점은 데이터 프레임이 생성 될 때 처음에 귀하의 진술에서 직접 수행된다는 것입니다 (이것은 매우 깨끗한 프로그래밍 방법이므로 좋아합니다).
John

바로 그거죠. Joris는 수동으로 "NA"문자열을 NA 값으로 대체 할 것을 제안했습니다. 여기서는 동일한 목적을 달성하기 위해 read.table ()의 "na.strings"기능을 사용하는 것이 좋습니다.
maressyl 2011

Joris의 대답은 실제로이 위업을 달성하기 위해 "선호되는"방법입니다 (스크립트로 작성하는 경우). 참조 : stackoverflow.com/questions/9860090/…
Jonathan

@Jonathan : 여기에 두 가지 별개의 아이디어가 있습니다. 인용 한 주제는 "서브 세트"에서 "["를 선호해야합니다.하지만 read.table ()에서 "na.strings"인수에 대해 이야기했습니다. 제 서브 세트는 시각화를 위해서만 여기에있었습니다. 그 효과들.
maressyl

32

complete.cases제공 TRUE행의 모든 값이 없을 때NA

DF[!complete.cases(DF), ]

11
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 :: 필터 (DF, is.na (변수 2를 대입 할 때 변수))는 기본적으로 그들이 모두에게 NA와 관찰을 선택, 즉 is.na 조건을 만족하는 변수 2를 대입 할 때 변수 열에있는 모든 관측에서 dplyr 패키지 필터의 필터 함수를 사용하여
drhnis nov.

1
더 좋게 표현 DF %>% filter(is.na(Var2))library(dplyr).
Joe

-1

NA 데이터가있는 모든 행을 인쇄합니다.

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

@ZheyuanLi 답변이 마음에 들지 않으면 아래로 투표하세요. 추천 플래그에 대한 답변을 편집하는 것은 적절한 조치가 아닙니다. 필요하다고 생각되면 댓글을 남겨주세요.
Manfred Radlwimmer 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.