我似乎已經無意中發現了我無法解釋的一個mutate/lag/ifelse
行爲。我有以下(簡化的)數據幀:延遲不會看到突變對前一行的影響
test <- data.frame(type = c("START", "END", "START", "START", "START", "START", "END"),
stringsAsFactors = FALSE)
> test
type
1 START
2 END
3 START
4 START
5 START
6 START
7 START
8 END
我想修改列type
以具有交替的START
和END
雙序列(請注意,在test
數據幀僅START
序列是可能的, END
永不重複):
> desired
type
1 START
2 END
3 START
4 END
5 START
6 END
7 START
8 END
我以爲我可以實現我用下面的代碼的目標:
test %>%
mutate(type = ifelse(type == "START" &
dplyr::lag(type, n=1, default="END") == "START" &
dplyr::lead(type, n=1, default="END") == "START", "END" , type))
代碼應檢測其中START
由START
之前和之後一START
行,在這種情況下,type
值改變爲END
。在此更改之後,以下START
(行號5的test
)不應匹配,因爲其先前的type
值現在爲END
。不幸的是,該命令的輸出如下:
type
1 START
2 END
3 START
4 END
5 END
6 END
7 START
8 END
這就像通過lag
看到的值不會受發生變異。這是應該如何工作?有沒有辦法以lag
在前一行看到mutate
的影響的方式對其進行編碼?
版本,R 3.2.3版(2015年12月10日),dplyr_0.4.3
UPDATE:爲什麼上面的代碼不工作是由保羅Rougieux下面解釋其原因是:超前和滯後被固定並沒有考慮到進一步的修改。所以我想正確的答案是「它不能直接使用dplyr來完成」。分別在mutate()
這是否有使用方案和包你現在可以解決或者是你開放給其他的解決方案(使用其他功能)? – DatamineR
一般來說,我寧願堅持dplyr,因爲我使用它很多,我想了解這種行爲是否「正常」。但是如果你有一個依賴於其他功能的解決方案,那仍然會有很大的幫助。 – domi
'test $ type < - rep(unique(test $ type),length.out = nrow(test))'? – mtoto