2012-09-20 59 views
3

我想利用的載體,例如:只添加到負項在載體

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

,並添加1(或預先固定的任何其他數目),以在其中的值是負的條目,生產

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

有沒有一個光滑的方式來做到這一點?

回答

8

在R高爾夫比賽對於這個問題提交:

X+(X<0) 

工作,因爲(X < 0)將獲得1裹挾任何所需的情況下,0代表他人。

+0

在7個字符處,這是最短的解決方案,並且很難被擊敗。 +1 – MvG

+0

+1更一般的解決方案是'X + k *(X <0)'(對於'k!= 1')。 –

+0

謝謝喬希。我匆忙地通過了這部分,發佈這個美麗。 –

7

使用ifelse

x + ifelse(x<0, 1, 0) 
[1] 1 2 3 0 -1 -2 
3

也許不是最可讀的解決方案,但我還是會張貼了它的樂趣:

> pmax(X, X+sign(X)*(-1)) 
[1] 1 2 3 0 -1 -2 
+0

我喜歡使用符號(X)和PMAX選擇策略被可愛。 –

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。

矢量化是否勝過上面涉及的函數調用的次數我留給別人討論(我懷疑它對大多數問題有什麼影響)。

+0

感謝您的解釋 - 這是非常有用的! –

+2

我通常使用'x [x <0] < - x [x <0] + 1',只是爲了保存代碼行,但是是一樣的。 – Juan

+0

+1我認爲,但決定做兩次比較可能是昂貴的一些問題。再次,對於大多數數據集,我懷疑方法之間的差異很大。 –

0

人們可以使用其中還命令:

X <- c(1,2,3,-1,-2,-3) 
X[which(X < 0)] <- X[which(X < 0)] +1 
+1

在這種情況下,'which'是不必要的,因此是多餘的。 –