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
これは私の給与水準を超える設計上の選択ですか?
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
の要素がisまたは。のいずれか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() は、テストの大きな長いベクトルがあり、それぞれを 2 つのオプションのいずれかにマップしたい場合のために設計されていると思います。たとえば、私はしばしば次のように plot() の色を設定します:
plot(x,y, col = ifelse(x>2, 'red', 'blue'))
テストの非常に長いベクトルがあり、出力のペアが必要な場合は、おそらく or などsapply()
を使用できます。plyr
llply()
これはCathによって提案されたものと同様のアプローチですが、既存の事前に割り当てられたベクトルで機能します
これは、次のget()
ようなものを使用することに基づいています。
a <- c(1,2)
b <- c(3,4)
get(ifelse(TRUE, "a", "b"))
# [1] 1 2
あなたの場合、if_else
fromを使用する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
everydroprで見つかりました:
ifelse(rep(TRUE, length(c(1,2))), c(1,2),c(3,4))
#>[1] 1 2
条件の結果を複製して、目的の長さを返すことができます