Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.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
将最近的平均值与R中的当前值进行比较_R - Fatal编程技术网

将最近的平均值与R中的当前值进行比较

将最近的平均值与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/

我使用的是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/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)