#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]
?