Отношение месяца к среднегодовому значению

Попытка преобразовать этот кадр данных в матрицу отношений таким образом, чтобы для столбца A за январь 2007 г. он был бы равен январю 2007 г. / среднему значению 2007 г., а для февраля 2007 г. он был бы равен 4 / среднему значению 2007 г. ... нужно чтобы применить его ко всем столбцам.

YearM   A B C
2007/Jan    3 5 7
2007/Feb    4 5 6
2007/Mar    4 4 2
...........
2013/Dec    4 4 2

person jkl    schedule 11.10.2017    source источник
comment
не могли бы вы использовать dput для размещения образца ваших данных? образец, который вы сейчас вставили, очень сложен для работы   -  person bouncyball    schedule 11.10.2017
comment
только что понял, как использовать dput.   -  person jkl    schedule 11.10.2017
comment
Не забудьте принять ответ, который вы считаете наиболее полезным, нажав на серую галочку под кнопкой отрицательного ответа.   -  person acylam    schedule 13.10.2017


Ответы (2)


library(dplyr)

avg_mat = df %>%
  group_by(year = sub("/.*", "", YearM)) %>%
  mutate_at(vars(A:C), "mean") %>%
  ungroup() %>%
  select(A:C)  %>%
  as.matrix()

mat = df %>%
  select(A:C) %>%
  as.matrix() 

cbind(YearM = df$YearM, as.data.frame(mat/avg_mat))

Результат:

     YearM         A         B   C
1 2007/Jan 0.8181818 1.0714286 1.4
2 2007/Feb 1.0909091 1.0714286 1.2
3 2007/Mar 1.0909091 0.8571429 0.4
4 2013/Dec 1.0000000 1.0000000 1.0

Данные:

df = read.table(text = "YearM   A B C
2007/Jan    3 5 7
2007/Feb    4 5 6
2007/Mar    4 4 2
2013/Dec    4 4 2", header = TRUE)
person acylam    schedule 11.10.2017
comment
Спасибо! любой способ добавить даты/месяц обратно в выходную матрицу? - person jkl; 11.10.2017
comment
@jkl Конечно, смотрите мои обновления. Чтобы добавить YearM, вы должны преобразовать матрицу в data.frame, иначе она будет преобразована в числовую. - person acylam; 11.10.2017

Вот еще один способ использования функций sapply и ave. Часть ave заимствована из этого сообщения.

df$year <- year = sub("/.*", "", df$YearM)    
df[,c('A','B','C')] <- df[,c('A','B','C')] / sapply(df[,c('A','B','C')], ave, df$year)


     YearM         A         B   C year
1 2007/Jan 0.8181818 1.0714286 1.4 2007
2 2007/Feb 1.0909091 1.0714286 1.2 2007
3 2007/Mar 1.0909091 0.8571429 0.4 2007
4 2013/Dec 1.0000000 1.0000000 1.0 2013
person bouncyball    schedule 11.10.2017