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

标签 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) 时它非常慢(在 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/

相关文章:

R colSums 按组

c++ - 引用资料 |大数据意外崩溃

r - 更快地填充 R 数据框中缺失的列

R - 在矩阵中的特定列上使用 APPLY

在R中重复vector的元素

R:按总和汇总包含 NA 的列值,同时按 ID 分组

r - 疯狂地尝试编写一个对数据框的一列进行操作的简单函数

r - 如何使用网格搜索和 tidymodels 的单个验证折叠来调整模型?

r - 如何链接图例和颜色选择的 plotly 轨迹?

r - 列出数据帧子集中的所有变量(及其比例)