如何在 dplyr 中使用 lag() 函数,而不需要前 n 行?

问题描述 投票:0回答:2

我熟悉 R 中的

lag()
函数,但这次我的独特用例是我想使用
rollapplyr()
执行滚动平均值,不包括前七行数据。

如果我以某种方式调整似乎无法完成工作的代码,这可能吗?

library(tidyverse)
library(zoo)

stack <- data.frame(
  date = seq(Sys.Date(), Sys.Date() - 99, -1),
  var1 = round(rnorm(100, 8000, 500))
  )

lag <- stack %>%
  mutate(var1_lag = lag(rollapplyr(var1, 28, mean, partial = TRUE) - 28))
r rollapply
2个回答
3
投票

rollapply
中,
width=
可以是一个包含偏移量向量的列表,其中偏移量 0 是当前位置,偏移量 -1 是之前的位置,依此类推。

下面我们假设需要取以 -7 为结束点的 21 个偏移处的值的平均值。 这不包括偏移量 -6、-5、-4、-3、-2、-1 和 0(当前行和前 6 行,总共 7 个排除行)。 如果有不同的意图,请修改

offsets

offsets <- list(seq(to = -7, length = 21))
stack %>%
  mutate(var1_lag = rollapplyr(var1, offsets, mean, partial = TRUE, fill = NA))

2
投票

您可能可以定义

FUN = \(x) mean(head(x, -7))
来排除
7
紧邻的先例值,例如,

stack %>%
    mutate(var1_lag = lag(rollapplyr(var1, 28, \(x) mean(head(x, -7)), partial = TRUE) - 28))
© www.soinside.com 2019 - 2024. All rights reserved.