5

我正在尝试在数据集中进行滚动差异。我有一张这样的桌子:

Year  Count
2017  5
2017  6
2017  7
2017  6
2017  8

我想得到一列差异,从第 5 行开始计算。所以它看起来像这样

Index  Count  Diff
1      5      NA
2      6      NA
3      7      NA
4      6      NA
5      8      NA
6      3      -2
7      4      -2
8      9      2
9      2      -4
10     1      -7

现在我只是对计数列进行子集化并与零组合进行计算。有没有更整洁的方法来做到这一点?

这就是我现在正在做的事情:

a <- df$Count[1:5]
b <- rep(0,5)
df$Count1 <- c(b,a)
df$Diff <- df$Count - df$Count1
4

4 回答 4

12

您可以使用lagfromdplyr如下

df$Diff <- df$Count - dplyr::lag(df$Count, n = 5)
于 2018-02-10T20:35:41.007 回答
6
require(data.table)
setDT(df)[, Diff := Count - shift(Count, 5)]
于 2018-02-10T20:51:48.950 回答
5

您可以使用 base R

df$Diff <- c( rep(NA, 5), tail(df$Count, -5) - head(df$Count, -5) )

这是一个变体diff()

df$Diff <- c(rep(NA, 5), diff(df$Count, lag=5))
于 2018-02-10T20:39:03.083 回答
2

尝试diff.zoona.fill从 zoo 包中:

library(zoo)
transform(df, diff = na.fill(diff(zoo(Count), 5, na.pad = TRUE), fill = 0))

或者,rollapplyr从动物园:

transform(df, diff = rollapplyr(Count, 5 + 1, diff, 5, fill = 0))
于 2018-02-10T20:38:49.923 回答