3

たとえば、ベクトルを取りたいと思います。

X <-  c(1,2,3,-1,-2,-3)

値が負のエントリに 1 (または事前に固定されたその他の数値) を追加して、生成します。

1,2,3,0,-1,-2

これを行うための巧妙な方法はありますか?

4

5 に答える 5

8

この問題について R Golf コンペティションに提出:

X+(X<0)

(X<0) は、任意のケースでは強制的に 1 になり、その他のケースでは強制的に 0 になるため、機能します。

于 2012-09-20T14:49:53.717 に答える
7

ベクトル化されていますが、もう少し冗長な代替手段は次のとおりです。

> 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 を追加します。

ベクトル化が上記の関数呼び出しの数を上回るかどうかについては、他の人に議論を任せます (ほとんどの問題で違いが生じるとは思えません)。

于 2012-09-20T13:50:07.173 に答える
7

使用ifelse:

x + ifelse(x<0, 1, 0)
[1]  1  2  3  0 -1 -2
于 2012-09-20T13:40:50.400 に答える
3

おそらく最も読みやすい解決策ではありませんが、楽しみのために投稿します。

> pmax(X, X+sign(X)*(-1))
[1]  1  2  3  0 -1 -2
于 2012-09-20T13:43:26.590 に答える
0

次のコマンドも使用できます。

X <-  c(1,2,3,-1,-2,-3)
X[which(X < 0)] <- X[which(X < 0)] +1
于 2012-09-21T08:51:46.333 に答える