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から選択された要素で埋められたのと同じ形状の値を返します。yesnotestTRUEFALSE
長さ1のテスト値に合格しているため、長さ1の結果が得られます。より長いテストベクトルに合格すると、より長い結果が得られます。
> ifelse(c(TRUE, FALSE), c(1, 2), c(3, 4))
[1] 1 4
したがって、ブール値のベクトルをテストし、(ベクトル)と引数ifelseから取得した要素で満たされた同じ長さのベクトルを返すという特定の目的を目的としています。yesno
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()を使用できます。plyrllply()
これはCathによって提案されたものと同様のアプローチですが、既存の事前に割り当てられたベクトルで機能します
これは、次のget()ようなものを使用することに基づいています。
a <- c(1,2)
b <- c(3,4)
get(ifelse(TRUE, "a", "b"))
# [1] 1 2
あなたの場合、if_elsefromを使用する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
条件の結果を複製して、目的の長さを返すことができます