2

次の形式のデータがあります-

ID EVID ADMIT   DC      DRG  CLIN_C PRIN_DX  
1  AA   1/1/13  2/1/13  ABC  1A234  Y  
1  AA   1/1/13  2/1/13  ABC  1B345  N  
1  AA   1/1/13  2/1/13  ABC  1C234  N  
1  AA   1/1/13  2/1/13  ABC  1234C  N  

1  BB   3/1/13  2/15/13 EEE  C12C3  Y  
1  BB   3/1/13  2/15/13 EEE  1B345  N  
1  BB   3/1/13  2/15/13 EEE  1C234  N  
1  BB   3/1/13  2/15/13 EEE  987D   N  

2  CC   3/1/13  2/15/13 EEE  C12C3  Y  
2  CC   3/1/13  2/15/13 EEE  546X   N  
2  CC   3/1/13  2/15/13 EEE  1C234  N  
2  CC   3/1/13  2/15/13 EEE  1234C  N 

そして、次の形式のデータが必要です。

ID EVID ADMIT   DC      DRG  PRIN_DX 1B345  1C234 1234C 987D 546X  
1  AA   1/1/13  2/1/13  ABC  1A234     1      1     1    0    0  
1  BB   3/1/13  2/15/13 EEE  C12C3     1      1     0    1    0  
2  CC   3/1/13  2/15/13 EEE  C12C3     0      1     0    0    1    

できればRでやりたいです。reshape/reshape2 を試しましたが、グループ化された行を処理する明らかな方法が見つかりません - グループ化された行を列に分割し、残りの行を集約します。

データは数百件の入院記録であり、妥当な大きさです。

4

3 に答える 3

5

DF入力データフレームであると仮定して、これを試してください:

library(reshape2)

FUN <- function(i) with(DF[i, ], CLIN_C[PRIN_DX == "Y"])
DF$PRIN_DX <- ave(1:nrow(DF), DF$ID, DF$EVID, FUN = FUN)

dcast(DF, ... ~ CLIN_C, fun = length, value.var = 1)

与える:

  ID EVID  ADMIT      DC DRG PRIN_DX 1234C 1A234 1B345 1C234 546X 987D C12C3
1  1   AA 1/1/13  2/1/13 ABC   1A234     1     1     1     1    0    0     0
2  1   BB 3/1/13 2/15/13 EEE   C12C3     0     0     1     1    0    1     1
3  2   CC 3/1/13 2/15/13 EEE   C12C3     1     0     0     1    1    0     1

更新: 簡素化

于 2013-06-06T01:37:24.487 に答える
1

plyr と model.matrix を使用して、因子をダミー変数に強制するさらに別の方法。データを単純化し、常に PRIN_DX があると仮定しました。

df <- data.frame(ID=c(1,1,2,2,3,3), EVID=c(0,0,1,1,3,3), CLIN_C = c('A1','B1','C1','D1','C1','D2'), PRIN_DX=c('Y','N','Y','N','Y','N'))
df$CLIN_C <- factor(df$CLIN_C)

agg_fun <- function(x) {
  temp1 <- x$CLIN[which(x$PRIN_DX=='Y')[1]]
  temp2 <- apply(model.matrix(~x$CLIN_C-1), 2, sum)
  out <- data.frame(temp1, t(temp2))
  names(out) <- c('PRIN_DX', levels(x$CLIN_C))  
  return(out)
}

library(plyr)
ddply(df, .(ID, EVID), agg_fun)
于 2013-06-06T02:11:46.030 に答える
1

元の質問では、プリンシパル診断 (PRIN_DX) が目的の出力データセットの列として含まれていないことに気付きました。そのため、plyr と reshape2 を使用してその結果を取得するオプションを次に示します。

require(reshape2)
require(plyr)

# Make a variable specifically for the principle diagnosis
df2 = ddply(df, .(ID, EVID, ADMIT, DC, DRG), transform, PRIN_DX2 = CLIN_C[PRIN_DX == "Y"] )
# Pull out the non-principle diagnoses
df2$CLIN_C = ifelse(df2$PRIN_DX == "N", as.character(df2$CLIN_C), NA)

# Make the order of CLIN_C match the order of appearance
df2$CLIN_C = factor(df2$CLIN_C, levels = unique(df2$CLIN_C) )

dcast(na.omit(df2), ID + EVID + ADMIT + DC + DRG + PRIN_DX2 ~ CLIN_C, fun = length)

これにより、次のことが得られます。

  ID EVID  ADMIT      DC DRG PRIN_DX2 1B345 1C234 1234C 987D 546X
1  1   AA 1/1/13  2/1/13 ABC    1A234     1     1     1    0    0
2  1   BB 3/1/13 2/15/13 EEE    C12C3     1     1     0    1    0
3  2   CC 3/1/13 2/15/13 EEE    C12C3     0     1     1    0    1
于 2013-06-06T22:26:12.853 に答える