Как заполнить новый столбец средними значениями из предыдущих 3 строк другого столбца?в R - PullRequest
0 голосов
/ 27 февраля 2019

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

df<-data.frame(date=c("9/1","9/2","9/3","9/4","9/5","9/6"),value=c(2,3,5,8,11,12))

Я хотел бы создать дополнительный столбец (с именем "avg" для удобства), который усредняет значения за последние 3 дня, включаяэтот день.Другими словами, я хотел бы, чтобы data.frame, созданный выше, добавил дополнительный столбец, который выглядит примерно так:

avg

NA

NA

3.33

5.33

8

10.33

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

Ответы [ 3 ]

0 голосов
/ 03 марта 2019

Ради полноты версия 1.12.0 пакета data.table (на CRAN 13 января 2019 г.) получила функцию быстрого скользящего среднего:

library(data.table)   # version 1.12.0+
setDT(df)[, avg := frollmean(value, 3L)]
df
   date value       avg
1:  9/1     2        NA
2:  9/2     3        NA
3:  9/3     5  3.333333
4:  9/4     8  5.333333
5:  9/5    11  8.000000
6:  9/6    12 10.333333
0 голосов
/ 03 марта 2019

Рассмотрим скользящее среднее с sapply с использованием библиотеки base.

df$avg_last_three <- c(NA, NA, sapply(3:nrow(df), function(i) mean(df$value[(i-2):i])))

df    
#   date value avg_last_three
# 1  9/1     2             NA
# 2  9/2     3             NA
# 3  9/3     5       3.333333
# 4  9/4     8       5.333333
# 5  9/5    11       8.000000
# 6  9/6    12      10.333333
0 голосов
/ 27 февраля 2019
> library(zoo)
> DF$avg <- c(NA, NA, rollmean(DF$value, 3))
> DF
  date value       avg
1  9/1     2        NA
2  9/2     3        NA
3  9/3     5  3.333333
4  9/4     8  5.333333
5  9/5    11  8.000000
6  9/6    12 10.333333

вы также можете использовать fill и align аргументы

rollmean(DF$value, 3, fill = NA, align = "right")

или с учетом комментария @H 1 использовать rollmeanr(df$value, 3, fill = NA)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...