Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用dplyr按组/id列出的滚动平均值(移动平均值)_R_Dplyr - Fatal编程技术网

使用dplyr按组/id列出的滚动平均值(移动平均值)

使用dplyr按组/id列出的滚动平均值(移动平均值),r,dplyr,R,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

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

某一点的值的预测性不如移动平均值(滚动平均值),这就是为什么我要计算它。数据看起来像

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
                   ")
test%
安排(身份证,年份)%>%
变异(血压更新=平均值(x=血压,2))%>%
解组()

我也尝试了
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)<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
# ...
这个怎么样

    library(dplyr)   
    test2<-arrange(test,ID,YEAR_VISIT) %>% 
           mutate(lag1=lag(BLOOD_PRESSURE),
                  lag2=lag(BLOOD_PRESSURE,2),
                  movave=(lag1+lag2)/2)
库(dplyr)
测试2%
突变(lag1=滞后(血压),
lag2=滞后(血压,2),
movave=(lag1+lag2)/2)
在zoo包中使用“rollapply”函数的另一个解决方案(我更喜欢)

库(dplyr)
图书馆(动物园)
测试2%
变异(ma2=rollapply(血压,2,平均值,右对齐,填充=NA))
试试这个:

library(dplyr)
library(zoo)
test2<-arrange(test,ID,YEAR_VISIT) %>% group_by(subject)%>%
       mutate(ma2=rollapply(BLOOD_PRESSURE,2,mean,align='right',fill=NA))
库(dplyr)
图书馆(动物园)
测试2%组别(受试者)%>%
变异(ma2=rollapply(血压,2,平均值,右对齐,填充=NA))
是一种“新er”替代品,可以很好地与tidyverse配合使用

像这样的东西就行了

test2 <- test %>%
  group_by(ID) %>%
  arrange(ID, YEAR_VISIT) %>%
  mutate(BLOOD_PRESSURE_UPDATED = slider::slide_dbl(BLOOD_PRESSURE, mean, .before = 1, .after = 0)) %>%
ungroup()
test2%
分组依据(ID)%>%
安排(身份证,年份)%>%
变异(血压更新=滑块::滑块dbl(血压,平均值,.before=1,.after=0))%>%
解组()

计算移动平均值时,返回的元素数小于数据行数,即只返回“n-1”个元素。因此,这可能是造成问题的原因。或者您会考虑单独添加移动平均列,例如:Test2美元HealthPrasuRex感谢KFB的努力。不幸的是,它没有起作用。我也尝试了一些经过编辑的版本。也许动物园的功能不适合这个?我已经编写了以下代码:test5谢谢@jlhoward!-它解决了这个问题,但是data.table方法(这两种方法中速度较快的)非常慢(300万行,在新的MBP上15分钟)。不过,问题还是解决了。谢谢@jlhoward。这节省了我很长的计算时间…我之前使用的是ddply,时间真的很糟糕@jhoward新的
frollmean
函数应该作为这里的
get.mav
的替代品。关于第1个元素NA操作的更多信息,请注意,如果使用rollapplyr,align参数可能会被删除。您也可以使用最后一行中的
rollmean
函数:
rollmean(血压,2,align='right',fill=NA)
library(dplyr)
library(zoo)
test2<-arrange(test,ID,YEAR_VISIT) %>%
       mutate(ma2=rollapply(BLOOD_PRESSURE,2,mean,align='right',fill=NA))
library(dplyr)
library(zoo)
test2<-arrange(test,ID,YEAR_VISIT) %>% group_by(subject)%>%
       mutate(ma2=rollapply(BLOOD_PRESSURE,2,mean,align='right',fill=NA))
test2 <- test %>%
  group_by(ID) %>%
  arrange(ID, YEAR_VISIT) %>%
  mutate(BLOOD_PRESSURE_UPDATED = slider::slide_dbl(BLOOD_PRESSURE, mean, .before = 1, .after = 0)) %>%
ungroup()