我有一個帶有id,排序時間值和值的數據框。對於每個ID組,我想刪除具有比具有較小時間值的行更小的值的行。按時間值排序最後的最大值排序
data <- data.frame(id = c(rep(c("a", "b"), each = 3L), "b"),
time = c(0, 1, 2, 0, 1, 2, 3),
value = c(1, 1, 2, 3, 1, 2, 4))
> data
id time value
1 a 0 1
2 a 1 1
3 a 2 2
4 b 0 3
5 b 1 1
6 b 2 2
7 b 3 4
那麼結果將是:
> data
id time value
1 a 0 1
2 a 2 2
3 b 0 3
4 b 3 4
(對於id == b
行,其中time %in% c(3, 4)
被刪除,因爲價值value
比當time
較低較小)
我在想lag
data %>%
group_by(id) %>%
filter(time == 0 | lag(value, order_by = time) < value)
Source: local data frame [5 x 3]
Groups: id [2]
id time value
<fctr> <dbl> <dbl>
1 a 0 1
2 a 2 2
3 b 0 3
4 b 2 2
5 b 3 4
但它並不像預期的那樣工作,因爲它是一個矢量化函數,所以相反,這個想法是使用「遞歸滯後函數」或檢查最後的最大值。我可以用循環遞歸地完成它,但我確信有一個更直接和更高層次的方法來完成它。
任何幫助將不勝感激,謝謝!
對不起,我會盡量把它改寫到使其更容易理解。 –
Nvm,我明白了。 –