문제

나는 R의 ifelse 진술이 때때로 꽤 편리하다는 것을 알았습니다. 예를 들어:

ifelse(TRUE,1,2)
# [1] 1
ifelse(FALSE,1,2)
# [1] 2

그러나 나는 다음 행동에 다소 혼란스러워합니다.

ifelse(TRUE,c(1,2),c(3,4))
# [1] 1
ifelse(FALSE,c(1,2),c(3,4))
# [1] 3

이것이 내 월급 이상의 디자인 선택입니까?

도움이 되었습니까?

해결책

문서 ifelse 상태 :

ifelse 같은 모양의 값을 반환합니다 test 어느 쪽이든 선택한 요소로 가득합니다 yes 또는 no 요소에 따라 test ~이다 TRUE 또는 FALSE.

길이 1의 테스트 값을 통과하기 때문에 길이 1의 결과를 얻습니다. 더 긴 테스트 벡터를 통과하면 더 긴 결과가 나타납니다.

> ifelse(c(TRUE, FALSE), c(1, 2), c(3, 4))
[1] 1 4

그래서 ifelse 부울 벡터를 테스트하고 (벡터)에서 가져온 요소로 채워진 같은 길이의 벡터를 반환하는 특정 목적을위한 것입니다. yes 그리고 no 논쟁.

기능의 이름 때문에 일반적인 혼란입니다. if () {} else {} 대신 건설.

다른 팁

나는 당신이 단순한 것을 원할 것입니다 if 대신 진술 ifelse - r, if 제어 흐름 구조가 아니라 값을 반환 할 수 있습니다.

> if(TRUE) c(1,2) else c(3,4)
[1] 1 2
> if(FALSE) c(1,2) else c(3,4)
[1] 3 4

결과를 할당하면 문제를 우회 할 수 있습니다. ifelse:

ifelse(TRUE, a <- c(1,2), a <- c(3,4))
a
# [1] 1 2

ifelse(FALSE, a <- c(1,2), a <- c(3,4))
a
# [1] 3 4

예, ifelse ()는 긴 테스트의 큰 벡터가 있고 각각 두 가지 옵션 중 하나에 매핑하려고 할 때 실제로 설계되었다고 생각합니다. 예를 들어, 나는 종종 이런 식으로 plot ()에 대한 색상을 수행합니다.

plot(x,y, col = ifelse(x>2,  'red', 'blue'))

긴 테스트의 큰 벡터가 있지만 출력을 위해 쌍을 원한다면 사용할 수 있습니다. sapply() 또는 plyr'에스 llply() 아니면 아마도.

다음은 Cath가 제안한 것과 유사한 접근법이지만 기존 사전 할당 된 벡터와 함께 작동 할 수 있습니다.

그것은 사용을 기반으로합니다 get() 그렇게 :

a <- c(1,2)
b <- c(3,4)
get(ifelse(TRUE, "a", "b"))
# [1] 1 2

때로는 사용자가 a가 필요합니다 switch 대신 진술 ifelse. 이 경우 :

condition <- TRUE
switch(2-condition, c(1, 2), c(3, 4))
#### [1] 1 2

(Ken Williams의 답변의 또 다른 구문 옵션입니다)

`if`, 예를 들어 사용하십시오

> `if`(T,1:3,2:4)
[1] 1 2 3

귀하의 경우 사용 if_else ~에서 dplyr 도움이되었을 것입니다 : if_else 보다 엄격합니다 ifelse, 그리고 당신의 경우에 오류를 던진다 :

library(dplyr)
if_else(TRUE,c(1,2),c(3,4))
#> `true` must be length 1 (length of `condition`), not 2
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top