比率月份与年度平均值

时间:2017-10-11 15:31:59

标签: r apply mutate

尝试将此数据框转换为比率矩阵,使得对于2007年1月的A列,它将等于2007年1月/ 2007年平均值,2007年2月它将等于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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

以下是使用sapplyave函数的另一种方法。 ave部分来自this post

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