【问题标题】:Ratio Month to Annual Average月平均比
【发布时间】:2017-10-11 15:31:58
【问题描述】:

尝试将此数据框转换为比率矩阵,以使 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

【问题讨论】:

  • 您可以使用dput 发布您的数据样本吗?您现在插入的示例很难使用
  • 刚刚弄清楚如何使用 dput。
  • 不要忘记点击反对按钮下方的灰色复选标记来接受您认为最有帮助的答案

标签: r apply dplyr


【解决方案1】:
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)

【讨论】:

  • 谢谢!有什么方法可以将日期/月份添加回输出矩阵?
  • @jkl 当然,看看我的更新。要添加YearM,必须将矩阵转换为data.frame,否则会被强制转换为数值。
【解决方案2】:

这是使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多