2016-09-20 4 views
1

Я использую Rstudio (версия .99.903), имею компьютер (Windows 8). У меня есть следующий вопрос со вчерашнего дня, поскольку проблема усложнилась. Вот как выглядят данные, как:Сравнение последних усредненных значений с текущим значением в R

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 26 сравнения не было. Аналогичным образом, для ID 53 не было бы сравнения за 5/12/2010.

Когда я говорю «сравниваю», я не делаю никакого анализа или визуализации. Я просто хочу новый столбец, который принимает среднее значение этих коэффициентов зачисления до одного года до текущего (я буду их планировать и ранжировать их позже). Есть> 20 000 точек данных. Любая помощь приветствуется.

ответ

-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)