Расчет аномалий временных рядов с помощью сгруппированных данных

Сообщение расчет аномалий во временных рядах было очень полезным, но я сгруппировал данные в моей ситуации. У меня есть фрейм данных с годом, группой, значением и столбцами. У каждой группы есть значения для каждого года. Я хочу рассчитать годовую аномалию в каждой группе. то есть значение этого года минус среднее значение за все годы для этой группы. Было бы неплохо также добавить это значение аномалии в виде столбца во фрейм данных. Спасибо! Вот пример данных

year <- c(2000, 2000, 2000, 2000, 2000,2001, 2001, 2001, 2001, 2001,2002, 2002, 2002, 2002, 2002,2003, 2003, 2003, 2003, 2003)
group <- c("A", "B", "C", "D", "A", "B", "C", "D","A", "B", "C", "D","A", "B", "C", "D","A", "B", "C", "D")
value <- runif(20, 0, 1)
df <- as.data.frame(year)
df$group <- group
df$value <- value

person wraymond    schedule 04.02.2016    source источник
comment
пожалуйста, покажите вашу проблему с примером набора данных вместе с желаемым результатом   -  person mtoto    schedule 04.02.2016


Ответы (1)


Другой случай, когда функция ave полезна (и как таковой аргумент FUN на самом деле не нужен, но важно помнить, что он стоит после многоточия в списке аргументов и, следовательно, должен быть именованным аргументом, если используется):

df$grp.means <-with( df, ave(value,group, FUN=mean )
df$yr.anomaly <- df$value-df$grp.means
df
 year group      value grp.means   yr.anomaly
 2000     A 0.40778676 0.4135109 -0.005724164
 2000     B 0.02709893 0.2660400 -0.238941031
 2000     C 0.30375035 0.6461923 -0.342441950
 2000     D 0.46330590 0.4901705 -0.026864586
 2000     A 0.98482498 0.4135109  0.571314056
 2001     B 0.02279144 0.2660400 -0.243248519
 2001     C 0.64370031 0.6461923 -0.002491994
 2001     D 0.28803650 0.4901705 -0.202133986
 2001     A 0.40769648 0.4135109 -0.005814443
 2001     B 0.21896143 0.2660400 -0.047078526
 2002     C 0.83771796 0.6461923  0.191525655
 2002     D 0.61869987 0.4901705  0.128529384
 2002     A 0.06946549 0.4135109 -0.344045431
 2002     B 0.14443442 0.2660400 -0.121605537
 2002     C 0.95324165 0.6461923  0.307049349
 2003     D 0.60165466 0.4901705  0.111484174
 2003     A 0.19778091 0.4135109 -0.215730018
 2003     B 0.91691357 0.2660400  0.650873612
 2003     C 0.49255124 0.6461923 -0.153641061
 2003     D 0.47915550 0.4901705 -0.011014985

Также возможно сделать это за один шаг:

df$yr.anomaly <- with( df, ave(value, group, FUN=function(x) x- mean(x)))
person IRTFM    schedule 04.02.2016
comment
Сладкое спасибо! Я подозревал, что замешан ave () - person wraymond; 04.02.2016