2015-12-03 5 views
1

Мне нужно найти действующий максимум переменной по группе, используя R. Переменная сортируется по времени внутри группы, используя df [order (df $ group, df $ time),].Поиск максимального действия по группе в R

У моей переменной есть NA, но я могу справиться с ней, заменив их нулями для этого вычисления.

это как кадр данных 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

'пр()' и '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] 

Как прокомментировал @Michael Кирико, если данные не order ред 'времени', мы можем сделать это в 'я'

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

Или с dplyr

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

Просто проверка надежности: если это необязательно упорядочено по 'time', вы можете добавить' setDT (df1) [order (time), curMax: = cummax (var), by = group] ' – MichaelChirico

 Смежные вопросы

  • Нет связанных вопросов^_^