将最近的平均值与R中的当前值进行比较
我使用的是Rstudio(99.903版),有一台电脑(Windows8)。随着问题变得越来越复杂,我有一个从昨天开始的后续问题。以下是数据的外观:将最近的平均值与R中的当前值进行比较,r,R,我使用的是Rstudio(99.903版),有一台电脑(Windows8)。随着问题变得越来越复杂,我有一个从昨天开始的后续问题。以下是数据的外观: Number Trial ID Open date Enrollment rate 420 NCT00091442 9 1/28/2005 0.2 1476 NCT00301457 26 2/22/2008 1 10559 NCT01307397 34 7/28/
Number Trial ID Open date Enrollment rate
420 NCT00091442 9 1/28/2005 0.2
1476 NCT00301457 26 2/22/2008 1
10559 NCT01307397 34 7/28/2011 0.6
6794 NCT00948675 53 5/12/2010 0
6451 NCT00917384 53 8/17/2010 0.3
8754 NCT01168973 53 1/19/2011 0.2
8578 NCT01140347 53 12/30/2011 2.4
11655 NCT01358877 53 4/2/2012 0.3
428 NCT00091442 55 9/7/2005 0.1
112 NCT00065325 62 10/15/2003 0.2
477 NCT00091442 62 11/11/2005 0.1
16277 NCT01843374 62 12/16/2013 0.2
17386 NCT01905657 62 1/8/2014 0.6
411 NCT00091442 66 1/12/2005 0
我需要做的是将给定ID中最新日期的注册率与之前一年的平均值进行比较。例如,对于ID 53,2011年1月19日的注册率为0.2,我想将其与2010年8月17日和2010年5月12日的平均注册率(例如,0.15)进行比较
如果ID中当前日期之前没有其他日期,则不应进行比较。例如,对于ID26,将不进行比较。同样,对于ID53,2010年12月5日也没有比较
当我说“比较”时,我没有做任何分析或想象。我只是想要一个新的列,它取当前一年前入学率的平均值(稍后我将绘制它们并对它们进行百分位排序)。有超过20000个数据点。任何帮助都将不胜感激。详细但可能是高性能的方法。在数据帧的所有行上都没有巨型for循环。这两个sapply循环只在一个大的数值向量上运行,无论数据行数如何,这个向量都应该相对较快。但我相信很快就会有人提出一个简单的dplyr解决方案 该方法假定您的数据首先按
ID
排序,然后按Opendata
排序。如果未对它们进行排序,则需要先对它们进行排序
# Find indices where the same ID is above and below it
A = which(unlist(sapply(X = rle(df$ID)$lengths,
FUN = function(x) {if(x == 1) return(F)
if(x == 2) return(c(F,F))
if(x >= 3) return(c(F,rep(T, x-2),F))})))
# Store list of date, should speed up code a tiny bit
V_opendate = df$Opendate
# Further filter on A, where the date difference < 365 days
B = A[sapply(A, function(x) (abs(V_opendate[x]-V_opendate[x-1]) < 365) & (abs(V_opendate[x]-V_opendate[x+1]) < 365))]
# Return actual indices of rows - 1, rows +1
C = sapply(B, function(x) c(x-1, x+1), simplify = F)
# Actually take the mean of these cases
D = sapply(C, function(x) mean(df[x,]$Enrollment))
# Create new column rate and fill in with value of C. You can do the comparison from here.
df[B,"Rate"] = D
Number Trial ID Opendate Enrollmentrate Rate
1 420 NCT00091442 9 2005-01-28 0.2 NA
2 1476 NCT00301457 26 2008-02-22 1.0 NA
3 10559 NCT01307397 34 2011-07-28 0.6 NA
4 6794 NCT00948675 53 2010-05-12 0.0 NA
5 6451 NCT00917384 53 2010-08-17 0.3 0.10
6 8754 NCT01168973 53 2011-01-19 0.2 1.35
7 8578 NCT01140347 53 2011-12-30 2.4 0.25
8 11655 NCT01358877 53 2012-04-02 0.3 NA
9 428 NCT00091442 55 2005-09-07 0.1 NA
10 112 NCT00065325 62 2003-10-15 0.2 NA
11 477 NCT00091442 62 2005-11-11 0.1 NA
12 16277 NCT01843374 62 2013-12-16 0.2 NA
13 17386 NCT01905657 62 2014-01-08 0.6 NA
14 411 NCT00091442 66 2005-01-12 0.0 NA
14 411 NCT00091442 66 1/12/2005 0.00 NA
df = read.table(text = " Number Trial ID Opendate Enrollmentrate
420 NCT00091442 9 1/28/2005 0.2
1476 NCT00301457 26 2/22/2008 1
10559 NCT01307397 34 7/28/2011 0.6
6794 NCT00948675 53 5/12/2010 0
6451 NCT00917384 53 8/17/2010 0.3
8754 NCT01168973 53 1/19/2011 0.2
8578 NCT01140347 53 12/30/2011 2.4
11655 NCT01358877 53 4/2/2012 0.3
428 NCT00091442 55 9/7/2005 0.1
112 NCT00065325 62 10/15/2003 0.2
477 NCT00091442 62 11/11/2005 0.1
16277 NCT01843374 62 12/16/2013 0.2
17386 NCT01905657 62 1/8/2014 0.6
411 NCT00091442 66 1/12/2005 0", header = T)