2015-12-03 35 views
1

我需要使用R按組查找變量的運行最大值。該變量使用df [order(df $ group,df $ time),]按組內的時間排序。按R中的組查找運行最大值

我的變量有一些不適用,但我可以通過將它們替換爲零來處理此計算。

這是該數據幀DF的樣子:

(df <- structure(list(var = c(5L, 2L, 3L, 4L, 0L, 3L, 6L, 4L, 8L, 4L), 
       group = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), 
           .Label = c("a", "b"), class = "factor"), 
       time = c(1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L)), 
      .Names = c("var", "group","time"), 
      class = "data.frame", row.names = c(NA, -10L))) 

# var group time 
# 1 5  a 1 
# 2 2  a 2 
# 3 3  a 3 
# 4 4  a 4 
# 5 0  a 5 
# 6 3  b 1 
# 7 6  b 2 
# 8 4  b 3 
# 9 8  b 4 
# 10 4  b 5 

而且我希望有一個變量curMax爲:

var | group | time | curMax 
5  a   1   5 
2  a   2   5 
3  a   3   5 
4  a   4   5 
0  a   5   5 
3  b   1   3 
6  b   2   6 
4  b   3   6 
8  b   4   8 
4  b   5   8 

請讓我知道如果你有任何想法如何實現它在R.

+2

'AVE()'和'cummax()' – jogo

+1

發現這個問題的一個可能重複。它的答案不是很好,但:http://stackoverflow.com/q/11675526/1191259 – Frank

+1

@akrun無論哪種方式。我也很好地連接它們。只是想我會提到它。 – Frank

回答

3

你能做到這樣:

df$curMax <- ave(df$var, df$group, FUN=cummax) 
+0

謝謝!這看起來像一個非常好的答案,我不知道有cummax功能,我會用這個! – olga

5

我們可以試試data.table。轉換「data.frame」到「data.table」(setDT(df1)),通過「組」分組,我們得到的「變種」的cummax和分配(:=)到一個新的變量(「curMax」)

library(data.table) 
setDT(df1)[, curMax := cummax(var), by = group] 

正如評論由@邁克爾·基里科,如果數據不order通過「時間」主編,我們可以做的是,在「我」

setDT(df1)[order(time), curMax:=cummax(var), by = group] 

或用dplyr

library(dplyr) 
df1 %>% 
    group_by(group) %>% 
    mutate(curMax = cummax(var)) 
+3

只是一個健壯性檢查:如果它不一定按'時間'排序,您可以添加'setDT(df1)[order(time),curMax:= cummax(var),by = group]' – MichaelChirico