Среднее значение подвижности (скользящее среднее) по группе / id с dplyr

У меня есть продольное наблюдение за записями артериального давления.

Значение в определенной точке менее прогностическое, чем скользящее среднее (среднее значение прокатки), поэтому я хотел бы рассчитать его. Данные выглядят так:

test <- read.table(header=TRUE, text = " ID AGE YEAR_VISIT BLOOD_PRESSURE TREATMENT 1 20 2000 NA 3 1 21 2001 129 2 1 22 2002 145 3 1 22 2002 130 2 2 23 2003 NA NA 2 30 2010 150 2 2 31 2011 110 3 4 50 2005 140 3 4 50 2005 130 3 4 50 2005 NA 3 4 51 2006 312 2 5 27 2010 140 4 5 28 2011 170 4 5 29 2012 160 NA 7 40 2007 120 NA ") 

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

  • Скользящее среднее – текущее значение плюс предыдущее значение, деленное на два.
  • Для первого наблюдения BLOOD_PRESSURE_UPDATED является только текущим BLOOD_PRESSURE. Если этого не хватает, BLOOD_PRESSURE_UPDATED должно быть общим средним значением.
  • Недопустимые значения должны быть заполнены с ближайшим предыдущим значением.

Я пробовал следующее:

 test2 % group_by(ID) %>% arrange(ID, YEAR_VISIT) %>% mutate(BLOOD_PRESSURE_UPDATED = rollmean(x=BLOOD_PRESSURE, 2)) %>% ungroup() 

Я также попробовал rollaply и rollmeanr без успеха.

Я был бы признателен за помощь.

Если вы не привержены dplyr это должно работать:

 get.mav <- function(bp,n=2){ require(zoo) if(is.na(bp[1])) bp[1] <- mean(bp,na.rm=TRUE) bp <- na.locf(bp,na.rm=FALSE) if(length(bp) то get.mav <- function(bp,n=2){ require(zoo) if(is.na(bp[1])) bp[1] <- mean(bp,na.rm=TRUE) bp <- na.locf(bp,na.rm=FALSE) if(length(bp) 

Это работает и для скользящих средних> 2.

И вот решение data.table, которое, вероятно, будет намного быстрее, если ваш dataset будет большим.

 library(data.table) setDT(test) # converts test to a data.table in place setkey(test,ID,YEAR_VISIT) test[,BLOOD_PRESSURE_UPDATED:=as.numeric(get.mav(BLOOD_PRESSURE,2)),by=ID] test # ID AGE YEAR_VISIT BLOOD_PRESSURE TREATMENT BLOOD_PRESSURE_UPDATED # 1: 1 20 2000 NA 3 134.6667 # 2: 1 21 2001 129 2 131.8333 # 3: 1 22 2002 145 3 137.0000 # 4: 1 22 2002 130 2 137.5000 # 5: 2 23 2003 NA NA 130.0000 # 6: 2 30 2010 150 2 140.0000 # 7: 2 31 2011 110 3 130.0000 # ... 

Как насчет этого?

  library(dplyr) test2<-arrange(test,ID,YEAR_VISIT) %>% mutate(lag1=lag(BLOOD_PRESSURE), lag2=lag(BLOOD_PRESSURE,2), movave=(lag1+lag2)/2) 

Другое решение, использующее функцию «rollapply» в пакете zoo (мне больше нравится)

 library(dplyr) library(zoo) test2<-arrange(test,ID,YEAR_VISIT) %>% mutate(ma2=rollapply(BLOOD_PRESSURE,2,mean,align='right',fill=NA)) 
  • Разрыв строки, когда нет данных в ggplot2
  • Указание формулы в R с glm без явного объявления каждого ковариата
  • Передайте вектор имен переменных, чтобы упорядочить () в dplyr
  • ggplot2 - аннотировать вне участка
  • Не удалось обновить пакеты R в библиотеке по умолчанию в Windows 7
  • R shiny переход реагирует на selectInput выбор
  • duplicate 'row.names' не допускается ошибка
  • Список всех файлов, соответствующих шаблону полного пути в R
  • Цикл «для» добавляет только последний слой ggplot
  • ggplot2 heatmaps: использование разных gradleиентов для категорий
  • двойные точки в ggplot
  • Давайте будем гением компьютера.