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

时间:2016-09-20 20:18:00

标签: r

我正在使用Rstudio(版本.99.903),有一台PC(Windows 8)。我昨天有一个跟进问题,问题变得更加复杂。以下是数据的样子:

 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之前的ID中没有其他日期,则不应进行比较。例如,对于ID 26,将没有比较。同样,对于ID 53,2010年5月12日将没有比较。

当我说"比较"我没有做任何分析或可视化。我只是想要一个新的专栏,它将那些入学率的平均值提高到当前一年之前的一年(我将绘制它们并将百分位数排在后面)。有> 20,000个数据点。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:-1)

详细但可能是高性能的方式。没有巨型循环遍历数据帧的所有行。两个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

计算相关行。您可以与新创建的Rate列进行比较。

您可能需要稍微更改代码,因为我更改了删除列名称中的空格

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)