2016-09-20 9 views
1

私はRstudio(バージョン.99.903)を使用しており、PC(ウィンドウズ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 

は、それに先立って1年までであるそれらの値の平均値に与えられたIDの中で最も現在の日付の就学率を比較しています。例えば、ID 53の場合、2011年1月19日の日付は0.2の登録率であり、これを2010年8月17日と2010年5月12日の登録率の平均(例えば0.15)と比較したいと思います。 。

現在のIDより前のIDに他の日付がない場合、比較は行われません。例えば、ID26の場合、比較は行われません。同様に、ID 53の場合、2010年5月12日の比較はありません。

私が「比較」と言うとき、私は分析や視覚化を行っていません。私は、現在の入学率の平均値を現在の入学率の1年前までに取っておく新しい列がほしいと思うだけです(私はそれらをプロットし、後でそれらをランキングする)。 20,000を超えるデータポイントがあります。どんな助けでも大歓迎です。

答えて

-1

これを実行する方法は冗長ですが、おそらく高性能です。データフレームのすべての行でループを繰り返す巨人はいません。 2つのサプリル・ループは大きな数値ベクトルでしか動作しません。これは、データ行数に関係なく比較的高速でなければなりません。しかし、私は誰かが些細な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) 
関連する問題