2013-06-18 4 views
0

하나의 열에 yes, noNA의 항목이 들어있는 데이터 세트가 있습니다. 어떤 NA1으로 대체하고 이 아닌 NA 항목을 대체하고 싶습니다. Ifelse은 비 항목을 0으로 바꿉니다. NA 항목을 1으로 대체하지 않습니다. 나는 그것에 대한 is.na() 명령을 사용해야합니다. is.na()ifelse이 작동하지 않는 이유는 무엇입니까?Ifelse가 NA를 대체하지 못하는 이유는 무엇입니까?

필자는 데이터를 얻은 이후로 요소로 정의 된 열로 시작하는 아래의 재현 가능한 예제를 정의합니다.

q <-as.factor(c(NA, "yes", "no", "yes", NA)) 

    ## Does not work 
    q <- ifelse(q == "NA", 1, 0) 
q  
### Returns: [1] NA 0 0 0 NA 

    ## Does not work 
    q[q == "NA"] <- 1 
q  
### Returns: [1] NA 0 0 0 NA  

    ## This works 
    q[is.na(q)] <- 1 
q 
### Returns: [1] 1 0 0 0 1 

일부 다른 항목이 있지만이 정확한 문제는없는 것으로 보입니다. https://stackoverflow.com/a/8166616/1364839 -이 대답은 is.na()이 작동하지만 왜 ifelse이 실패하지 않는지를 보여줍니다.

+3

'ifelse'에는 아무런 문제가 없습니다. 당신은 두 가지 완전히 다른 논리 비교를하고 있습니다. 문자열 "NA"는 'NA'와는 아무런 관련이 없습니다. – joran

+0

'? base :: Logic'과'? NA'를 읽으십시오. –

+0

ifelse에서 'NA'를 직접 참조하려면 어떻게해야합니까? –

답변

3

여기에 ifelse()이 필요하지 않습니다. 뭔가의 가치를 모르면 (적어도 NA은 무엇입니까?) 그 값을 다른 것과 어떻게 비교할 수 있습니까?

> NA == NA ## yes, even NA can't be compared with itself 
[1] NA 

대신, 뭔가 NA인지 여부를 식별 할 수 is.na()를 사용합니다. is.na()은 요소가 NA이고 FALSE 인 경우 TRUE을 반환합니다. 그 다음 + 제외하고 같은 트릭을 통해

> is.na(q) + 0 
[1] 1 0 0 0 1 

작품이 당신을 위해 강압을하고 너무 많은 입력 인 경우

q <-as.factor(c(NA, "yes", "no", "yes", NA)) 
q 

as.numeric(is.na(q)) 

> as.numeric(is.na(q)) 
[1] 1 0 0 0 1 

: 그럼 우리가 FALSE == 0TRUE == 1 우리가 숫자에 강제 사실을 사용할 수 있습니다 .

+0

대단히 감사합니다! 또한 위의 @ SimonO101은 또 다른 접근법으로'ifelse (is.na (q), 1, 0) '을 지적했습니다. –

+1

@DTRM 사실, 만약 당신이'ifelse'의 배짱이를 보았다면, 이런 식으로 지나치게 잔인하다는 것을 알 수 있습니다. 아마도 일반적으로 유용 할 수 있지만 질문에 대해서는 그렇지 않습니다. –

관련 문제