2017-07-29 50 views
0

我有一個有幾列的數據框,我想在此數據框的底部追加一行,其中包含最後2行數據的增長率的移動平均值在每一列中。R:作爲移動平均增長率追加行

數據:

A | B 
3 | 4 
4 | 3 
5 | 5 
4 | 3 
1 | 5 

新行列A((1-4)/4 + (4-5)/5)/2 = -0.475B2/15

所以數據幀想:

A  | B 
3  | 4 
4  | 3 
5  | 5 
4  | 3 
1  | 5 
-0.475 0.133 

我曾嘗試以下,但遺憾的是它不工作,我不能找到一種方法,使用最後計算每列的新行使用。我應該怎麼做呢?

moving_avg_growth_rate = function (x) { 
    growth = x/lag(x) - 1 
    moving_average = filter(growth, rep(1/2, 2)) 
    return (moving_average) 
} 

lapply(dataframe, moving_avg_growth_rate) 
+0

分別計算增長率,然後'rbind'it到原來的df – cephalopod

回答

2

下面是一些可能:

1)所討論的代碼改性lag爲時間序列。還用尾巴來獲得最後的移動平均:

moving_avg_growth_rate = function (x) { 
    growth = x[-1]/x[-length(x)] - 1 
    moving_average = filter(growth, rep(1/2, 2), sides = 1) 
    tail(moving_average, 1) 
} 
rbind(dataframe, lapply(dataframe, moving_avg_growth_rate)) 

1A)注意,因爲我們只需要最後的移動平均線,我們可以使用

moving_avg_growth_rate2 <- function(x) { 
    xx <- tail(x, 3) 
    mean(xx[-1]/xx[-3] - 1) 
} 
rbind(dataframe, lapply(dataframe, moving_avg_growth_rate2)) 

2)短

Tail <- tail(dataframe, 3) 
rbind(dataframe, colMeans(Tail[-1, ]/Tail[-3, ] - 1)) 

備註:可重現的輸入數據fo rm是:

Lines <- " 
A  | B 
3  | 4 
4  | 3 
5  | 5 
4  | 3 
1  | 5" 
dataframe <- read.table(text = Lines, header = TRUE, sep = "|")