Скользящее среднее с использованием групповых значений и переменной длины окна - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь создать скользящее среднее для столбца на основе столбца ID и метки времени измерения в R, но у меня много проблем с этим.

Вот как выглядит мой фрейм данных:

ID Measurement Value

A    1           10

A    2           12

A    3           14

B    1           10

B    2           12

B   3           14

B   4           10

Проблема в том, что у меня есть счетчики измерений от 9 до 76 для каждого идентификатора, поэтому я не нашел решения, которое бы создавало столбец скользящего среднего для каждого идентификатора при обработке переменной длины окна.

Моя цель - такой фрейм данных:

ID Measurement Value Average

A    1           10 NA

A    2           12 11

A    3           14 12

B    1           10 NA

B    2           12 11

B   3           14  12 

B   4           10 11.5 

Ответы [ 3 ]

0 голосов
/ 12 ноября 2018
library(dplyr)
data %>%
group_by(ID) %>%
mutate(rolling_mean = cummean(Value))

Первая строка будет означать первое значение для каждой группы (ID), а не NA.

0 голосов
/ 12 ноября 2018

Это не использует никаких пакетов.Он вычисляет совокупное среднее значение по идентификатору, за исключением того, что для Measurement, равного 1, оно вынуждает среднее значение равным NA.

transform(DF, Avg = ave(Value, ID, FUN = cumsum) / 
   ifelse(Measurement == 1, NA, Measurement))

, давая:

  ID Measurement Value  Avg
1  A           1    10   NA
2  A           2    12 11.0
3  A           3    14 12.0
4  B           1    10   NA
5  B           2    12 11.0
6  B           3    14 12.0
7  B           4    10 11.5

Примечание

Ввод DF в воспроизводимой форме:

Lines <- "ID Measurement Value
A    1           10
A    2           12
A    3           14
B    1           10
B    2           12
B    3           14
B    4           10"
DF <- read.table(text = Lines, header = TRUE, strip.white = TRUE, as.is = TRUE)
0 голосов
/ 12 ноября 2018

С вашими данными:

library(dplyr)

dat %>%
   group_by(Id) %>%
   mutate(Avrg = cumsum(Value)/(1:n()))

# A tibble: 7 x 4
# Groups:   Id [2]
  Id    Measurement Value  Avrg
  <chr>       <int> <int> <dbl>
1 A               1    10  10  
2 A               2    12  11  
3 A               3    14  12  
4 B               1    10  10  
5 B               2    12  11  
6 B               3    14  12  
7 B               4    10  11.5

Данные:

structure(list(Id = c("A", "A", "A", "B", "B", "B", "B"), 
               Measurement = c(1L, 2L, 3L, 1L, 2L, 3L, 4L), 
               Value = c(10L, 12L, 14L, 10L, 12L, 14L, 10L)
               ), 
          class = "data.frame", row.names = c(NA, -7L))

PS Я уверен, что в среднем 10 составляет 10, а не NA

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