一個解決方案:
我覺得最簡單的辦法與載體直接工作,像這樣:
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)
如果我的任何解釋都不清楚,請隨時發表評論,我會盡力幫助!
此外,您不支付額外的代碼空白的SO,它包含在會員計劃。 – hrbrmstr