0

行政裁判所で完了した個々のケースを表す、590 万行と 4 列のデータフレーム「x」があります。データは stata データセットからインポートされ、日付フィールドは整数として入力されました。これは私の目的には問題ありません。問題のケースの完了日から 30 日以内に裁判官が完了したケースの数を計算して、ケースロード変数を作成したいと考えています。

最初の 34 行のデータは次のとおりです。

idnumber    compdate    judge
1   9615    JVC
2   15316   BAN
3   15887   WLA
4   11968   WFN
5   15001   CLR
6   13914   IEB
7   14760   HSD
8   11063   RJD
9   10948   PPL
10  16502   BAN
11  15391   WCP
12  14587   LRD
13  10672   RTG
14  11864   JCW
15  15071   GMR
16  15082   PAM
17  11697   DLK
18  10660   ADP
19  13284   ECC
20  13052   JWR
21  15987   MAK
22  10105   HEA
23  14298   CLR
24  18154   MMT
25  10392   HEA
26  10157   ERH
27  9188    RBR
28  12173   JCW
29  10234   PAR
30  10437   ADP
31  11347   RDW
32  14032   JTZ
33  11876   AMC
34  11470   AMC

これが私が思いついたものです。したがって、レコードごとに、その特定の裁判官のデータのサブセットを取得し、30 日間のウィンドウで決定されたケースをサブセット化し、サブセット化されたデータフレーム内のベクトルの長さを対象ケースのケースロード変数に割り当てます。次のように:

for(i in 1:length(x$idnumber)){
  e<-x$compdate[i]
  f<-e-29
  a<-x[x$judge==x$judge[i] & !is.na(x$compdate),]
  b<-a[a$compdate<=e & a$compdate>=f,]
  x$caseload[i]<-length(b$idnumber)
}

動作していますが、完了するまでに非常に時間がかかります。これを最適化するにはどうすればよいか、またはこれをより簡単に行うにはどうすればよいですか。申し訳ありませんが、私は r とプログラミングに非常に慣れていません - 私は裁判所のデータを分析しようとしている法律の教授です.... あなたの助けに感謝します。ありがとう。ケン

4

2 に答える 2

3

すべての行をループする必要はありません。列全体を一度に操作できます。まず、いくつかのデータを作成します。

# Create some data.
n<-6e6 # cases
judges<-apply(combn(LETTERS,3),2,paste0,collapse='') # About 2600 judges
set.seed(1)
x<-data.frame(idnumber=1:n,judge=sample(judges,n,replace=TRUE),compdate=Sys.Date()+round(runif(n,1,120)))

これで、ローリング ウィンドウ関数を作成し、各ジャッジで実行できます。

# Sort
x<-x[order(x$judge,x$compdate),]
# Create a little rolling window function.
rolling.window<-function(y,window=30) seq_along(y) - findInterval(y-window,y)
# Run the little function on each judge.
x$workload<-unlist(by(x$compdate,x$judge,rolling.window)))
于 2013-10-06T19:59:45.633 に答える
2

ローリング計算の経験はあまりありませんが...

  • これは、ケースごとではなく、1 日ごとに計算します (同じ日のケースでも同じになるため)。
  • ケース数の累積合計を計算し、この合計の現在の値と 31 日前 (またはmin{daysAgo:daysAgo>30}ケースは毎日解決されないため) の合計の値の差を取ります。

おそらく、data.table を使用するのが最も速いでしょう。これは @nograpes シミュレートされたデータを使用した私の試みです。コメントは で始まり#ます。

require(data.table)
DT <- data.table(x)
DT[,compdate:=as.integer(compdate)]
setkey(DT,judge,compdate)

# count cases for each day
ldt <- DT[,.N,by='judge,compdate']
# cumulative sum of counts
ldt[,nrun:=cumsum(N),by=judge]
# see how far to look back
ldt[,lookbk:=sapply(1:.N,function(i){
    z       <-  compdate[i]-compdate[i:1]
    older   <-  which(z>30)
    if (length(older)) min(older)-1L else as(NA,'integer')
}),by=judge]
# compute cumsum(today) - cumsum(more than 30 days ago)
ldt[,wload:=list(sapply(1:.N,function(i)
    nrun[i]-ifelse(is.na(lookbk[i]),0,nrun[i-lookbk[i]])
))]

私のラップトップでは、これには 1 分もかかりません。次のコマンドを実行して、1 つのジャッジの出力を確認します。

print(ldt['XYZ'],nrow=120)
于 2013-10-06T23:50:15.897 に答える