Вычислить максимальное значение по группе и по времени в R

#r #max #aggregate

#r #max #агрегировать

Вопрос:

Для следующих данных панели (отслеживание значения для единицы «ID» по «Времени» :

 ID=c(1,1,1,1,2,2,2,2)
Time=c(1,2,3,4,1,2,3,4)
Value=c(1,5,4,8,2,5,9,7)
 

Я хотел бы создать вектор, который является максимальным значением для каждого «идентификатора» и по «Времени»

Выходной вектор «Max_Value» будет выглядеть следующим образом:

 Max_Value=c(1,5,5,8,2,5,9,9)
 

Чтобы уточнить, вот как вычисляется Max_Value для идентификатора «1».

Для идентификатора «1» максимальное значение для параметра «Time = 1» равно 1, что является максимальным значением {1}.

Аналогично, для идентификатора «1» максимальное значение по «Time = 2» равно 5, что является максимальным значением {1,5}.

Опять же, для идентификатора «1» максимальное значение по «Time = 3» равно 5, что является максимальным значением {1,5,4}.

Комментарии:

1. Вам нужно ?cummax , чтобы это дало желаемый результат, но не Time учитывало: ave(Value, ID, FUN = cummax)

Ответ №1:

Поскольку я не могу добавлять комментарии сам, я бы предложил использовать ввод @markus:

 library(dplyr)

ID=c(1,1,1,1,2,2,2,2)
Time=c(1,2,3,4,1,2,3,4)
Value=c(1,5,4,8,2,5,9,7)


tbl <- tibble(ID = ID, Time = Time, Value = Value)
tbl %>% group_by(Time, ID) %>% mutate(result = max(Value))  ## shouldnt work

tbl %>% group_by(ID) %>% mutate(Max_Value = cummax(Value)) ## should work
 

Комментарии:

1. кредиты идут @markus. Этот ответ обеспечивает желаемые результаты, также принимая во внимание время

2. Извините, ребята, я добавил неправильную строку кода. Отредактировал его. Теперь это работает!

3. Вы уверены? Я думаю, что я снова сделал это неправильно. Должно ли оно быть tbl %>% group_by(ID) %>% mutate(Max_Value = cummax(значение))

4. Я обнаружил, что последний код с «cummax» работает хорошо. Я еще не пробовал строку с «max».

Ответ №2:

Вот такой data.table вариант:

 library(data.table)
dt <- data.table(ID=c(1,1,1,1,2,2,2,2),
                 Time=c(1,2,3,4,1,2,3,4),
                 Value=c(1,5,4,8,2,5,9,7))

max_v <- function(x) max(dt[ID==x$ID amp; Time <= x$Time, Value])

sapply(split(dt,1:nrow(dt)),max_v)
 

Вы также можете попробовать:

 library(data.table)

dt <- data.table(ID=c(1,1,1,1,2,2,2,2),
                 Time=c(1,2,3,4,1,2,3,4),
                 Value=c(1,5,4,8,2,5,9,7))

dt <- dt[order(Time)]

dt[,Max_Value := cummax(Value), by=ID]

dt[order(ID)]
#    ID Time Value Max_Value
# 1:  1    1     1         1
# 2:  1    2     5         5
# 3:  1    3     4         5
# 4:  1    4     8         8
# 5:  2    1     2         2
# 6:  2    2     5         5
# 7:  2    3     9         9
# 8:  2    4     7         9
 

Комментарии:

1. Почему бы и нет dt[, new := cummax(Value), by=ID] ?