R - 按组创建具有累积平均值的新列

时间:2017-08-31 03:01:46

标签: r

我有以下数据框,列出每天每个类别的花费

Dataframe: actualSpends
Date         Category  Spend ($) 
2017/01/01   Apple     10
2017/01/02   Apple     12
2017/01/03   Apple     8 
2017/01/01   Banana    13
2017/01/02   Banana    15
2017/01/03   Banana    7

我想创建一个新的数据框,列出每个类别的平均金额,每月的每一天。 (例如,本月3日,本月过去所有日子的平均花费,从每个月的第1天到第31天。)

编辑: 所以输出应该看起来像..

Date         Category  AvgSpend ($) 
2017/01/01   Apple     10
2017/01/02   Apple     11
2017/01/03   Apple     10 
2017/01/01   Banana    13
2017/01/02   Banana    14
2017/01/03   Banana    11.7

对于每个类别,每天的平均支出是过去所有日子的平均值。 1,平均为1日。第二是第一和第二的平均值。第3是平均第1 +第2 +第3。

有没有解决方法呢?

3 个答案:

答案 0 :(得分:0)

我们可以使用 dplyr 包中的 cummean 功能来计算每个类别的累积平均值;然后结果融入新专栏:

library(dplyr)
library(reshape2)

unq <- unique(df$Category)

df$AvgSpend <- melt(
  sapply(1:length(unq),
     function(i) cummean(df$Spending[which(df$Category==unq[i])])))$value

输出:

        Date Category Spending AvgSpend
1 2017/01/01    Apple       10 10.00000
2 2017/01/02    Apple       12 11.00000
3 2017/01/03    Apple        8 10.00000
4 2017/01/01   Banana       13 13.00000
5 2017/01/02   Banana       15 14.00000
6 2017/01/03   Banana        7 11.66667

示例数据:

df <- data.frame(Date=c("2017/01/01","2017/01/02","2017/01/03",
                        "2017/01/01","2017/01/02","2017/01/03"),
                 Category=c("Apple","Apple","Apple",
                            "Banana","Banana","Banana"),
                 Spending=c(10,12,8,13,15,7))

答案 1 :(得分:0)

这是tidyverse选项

library(tidyverse)
df %>%
  group_by(Date, Category) %>% 
  summarise(Spending = mean(Spending, na.rm = TRUE))
# A tibble: 4 x 3
# Groups:   Date [?]
#        Date Category Spending
#      <fctr>   <fctr>    <dbl>
#1 2017/01/01    Apple       11
#2 2017/01/02   Banana       14
#3 2017/01/03    Apple        8
#4 2017/01/03   Banana        7

答案 2 :(得分:0)

您可以使用&#39; sqldf&#39; (https://cran.r-project.org/web/packages/sqldf/sqldf.pdf)包

install.packages(&#34; sqldf&#34;)

库(sqldf)

actualSpends&lt; - data.frame( 日期= c(&#39; 2017/01/01&#39;,&#39; 2017/01/02&#39;,&#39; 2017/01/03&#39;,&#39; 2017 / 01&#39;&#39; 2017/01/02&#39;&#39; 2017/01/03&#39), 类别=(&#39; Apple&#39;,&#39; Apple&#39;,&#39; Apple&#39;&#39; Banana&#39;&#39; Banana&#39;,&# 39;香蕉&#39),         花费= c(10,12,8,13,15,7))

sqldf(&#34;从actualSpends中选择日期,类别,总和(支出)                 按日期分类,类别&#34;)