我正在尝试在数据框中创建一个新变量,该变量逐组滞后。我的意思是,我希望每一行都显示特定组的前三个观察值的平均值。
我尝试将mutate_at函数与lag一起使用,但会引发错误
laggedmean <- function(x){mean(c(lag(x, 1), lag(x, 2), lag(x, 3)), na.rm = true)}
example <- data.frame(letter = rep(c("a","b","c"), 9),
var1 = 1:27, var2 = 28:54, var3 = 54:80)
example <- example %>%
group_by(letter)%>%
mutate_at(c("var1", "var2", "var3"), laggedmean)
Error in mean.default(c(lag(x, 1), lag(x, 2), lag(x, 3)), na.rm = true) :
object 'true' not found
我也尝试只使用mutate一次将一个变量做到这一点,但这也不起作用。它只会为该组产生一个均值
example <- example %>%
group_by(letter) %>%
mutate(var1_lag_avg = mean(c(lag(var1, 1), lag(var1, 2),
lag(var1, 3)), na.rm = TRUE))
print(example)
# A tibble: 27 x 5
# Groups: letter [3]
letter var1 var2 var3 var1_lag_avg
<fct> <int> <int> <int> <dbl>
1 a 1 28 54 10.1
2 b 2 29 55 11.1
3 c 3 30 56 12.1
4 a 4 31 57 10.1
5 b 5 32 58 11.1
6 c 6 33 59 12.1
7 a 7 34 60 10.1
8 b 8 35 61 11.1
9 c 9 36 62 12.1
10 a 10 37 63 10.1
# ... with 17 more rows
我想要获得的结果将为每个组的前三个观察值生成NA,然后为每个随后的观察值随其变化的链式平均值。而不是对var1_lag_avg为10.1的所有观察结果,前三个观察值为NA,第四个观察值为4,然后对a的第五观察值为7,第六观察值为10,依此类推。
答案 0 :(得分:0)
我不太确定为什么第四个元素应该是4而不是1。这如何适合只考虑滞后值的公式。以下代码与您的公式匹配,但与您所需的输出匹配。对于后一种情况,请删除lag()
。
example %>%
group_by(letter)%>%
mutate_at(c("var1", "var2", "var3"),
list(lagged = ~zoo::rollapply(lag(.), 3,
mean, na.rm=T,
partial = T,
fill = NA, align = "right")))