我想取一个向量,例如:
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。
使用ifelse
:
x + ifelse(x<0, 1, 0)
[1] 1 2 3 0 -1 -2
一种矢量化但略显冗长的替代方法是:
> 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。
向量化是否超过了上面涉及的函数调用的数量,我留给其他人讨论(我怀疑它对大多数问题有什么影响)。
也许不是最易读的解决方案,但我还是会为了好玩而发布它:
> pmax(X, X+sign(X)*(-1))
[1] 1 2 3 0 -1 -2
也可以使用 which 命令:
X <- c(1,2,3,-1,-2,-3)
X[which(X < 0)] <- X[which(X < 0)] +1