2016-10-07 77 views
0

我有一個數據集,可能包含每個日期的多個觀測值。所以可能有5個觀測日期1,2個觀測日期2,1個觀測組3。按獨特日期移動平均值,每個日期有多個觀測值

我想計算移動平均數 - 按日期 - 重要的是,而不總結/減少'的行數。那就是在上面這個例子中,我仍然有8行數據,並且在它旁邊的一列中,我會看到該日期的滾動平均價格,我覺得這很具有挑戰性,因爲當我使用ZOO包中的典型滾動函數時,直插式,我不知道如何得到它的日期

跳過例如第一個步驟通常會是:

df %>% groupy_by(DATE) %>% summarise(mean_daily_price = mean(price)) %>% ungroup() %>% arrange(Date) %>% mutate(ra = rollapply(price, 2, mean, partial=T) 

---但總結讓我失去了行。

 library(dplyr) 
     library(zoo) 


      DF = structure(list(Date = c("Jan-13", "Jan-13", "Jan-13", "Jan-13", "Jan-13", "Jul-14", "Jul-14", "Oct-16"), Price = c(100L, 200L, 300L, 1000L, 400L, 150L, 50L, 600L), Average.by.Date = c(400L, 400L, 400L, 400L, 400L, 100L, 100L, 600L), Moving_Average_Size_2 = c(NA, NA, NA, NA, NA, 250L, 250L, 350L)), .Names = c("Date", "Price", "Average.by.Date", "Moving_Average_Size_2"), class = "data.frame", row.names = c(NA, 
-8L)) 
+1

你的問題有點不清楚。你的預期產出是多少? 「按日期跳過」是什麼意思? – jdobres

+1

請確保您的代碼中的變量名稱與數據框中的變量名稱匹配,並且您的代碼沒有任何其他拼寫錯誤。 – eipi10

回答

0

我認爲你最安全的方法將需要兩個步驟 - 計算由Date滾動平均值,然後將它們合併回(仍然使用dplyr這裏)

rolledAvg <- 
    DF %>% 
    group_by(Date) %>% 
    summarise(mean_daily_price = mean(Price)) %>% 
    ungroup() %>% 
    arrange(Date) %>% 
    mutate(ra = rollapply(mean_daily_price 
         , 2 
         , mean 
         , partial=T 
         , fill = NA)) 

left_join(DF, rolledAvg) 

給出:

Date Price Average.by.Date Moving_Average_Size_2 mean_daily_price ra 
1 Jan-13 100    400     NA    400 250 
2 Jan-13 200    400     NA    400 250 
3 Jan-13 300    400     NA    400 250 
4 Jan-13 1000    400     NA    400 250 
5 Jan-13 400    400     NA    400 250 
6 Jul-14 150    100     250    100 350 
7 Jul-14 50    100     250    100 350 
8 Oct-16 600    600     350    600 600 

我在另一個答案的評論中看到,您認爲第一個ra應該是250 - 如果是這種情況,請將您的調用中的計算更改爲rollapply。現在,它似乎表現得如預期/記錄。所以,如果你想要不同的東西,你需要解釋你想要的改變(可能是一個單獨的問題)。

另一個需要注意的是,對於任何其他讀者而言,這一點尤其重要:目前的方法將順序日期條目視爲等距離,無論它們實際上有多遠。如果這符合你的需求,那很好。但是,在許多使用情況下,您可能需要考慮測量之間的實際時間量。

同樣,目前的方法失去了所有測量數量的信息,可能值得考慮一種按照觀察次數加權的方法(除非你高興地相信每天的計算平均值)。

+1

除了單獨的'left_join',您還可以在鏈上添加'right_join(DF)'。 – eipi10

+0

嘗試'rollapplyr'來代替'rollapply'。同樣,如果左連接被寫爲'left_join(x = DF)',那麼它可以被添加到管道的末端。 –

+0

@ eipi10和@G格羅騰迪克都可以在管道/鏈的末尾添加調用('left_join'或'right_join')。我在這裏把他們分開,強調'* _join'是答案的獨特部分(並且在問題中的構造可以被認爲是*正確*,僅僅是第一步)。 –

1

在下面的代碼中,我們使用mutate,而不是summarise添加mean_daily_price,使我們保持數據幀的所有行。然後,在最後的mutate中,我們僅在mean_daily_price的唯一值上運行rollapply,但隨後使用tablerep按每個Date的行數重複輸出rollapply

DF %>% 
    arrange(Date) %>% 
    group_by(Date) %>% 
    mutate(mean_daily_price = mean(Price)) %>% 
    ungroup() %>% 
    mutate(ra = rep(rollapply(unique(mean_daily_price), 2, mean, fill=NA, align="right"), 
        table(Date)[order(unique(Date))])) 
Date Price Average.by.Date Moving_Average_Size_2 mean_daily_price ra 
1 Jan-13 100    400     NA    400 NA 
2 Jan-13 200    400     NA    400 NA 
3 Jan-13 300    400     NA    400 NA 
4 Jan-13 1000    400     NA    400 NA 
5 Jan-13 400    400     NA    400 NA 
6 Jul-14 150    100     250    100 250 
7 Jul-14 50    100     250    100 250 
8 Oct-16 600    600     350    600 350 
+0

對不起,但這是不正確的。 MOVING_AVERAGE_SIZE_2在這裏是正確的答案(或NULLS可能= 400) - 此處不太關注,因爲此時只有1個觀測日期。此外,也許我錯過了一些東西,但獨特(mean_daily_prrice)---如果我在多個日期有相同的平均價格? – runningbirds

+0

查看更新的代碼。 – eipi10