我对血压记录进行了纵向随访.

与移动平均值(滚动平均值)相比,某一点的值预测性较差,这就是我想计算它的原因.数据看起来像

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

我想计算一个新的变量,叫做血压.该变量应为血压的移动平均值,并具有以下特征:

  • 移动平均值是当前值加上之前的值除以2.
  • 对于第一次观察,更新的血压只是当前的血压.如果是的话
  • 缺少的值应使用最接近的前一个值填充.

我试过以下方法:

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

我也试过rollaplyrollmeanr,但都没有成功.

推荐答案

如果你没有决心达到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)<n) return(bp)
  c(bp[1:(n-1)],rollapply(bp,width=n,mean,align="right"))  
}
test <- with(test,test[order(ID,YEAR_VISIT),])

test$BLOOD_PRESSURE_UPDATED <- 
  unlist(aggregate(BLOOD_PRESSURE~ID,test,get.mav,na.action=NULL,n=2)$BLOOD_PRESSURE)
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
# ...

This works for moving averages > 2 as well.

这是一个数据.表解决方案,如果您的数据集很大,可能会快much.

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
# ...

R相关问答推荐

如何将标签移动到堆叠甜甜圈图表中每个切片的边缘?

R -创建一列,指示另一列是否具有相同的值

使用facet_wrap()时如何将面板标题转换为脚注?

如何在热图中绘制一个图形,但在每个单元格中通过饼形图显示?

如何将y轴上的线定位得彼此更近

R Lubridate:舍入/快照日期时间到一天中最近的任意时间?

带有gplot 2的十字舱口

在R底座中更改白天和夜晚的背景 colored颜色

如何使用`ggplot2::geom_segment()`或`ggspatial::geom_spatial_segment()`来处理不在格林威治中心的sf对象?

当两个图层映射到相同的美学时,隐藏一个图层的图例值

从BRM预测价值

移除仪表板Quarto中顶盖和车身之间的白色区域

在使用bslb和bootstrap5时,有没有办法更改特定dt行的 colored颜色 ?

在ggplot2的框图中绘制所有级别的系数

当我们有多个反斜杠和/特殊字符时使用Gsubing

如何在ggplot2中创建多个y轴(每个变量一个)

有没有办法通过str_Detect()或其他字符串匹配函数来连接两个长度不等的数据帧?

整理曲线图、曲线图和点图

替换在以前工作的代码中有x行&q;错误(geom_sf/gganimate/dow_mark)

每行不同列上的行求和