2012-01-18 2 views
8

R의 if-else 루프가 잘못된 부분을 누군가에게 말해 줄 수 있습니까? 나는 자주 if-else 루프를 작동시킬 수 없다. data는 데이터 프레임간단한 if-else 루프의 R

if(match('SubjResponse',names(data))==NA) { 
    observed <- data$SubjResponse1 
} 
else { 
    observed <- data$SubjResponse 
} 

하는 것으로 : 오류가 발생합니다.

오류는 이것은 우리가 데이터를 가지고 있지 않는 한 전체 예가 아니다

Error in if (match("SubjResponse", names(data)) == NA) { : 
    missing value where TRUE/FALSE needed 

답변

2

@DirkEddelbuettel에서 설명한대로 NA을 테스트 할 수 없습니다. 하지만 당신은 matchNA를 반환하지 만들 수 있습니다 nomatch=0를 사용하고 (0FALSE로 취급되기 때문에)을 if 절을 반전하여

는 코드를 단순화 할 수있다. 또한, 또 다른 유용한 코딩 관용구는

그래서 나는이처럼 쓸 것 ...은 if 절, 당신이 가지 중 하나에 변수 이름을 잘못 입력하지 않습니다 그런 식의 결과를 할당하는 것입니다 :

당신이 "자주", 당신은 두 가지 알아야 할 경우-다른 문제가있는 경우 그런데
observed <- if(match('SubjResponse',names(data), nomatch=0)) { 
    data$SubjResponse # match found 
} else { 
    data$SubjResponse1 # no match found 
} 

:

  1. (문자열을 NA 또는 NaN이를 포함하거나해서는 안 테스트하는 객체 모드 문자) 또는 논리 값으로 강제 변환 할 수없는 다른 유형을 사용할 수 있습니다. 숫자는 OK : 0은 FALSE입니다. 단, NA/NaN 이외의 문자는 TRUE입니다.

  2. 개체의 길이는 정확히 1 (스칼라 값)이어야합니다. 그것은 수 있습니다 더 이상하지만 경고를 얻을. 길이가 더 짧으면 오류가 발생합니다.

예 :

len3 <- 1:3 
if(len3) 'foo' # WARNING: the condition has length > 1 and only the first element will be used 

len0 <- numeric(0) 
if(len0) 'foo' # ERROR: argument is of length zero 

badVec1 <- NA 
if(badVec1) 'foo' # ERROR: missing value where TRUE/FALSE needed 

badVec2 <- 'Hello' 
if(badVec2) 'foo' # ERROR: argument is not interpretable as logical 
7

하지만 나는이 문제를 참조하십시오

  1. 당신 을 할 수 ==NA에 대한하지 테스트, 당신 필요 is.na()
  2. 마찬가지로 match() 및 친구의 출력은 보통 NULL 또는에 대해 테스트됩니다.3210
  3. 나는 한 줄에 } else {을 쓰는 경향이있다.
+0

'match'는 항상 * * 첫번째 인수 ('x')과 같은 길이의 벡터를 리턴한다. 따라서이 경우 항상 스칼라 값입니다. – Tommy

+0

'The R Inferno'의 Circle 8.1.4 http://www.burns-stat.com/pages/Tutor/R_inferno.pdf –