2017-03-08 66 views
-1

我需要在R中運行一個腳本來更新給定行中有關前一行歷史記錄的值。更具體地說,我想計算一段時間內某些給定列的平均值。我會解釋。使用R中前一行的值遞增地更新行

說,我下表:

Key A B C  Date 
    X 1 0 2 1/1/2017 
    Y 2 1 1 2/1/2017 
    X 2 1 3 3/1/2017 
    X 6 2 2 4/1/2017 
    Y 3 2 1 5/1/2017 

我需要更新的每一行,以使得每個從列A,B和C的值的表示鍵,X和Y的平均值,直到指定的日期。因此,在這種情況下

,我們會碰到這樣的:

Key A B C  Date 
    X 1 0 2 1/1/2017 
    Y 2 1 1 2/1/2017 
    X 1.5 0.5 2.5 3/1/2017 
    X 3 1 2.3 4/1/2017 
    Y 2.5 1.5 1 5/1/2017 

我是相當新的R,和我保持與解決方案,看起來太像程序代碼結束了,好像還不以適應好。通常在R中有一個我不知道的已知解決方案,因此如果有任何本地方法的lib來執行這種類型的條件更新,歡迎任何幫助。你也可以假設行已經按日期排序,以防它有幫助。

在此先感謝!

編輯:4排固定錯誤的榜樣號,列C.

+1

你是什麼意思按鍵的平均用cummean的選項?你只是想要每列的移動平均值?它應該只是在X到Key中的行的平均值,直到給定的日期?你想在新的平均數中使用以前的平均值嗎?還是應該從原始表格計算出來? –

+1

值不應該是2.3333? - (2 + 3 + 2)/ 3 = 2.33? – thelatemail

+0

@thelatemail你是對的。對不起,我已經修好了。 – htaunay

回答

4

否則使用cumsum(x)/seq_along(x)每個變量的一些分組得到累積平均。

dat[c("A","B","C")] <- lapply(
    dat[c("A","B","C")], function(x) ave(x, dat$Key, FUN=function(v) cumsum(v)/seq_along(v)) 
) 
dat 

# Key A B  C  Date 
#1 X 1.0 0.0 2.000000 1/1/2017 
#2 Y 2.0 1.0 1.000000 2/1/2017 
#3 X 1.5 0.5 2.500000 3/1/2017 
#4 X 3.0 1.0 2.333333 4/1/2017 
#5 Y 2.5 1.5 1.000000 5/1/2017 
1

下面是從dplyr

library(dplyr) 
dat %>% 
    group_by(Key) %>% 
    mutate_at(vars(A, B, C), cummean) 
# Key  A  B  C  Date 
# <chr> <dbl> <dbl> <dbl> <chr> 
#1  X 1.0 0.0 2.000000 1/1/2017 
#2  Y 2.0 1.0 1.000000 2/1/2017 
#3  X 1.5 0.5 2.500000 3/1/2017 
#4  X 3.0 1.0 2.333333 4/1/2017 
#5  Y 2.5 1.5 1.000000 5/1/2017