R:将行添加为移动平均增长率

时间:2017-07-29 05:26:22

标签: 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)

1 个答案:

答案 0 :(得分:2)

以下是一些可能性:

1)有问题的代码 lag用于时间序列。还可以使用tail来获得最后一次移动平均值:

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))

注意:可重复形式的输入数据是:

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