2017-01-01 27 views
3

我想要做的是如果列b中的行等於2,那麼我想將3添加到列a中前一行的值。如果條件不滿足,那麼我不希望先前的行值發生變化。當我嘗試這段代碼時,R會加入到後續行中。而且,我將它替換爲-1的行引用並不重要,它總是添加到後續行中。如果條件得到滿足,如何將值添加到上一行

df$a[-1] <- ifelse(df$b == 2, df$a[-1] + 3, df$a[-1]) 

Have        Want 
a b        a b 
0 1        0 1 
1 3        4 3 
2 2        2 2 
2 4        2 4 
4 5        4 5 
+0

此外,您不支付額外的代碼空白的SO,它包含在會員計劃。 – hrbrmstr

回答

2

另一種方法

df <- data.frame(a=c(0, 1, 2, 2, 3), 
      b=c(1, 3, 2, 4, 4)) 

df$a[c(df$b[-1], 0) == 2] <- df$a[c(df$b[-1], 0) == 2] + 3 
+0

您可能想將常見情況分解爲單獨的行。 –

+0

謝謝你這爲我工作。 – grig109

3

一個解決方案:

我覺得最簡單的辦法與載體直接工作,像這樣:

df$a <- df$a + c((df$b[-1] == 2) * 3, 0) 

問題與您的代碼:

由於第一個參數的每個元素df$b==2與下一行df$a相匹配。讓我們看一下例子在你的問題來說明:

df <- data.frame(a=c(0,1,2,2,4), b=c(1,3,2,4,5)) # As in your question 

這裏,df$b==2相當於c(FALSE, FALSE, TRUE, FALSE, FALSE)

df$a[-1]df$a的所有元素,除了第一個,即相當於c(1,2,2,4)。由於參數長度不同,df$a[-1]的第一個元素被重複/循環使用,如c(1,2,2,4,1)

因此,在發言中,df$b==2第一元件相匹配的df$a[-1]第一元件,或df$a第二元件(即,隨後的行),以及df$b==2第二元件相匹配的第三元件df$a

在這個例子中,您的代碼會給出以下的輸出:

ifelse(df$b==2, df$a[-1]+3, df$a[-1]) 
# Output: 1 2 5 4 1 

的一種方式來調整你的代碼:

因爲你想的df$b第二個元素比較第一df$a等,可以按如下方式調整你的代碼:

df$a[-nrow(df)] <- ifelse(df$b[-1]==2, df$a+3, df$a) 

如果我的任何解釋都不清楚,請隨時發表評論,我會盡力幫助!

+1

感謝您的詳細解釋。它幫助我更好地理解我最初的嘗試的邏輯,以及爲什麼失敗。 – grig109

相關問題