我有一个包含几列的数据框,我想在此数据框的底部附加一行,其中包含每列中最后两行数据的增长率的移动平均值。
数据:
A | B
3 | 4
4 | 3
5 | 5
4 | 3
1 | 5
列A
,((1-4)/4 + (4-5)/5)/2 = -0.475
和B
,2/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 :(得分: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 = "|")