2014-11-12 4 views
12

간단한 문제가 있지만이를 극복하기위한 논리를 파악할 수 없습니다.아래 첨자 할당에는 NAS를 사용할 수 없습니다.

나는 NAs가있는 숫자 벡터를 가지며 조건 종속 연산을 적용하려고합니다.

x <- c(1,3,5,7,NA,2,4,6) 
x[x>=5] <- c(1:8)[x>=5] 
x[x<5] <- (c(1:8)*10)[x<5] 

그것은 "의 NA가 첨자 지정에 사용할 수 없습니다"라는 오류를 반환, 그래서 나는 그것에 대해 합리적인 해결책이 될 것이 무엇인지 알고 싶습니다 :

내 문제와 유사한 간단한 예입니다 각 속성을 실행하면 예상대로 작동합니다.

나는의 예상 결과를 가지고 싶다 : 바람직

[1] 10 20 3 4 NA 60 70 8 

을이 작업은 나이를 취하고 반복이 많은 널 (null) 모델링 기능에 이미로, 루프를하지 않고도.

난 당신이 할당 및 첨자를 혼용 생각, 사전에 레오나르도

+2

이것은 매우 흥미 롭습니다. RHS에 하나 이상의 값이있는 경우에만 하위 집합과 할당을하는 동안 정수를 'NA'와 결합 할 수없는 것 같습니다. 'x [c (NA, 1)] <- 100'과 'x [NA] <- 100'는 모두 작동하며'x [c (NA, 1)] <- 100 : 101' 또는 'x [NA] <- 100 : 101'은 –

+2

이 아닙니다.이 오류 메시지가 표시 될 때마다 중요한 질문입니다. 그러나 코드에서 NA로 인해 발생하는 오류없이 실행 되더라도 예상되는 결과가 나오지는 않습니다. 코드의 2 번째 줄은 위의 3과 4의 결과를 예측하는 데 사용한 5와 7의 원래 값을 (30과 40 대신) 덮어 쓰며 3 행이 호출 될 때 3과 4가됩니다. 그것들은 30과 40이됩니다.'x [x> = 5 &! is.na (x)] <- c(1:8)[x> = 5 &! is.na (x)]; x (x)] <- (c (1 : 8) * 10) [x <5,! is (na) –

답변

8

당신의 논리는 또한 하위 집합의 NA를 배제 할 필요가 있습니다. 다음 예제를 참조하십시오. x이 수정되기 전에 부분 집합 벡터가 저장된다는 점에 유의하십시오.

x <- c(1,3,5,7,NA,2,4,6) 
subset1 <- x>=5 & !is.na(x) 
subset2 <- x<5 & !is.na(x) 

x[subset1] <- which(subset1) 
x[subset2] <- 10*which(subset2) 
0

을 주셔서 감사합니다. 당신이 한 일이 이것에 더 가깝다고 생각합니다 :

x <- c(1,3,5,7,NA,2,4,6) 
x.greater <- c(1:8)[x>=5] 
x.less <- (c(1:8)*10)[x<5] 

x.greater 
# 3 4 NA 8 
x.less 
# 10 20 NA 60 70 

result <- c(x.greater, x.less) 
result 
# 3 4 NA 8 10 20 NA 60 70