2015-12-03 33 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