2010-11-12 21 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秒(〜四倍)。