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

使用ifelse

x + ifelse(x<0, 1, 0)
[1]  1  2  3  0 -1 -2
于 2012-09-20T13:40:50.400 回答
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 回答
3

也许不是最易读的解决方案,但我还是会为了好玩而发布它:

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

也可以使用 which 命令:

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