왜 r의 ifelse 문장이 벡터를 반환 할 수 없습니까?
-
20-09-2019 - |
문제
나는 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