たとえば、ベクトルを取りたいと思います。
X <- c(1,2,3,-1,-2,-3)
値が負のエントリに 1 (または事前に固定されたその他の数値) を追加して、生成します。
1,2,3,0,-1,-2
これを行うための巧妙な方法はありますか?
たとえば、ベクトルを取りたいと思います。
X <- c(1,2,3,-1,-2,-3)
値が負のエントリに 1 (または事前に固定されたその他の数値) を追加して、生成します。
1,2,3,0,-1,-2
これを行うための巧妙な方法はありますか?
この問題について R Golf コンペティションに提出:
X+(X<0)
(X<0) は、任意のケースでは強制的に 1 になり、その他のケースでは強制的に 0 になるため、機能します。
ベクトル化されていますが、もう少し冗長な代替手段は次のとおりです。
> X <- c(1,2,3,-1,-2,-3)
> want <- X < 0
> X[want] <- X[want] + 1
> X
[1] 1 2 3 0 -1 -2
重要なステップは、X が負のインデックスを生成することです ( want
)。次に、これを使用してインデックスを作成X
し、これらにのみ 1 を追加します。
ベクトル化が上記の関数呼び出しの数を上回るかどうかについては、他の人に議論を任せます (ほとんどの問題で違いが生じるとは思えません)。
使用ifelse
:
x + ifelse(x<0, 1, 0)
[1] 1 2 3 0 -1 -2
おそらく最も読みやすい解決策ではありませんが、楽しみのために投稿します。
> pmax(X, X+sign(X)*(-1))
[1] 1 2 3 0 -1 -2
次のコマンドも使用できます。
X <- c(1,2,3,-1,-2,-3)
X[which(X < 0)] <- X[which(X < 0)] +1