2012-08-16 64 views
1

比方說,我有2所列出sapply 2載體

divisor = c(0, 1, 1, 7, 7, 8, 8, 8, 9) 
remainder = c(99, 0, 1, 1, 99, 0, 1, 99, 0) 

我想除數元素元素+ 1如果其對應的剩餘部分不爲0 最終的答案應該是這樣的:

updated.divisor = (1, 1, 2, 8, 8, 8, 9, 9, 9) 

如何使用sapply來做到這一點?

到目前爲止,我有

sapply(remainder, function(x) { 
    if x != 0{ 
     #divisor = divisor + 1 
    } 
    else{ 
     #divisor = divisor + 0 
    } 
} 

附:我大概可以使用嵌套循環,但我希望能夠使用sapply來做到這一點。

+1

您的指定結果在描述語句中需要NOT。 – 2012-08-16 21:08:15

+0

感謝您的編輯DWin – Paolo 2012-08-16 23:10:16

回答

4

您的意見:如果你想你會使用mapply因爲它允許你來處理兩個參數「彼此一起」的應用型解決方案:

mapply(function(x,y) {x + !(y==0)}, x=divisor, y=remainder) 
#[1] 1 1 2 8 8 8 9 9 9 

ifelse解決方案將使感,太:

ifelse(remainder !=0, divisor+1, divisor) 
#[1] 1 1 2 8 8 8 9 9 9 
9

你並不需要一個循環:

divisor + (remainder!=0) 
[1] 1 1 2 8 8 8 9 9 9 

這是R的最根本的原則之一:所有的基本操作(和許多功能)接受向量作爲輸入,並執行操作該矢量的所有元素在同一時間。

+0

我不知道,謝謝你教我新的東西。如果我確實需要使用sapply,我該怎麼做? – Paolo 2012-08-16 23:11:00

+0

@ user1342697你不會在這個例子中使用'sapply'。這只是一個壞主意。如果你有另外一個問題,你認爲'sapply'是正確的事情,那麼我建議你發佈一個新問題。 – Andrie 2012-08-18 07:32:51