使用R处理入院数据(第二部分)

时间:2010-11-12 09:48:11

标签: r plyr

感谢所有人就问题processing of hospital admission data using 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"
              )

这可以解决我的问题,但是当数据集有8818 unique(Patients_ID)和1861 unique(Date)时,它非常慢(在P4 3.2机器上超过20分钟)。我怎样才能改善这一点?谢谢!

1 个答案:

答案 0 :(得分: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()无法加速 - 我对这个包不熟悉。

这两个版本是否以类似的方式扩展 - 即仅因为aggregate()版本在简单数据的这些重复测试中更快,并不意味着当应用于更大的数据时,您将获得相同的好处任务 - 还有待观察,但我会让你用超过几个病人测试数据的小子集上的两个版本,看看它们的扩展程度。


修改 快速测试 - 重复您给我们的患者数据以生成四个新患者(总共5个),所有患者都具有相同的数据,这表明总体患者可以更好地扩展。对于1000次重复,aggregate()版本的执行时间上升到4.6秒(〜倍增),而ddply()版本的时间上升到52秒(〜四倍)。