繁体   English   中英

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

[英]comparing recent averaged values to a current value in R

我正在使用Rstudio(0.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,日期1/19/2011的入学率为0.2,我想将其与8/17/2010和5/12/2010的平均入学率(例如0.15)进行比较。

如果ID中当前日期之前没有其他日期,则不应进行比较。 例如,对于ID 26,将没有比较。 同样,对于ID 53,2010年5月12日将没有比较。

当我说“比较”时,我没有做任何分析或可视化。 我只是想要一个新列,该列将那些入学率的平均值比当前入学率高出一年(我将对其进行绘图,并在以后对它们进行百分位排列)。 有> 20,000个数据点。 任何帮助将非常感激。

详细但可能高性能的方法。 没有巨型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

计算相关行。 您可以使用新创建的“ 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM