尝试将此数据框转换为比率矩阵,使得对于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
答案 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)
以下是使用sapply
和ave
函数的另一种方法。 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