2013-06-06 32 views
2

我有以下格式的數據 -R中轉換分組行數據爲列

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,但找不到處理分組行的明顯方法 - 將分組的行拆分成列,然後聚合剩餘的行。

數據是幾百家醫院入院的記錄 - 如此合理的大。

+0

目前還不清楚(對我)有什麼被聚合的,什麼是不是......它看起來也像是'PRIN_DX'並不代表相同的數據類型長格式,如寬格式。我的第一個想法是,你可能想要這樣的東西:'library(reshape2); dcast(ID + EVID + ADMIT + DC + DRG〜CLIN_C,data = x)' – Chase

+0

列ID,EVID,ADMIT,DC,DRG都應該被聚合 - 這個數據對於給定的許可是相同的。 CLINC_C是臨牀代碼,用於識別在入院期間分配的所有診斷 - 可以分配1至20個。 PRIN_DX識別錄取過程中的原則診斷。我希望將CLIN_C轉換爲每次錄取事件的獨立列,但如果可能的話,請確定原則性診斷。只有聚合和行到列纔會感到滿意 – Matthew

回答

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 

UPDATE:簡化

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