如何在R中创建链式均值?

时间:2019-10-26 20:31:56

标签: r

我正在尝试在数据框中创建一个新变量,该变量逐组滞后。我的意思是,我希望每一行都显示特定组的前三个观察值的平均值。

我尝试将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,依此类推。

1 个答案:

答案 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")))