2017-01-19 384 views
4

我有一個帶有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 

但它並不像預期的那樣工作,因爲它是一個矢量化函數,所以相反,這個想法是使用「遞歸滯後函數」或檢查最後的最大值。我可以用循環遞歸地完成它,但我確信有一個更直接和更高層次的方法來完成它。

任何幫助將不勝感激,謝謝!

+0

對不起,我會盡量把它改寫到使其更容易理解。 –

+0

Nvm,我明白了。 –

回答

3

這裏是一個data.table溶液:

library(data.table) 
setDT(data) 
data[, myVal := cummax(c(0, shift(value)[-1])), by=id][value > myVal][, myVal := NULL][] 
    id time value 
1: a 0  1 
2: a 2  2 
3: b 0  3 
4: b 3  4 

鏈的第一部分使用shiftcummax創建的滯後值變量的累積最大。在c(0, shift(value)[-1])中,添加0以提供比任何變量中的任何值更高的值。更一般地說,您可以使用min(value)-1[-1]子集刪除shift的第一個元素,即NA。鏈的第二部分選擇觀察值,其中值大於累積最大值。最後兩個鏈去除累積最大變量並打印出結果。

0

以下是dplyr的選項。通過「ID」分組之後,我們filter其中,「價值」是比「價值」的「滯後」的累計最高更大的行列

library(dplyr) 
data %>% 
    group_by(id) %>% 
    filter(value > cummax(lag(value, default = 0))) 
#  id time value 
# <fctr> <dbl> <dbl> 
#1  a  0  1 
#2  a  2  2 
#3  b  0  3 
#4  b  3  4 

或者另一種選擇是slicearrange荷蘭國際集團由「ID」和「時間」(當OP提到關於order

data %>% 
    group_by(id) %>% 
    arrange(id, time) %>% 
    slice(which(value > cummax(lag(value, default = 0)))) 
+0

(我不是downvoter)感謝這個解決方案,它只適用於數據幀以前由'id'和'time'命令嗎? –

3

另一種選擇是執行自抗/非聯接球菌使用data.table

library(data.table) # v1.10.0 
setDT(data)[!data, on = .(id, time > time, value <= value)] 
# id time value 
# 1: a 0  1 
# 2: a 2  2 
# 3: b 0  3 
# 4: b 3  4 

這基本上是說:「如果time較大,但value是不太平等的,那麼我不希望這些行(!號)

+1

邪惡的聰明!我不知道非Equi連接 - 謝謝。 –

+0

@ JoshO'Brien,謝謝。它是在最新版本中添加的,我一直在尋找不同的用途。 –