2010-11-12 49 views
2

感謝大家對processing of hospital admission data using R這個問題提出的建議,我對這個問題有其他問題,實際上應該是這個問題之前的任務。使用R處理醫院門診數據(第二部分)

現在我有一個這樣的數據集:

Patient_ID Date Ward 
P001  1 A 
P001  2 A 
P001  3 A 
P001  4 A 
P001  4 B 
P001  5 B 
P001  6 B 
P001  7 B 
P001  7 C 
P001  8 B 
P001  9 B 
P001  10 B 

我需要將其轉換成:

Patient_ID Date Ward 
P001  1 A 
P001  2 A 
P001  3 A 
P001  4 A;B 
P001  5 B 
P001  6 B 
P001  7 B;C 
P001  8 B 
P001  9 B 
P001  10 B 

目前我一直在使用ddply轉換它,代碼如下附:

data <- ddply(data, 
       c("Patient_ID", "Date"), 
       function(df) 
       {data.frame(Ward=paste(unique(df[,"Ward"]),collapse=";")) 
       }, 
       .progress="text" 
      ) 

這可以解決我的問題,但它非常慢(超過20分鐘在P4 3.2 mac hine)當數據集有8818 unique(Patients_ID)和1861 unique(Date)。我該如何改進?謝謝!

回答

3

一些作品是這樣的,假設你的數據在對象pdat

res <- with(pdat, 
      aggregate(Ward, by = list(Date = Date, Patient_ID = Patient_ID), 
         FUN = paste, collapse = ";")) 
names(res)[3] <- "Ward" 
res <- res[, c(2,1,3)] 

,並給出:

> res 
    Patient_ID Date Ward 
1  P001 1 A 
2  P001 2 A 
3  P001 3 A 
4  P001 4 A;B 
5  P001 5 B 
6  P001 6 B 
7  P001 7 B;C 
8  P001 8 B 
9  P001 9 B 
10  P001 10 B 

應該高高興興地擴展到更多的患者等優點,是頗有幾分比快您ddply()版本:

> system.time(replicate(1000,{ 
+ res <- with(pdat, 
+    aggregate(Ward, by = list(Date = Date, Patient_ID = Patient_ID), 
+      FUN = paste, collapse = ";")) 
+ names(res)[3] <- "Ward" 
+ res <- res[, c(2,1,3)] 
+ })) 
    user system elapsed 
    2.113 0.002 2.137 

VS

> system.time(replicate(1000,{ 
+ ddply(pdat, 
+  c("Patient_ID", "Date"), 
+  function(df) 
+  data.frame(Ward=paste(unique(df[,"Ward"]),collapse=";")) 
+  ) 
+ })) 
    user system elapsed 
12.862 0.006 12.966 

但是,這並不意味着ddply()不能加速 - 我不熟悉這個軟件包。

這兩個版本是否以相似的方式縮放 - 也就是說,這些重複的簡單數據測試版本更快,並不意味着在應用於更大的任務時可以獲得相同的好處 - 仍然存在被看到,但我會離開你去測試你的數據的小部分的兩個版本與超過幾個病人,看看他們的規模。


編輯: 快速測試 - 重複你給了我們以產生四個新的病人(給共5個),全部採用相同的數據,患者數據表明,聚合一個秤好一點。 aggregate()版本的執行時間在1000次重複中上升到4.6秒(〜雙倍),而ddply()版本的時間上升到52秒(〜四倍)。