感谢所有人就问题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分钟)。我怎样才能改善这一点?谢谢!
答案 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秒(〜四倍)。