感谢大家对问题提出建议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)
时它非常慢(在 P4 3.2 机器上超过 20 分钟)和 1861 unique(Date)
.我该如何改进?谢谢!
最佳答案
假设您的数据在对象 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
对比
> 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 名),所有患者都具有相同的数据,这表明汇总的比例要好一些。
aggregate()
的执行时间1000 次重复的版本上升到 4.6 秒(~翻倍),而 ddply()
的时间增加了版本上升到 52 秒(~四倍)。
关于r - 使用 R 处理入院数据(第二部分),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4163352/