Как создать цепочечное среднее в R? - PullRequest
0 голосов
/ 26 октября 2019

Я пытаюсь создать новую переменную в моем фрейме данных, которая будет иметь среднее значение по группе. под этим я подразумеваю, что я хочу, чтобы в каждой строке отображалось среднее значение предыдущих трех наблюдений для конкретной группы.

Я пытался использовать функцию mutate_at с задержкой, но она выдает ошибку

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

. Результат, который я пытаюсь получить, будет давать НС для первых трех наблюдений в каждой группе, а затем цепочечное среднее, которое изменяется для каждого последующего наблюдения. Вместо всех наблюдений, имеющих var1_lag_avg, равный 10,1, первые три будут NA, а четвертым будет 4, затем пятым наблюдением для 7 будет 7, шестым будет 10 и т. Д.

1 Ответ

0 голосов
/ 27 октября 2019

Я не совсем уверен, почему четвертого элемента должно быть четыре, а не 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")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...