【问题标题】:Fetching previous month's average based on condition根据条件获取上个月的平均值
【发布时间】:2019-01-31 10:11:10
【问题描述】:

我有 2 个数据框,“eastern”包含特定日期的拍卖数据,另一个“monthly_agg”包含这些拍卖的月平均值。 我想以这样的方式合并数据框,其中一个月的平均拍卖将是上个月的平均拍卖价格。

对于东部数据框,我从拍卖日期中提取了月份和年份,然后将月份-年份连接起来形成一个新列。

东部数据集:

    date       month  year   concat      
    2014-10-17 10     2014  10 - 2014   
    2014-10-24 10     2014  10 - 2014
    2014-10-31 10     2014  10 - 2014   
    2014-11-07 11     2014  11 - 2014   
    2014-11-17 11     2014  11 - 2014   
    2014-11-26 11     2014  11 - 2014   
    2014-12-26 12     2014  12 - 2014
    2015-01-22 1      2015  1-2015


For the monthly_agg data frame, I have calculated the monthly averages for the month-year combination.

monthly_agg data-set:

date       month year   concat      prev_avgL1
2014-10-17 10     2014  10 - 2014     avg10
2014-10-24 10     2014  10 - 2014     avg10
2014-10-31 10     2014  10 - 2014     avg10
2014-11-07 11     2014  11 - 2014     avg11
2014-11-17 11     2014  11 - 2014     avg11
2014-11-26 11     2014  11 - 2014     avg11
2014-12-26 12     2014  12 - 2014     avg12
2015-01-22 1      2015  1-2015        avg1(for the new year and new month)

然后使用 left_join() 我合并了两个数据框并创建了一个名为 eastern1 的新数据框。

合并后的数据框“eastern1”具有以下结构:

     date       concat      prev_avgL1
   >>2014-10-17 10 - 2014     avg10
   >>2014-10-24 10 - 2014     avg10
   >>2014-10-31 10 - 2014     avg10
   >>2014-11-07 11 - 2014     avg11
   >>2014-11-17 11 - 2014     avg11
   >>2014-11-26 11 - 2014     avg11
   >>2014-12-26 12 - 2014     avg12
    >>2015-01-22 1 -2015      avg1(for the new year and new month)

eastern$Date=as.Date(eastern$Date,format="%d-%m-%Y")
eastern$year=year(eastern$Date)
eastern$Month=month(eastern$Date)
eastern$concat=paste(eastern$Month,"-",eastern$year)

monthly_agg=aggregate( L1_BID_PRICE ~ Month+year , agg , mean )
monthly_agg$concat=paste(monthly_agg$Month,"-",monthly_agg$year)

eastern1=left_join(eastern,monthly_agg,by="concat")



The expected result should be :
            >date         concat      prev_avgL1
           >>2014-10-17   10 - 2014     NA
           >>2014-10-24   10 - 2014     NA
           >>2014-10-31   10 - 2014     NA
           >>2014-11-07   11 - 2014     avg10
           >>2014-11-17   11 - 2014     avg10
           >>2014-11-26   11 - 2014     avg10
           >>2014-12-26   12 - 2014     avg11
           >>2015-01-22    1 -2015      avg12...and so on

**Here the average for October is NA since the data-set has dates starting from October 2014. 


The actual result is after doing left_join():
        >date       concat      prev_avgL1
        >>2014-10-17 10 - 2014     avg10
       >>2014-10-24 10 - 2014     avg10
       >>2014-10-31 10 - 2014     avg10
       >>2014-11-07 11 - 2014     avg11
       >>2014-11-17 11 - 2014     avg11
       >>2014-11-26 11 - 2014     avg11
       >>2014-12-26 12 - 2014     avg12
       >>2015-01-22    1 -2015    avg1

提前致谢!

【问题讨论】:

  • 如果您可以将输入数据与尝试的解决方案分开,那就太好了。我假设您的示例代码中的第一个数据是“东部”数据框的示例?您能否还提供一个“monthly_agg”结构的最小示例?谢谢。
  • @chris,感谢您的调查。我已经更新了查询。

标签: r dataframe merge dplyr


【解决方案1】:

在连接之前,我首先通过 lubridate 包中的 %m-% 函数从日期中减去一个月,从而获得了所需的结果。

参见文档here

library(lubridate)
library(dplyr)

eastern <- data.frame(date = c("2014-10-17" , "2014-10-24", "2014-10-31", 
                               "2014-11-07", "2014-11-17", "2014-11-26", 
                               "2014-12-26", "2015-01-22", "2015-02-12")) %>%
           mutate(date = as.Date(date),
                  year = year(date %m-% months(1)),
                  month = month(date %m-% months(1)),
                  concat = paste(year, "-", month))

        date year month    concat
1 2014-10-17 2014     9  2014 - 9
2 2014-10-24 2014     9  2014 - 9
3 2014-10-31 2014     9  2014 - 9
4 2014-11-07 2014    10 2014 - 10
5 2014-11-17 2014    10 2014 - 10
6 2014-11-26 2014    10 2014 - 10
7 2014-12-26 2014    11 2014 - 11
8 2015-01-22 2014    12 2014 - 12
9 2015-02-12 2015     1  2015 - 1

如果你加入这个(monthly_agg 或 aggs 或其他):

    avg    concat
1 avg10 2014 - 10
2 avg11 2014 - 11
3 avg12 2014 - 12
4  avg1  2015 - 1
5  avg2  2015 - 2

你会得到这个

left_join(eastern[, c("date", "concat")], aggs, by = "concat")

        date    concat   avg
1 2014-10-17  2014 - 9  <NA>
2 2014-10-24  2014 - 9  <NA>
3 2014-10-31  2014 - 9  <NA>
4 2014-11-07 2014 - 10 avg10
5 2014-11-17 2014 - 10 avg10
6 2014-11-26 2014 - 10 avg10
7 2014-12-26 2014 - 11 avg11
8 2015-01-22 2014 - 12 avg12
9 2015-02-12  2015 - 1  avg1

这对你有用吗?

【讨论】:

  • 感谢您的回复,它部分对我有用,但是当日期在明年下降时,例如 2015-01-22,2016-01-15 等,那么 left_join() 价格列为空白。请建议我应该如何处理。
  • 你是对的。我忘了那个。我已经更正了我的评论。
  • 非常感谢,更新已经成功,但这里也有一个指针,如果日期不连续,即一个月的间隔,则 avg 列有一个 NA 值。
猜你喜欢
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 2021-06-23
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多