Извлечение среднего за предыдущий месяц по условию - PullRequest
0 голосов
/ 31 января 2019

У меня есть 2 фрейма данных, «восточный», содержащий данные аукциона на определенные даты, а другой, «month_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

Заранее спасибо!

1 Ответ

0 голосов
/ 31 января 2019

Я получил желаемый результат, сначала вычитая месяц из дат с помощью функции %m-% из пакета lubridate, прежде чем объединять.

См. Документацию здесь

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

Если вы присоединитесь к этому с помощью (month_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

Это делает это для вас?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...