我想利用的載體,例如:只添加到負項在載體
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高爾夫比賽對於這個問題提交:
X+(X<0)
工作,因爲(X < 0)將獲得1裹挾任何所需的情況下,0代表他人。
使用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)和PMAX選擇策略被可愛。 –
是矢量化的選擇,但稍微詳細是:
> 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。
矢量化是否勝過上面涉及的函數調用的次數我留給別人討論(我懷疑它對大多數問題有什麼影響)。
感謝您的解釋 - 這是非常有用的! –
我通常使用'x [x <0] < - x [x <0] + 1',只是爲了保存代碼行,但是是一樣的。 – Juan
+1我認爲,但決定做兩次比較可能是昂貴的一些問題。再次,對於大多數數據集,我懷疑方法之間的差異很大。 –
人們可以使用其中還命令:
X <- c(1,2,3,-1,-2,-3)
X[which(X < 0)] <- X[which(X < 0)] +1
在這種情況下,'which'是不必要的,因此是多餘的。 –
在7個字符處,這是最短的解決方案,並且很難被擊敗。 +1 – MvG
+1更一般的解決方案是'X + k *(X <0)'(對於'k!= 1')。 –
謝謝喬希。我匆忙地通過了這部分,發佈這個美麗。 –