每次医生就诊时用行计算数据中曾经经历过这种情况的人数

Count people ever experiencing condition in data with row per doctor's visit

我是 R 的新手,如果这个问题已经得到解答,我深表歉意,但我无法找到它,因为我不知道要搜索什么。

我有一个非常大的与健康相关的数据集,其中有一行表示在某个特定时间段内发生的每位医生的就诊。数据集中的变量之一是患者 ID。很明显,数据集中存在大量重复的患者 ID——我有大约 50 万个唯一患者 ID 和大约 900 万个观察值。数据中的其他变量是疾病 A、疾病 B 和疾病 C。其中每一个都是 0 或 1--0,表示患者在就诊时没有患病,而 1 表示他们确实患病。最后一个重要变量是 race/ethnicity.

我最终想要的是:

  1. 一种计算就诊期间曾患过每种疾病的患者人数的方法。因此,例如,如果在患者 ID == 1 的任何观察中疾病 A 为 1,则该患者将被视为曾经患有疾病 A。
  2. 在曾经患过每种疾病的人中,有一种方法可以计算他们因这种疾病去看医生的次数,这样我就可以比较平均次数是否因 race/ethnicity 变量而不同。

我完全不知道如何做到这两点。也许使用 group_by 并一起总结?我想知道是否有与 reshape 包相关的解决方案可以帮助实现第二个目标。不过,我对 R 还不够熟悉,无法深入了解,所以我希望得到一些帮助。

以下是一些与实际数据具有相似特征的示例数据:

structure(list(patient_id = c(2L, 1L, 1L, 1L, 4L, 1L, 2L, 5L, 
5L, 1L, 2L, 1L, 2L, 4L, 5L, 2L, 4L, 2L, 1L, 3L, 3L, 1L, 2L, 1L, 
4L, 5L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 3L, 3L, 3L, 1L, 3L, 3L, 4L, 
4L, 1L, 2L, 5L, 5L, 2L, 2L, 2L, 1L, 2L, 2L, 4L, 1L, 3L, 2L, 5L, 
4L, 3L, 3L, 1L, 2L, 1L, 2L, 5L, 5L, 4L, 4L, 4L, 4L, 4L, 2L, 4L, 
4L, 3L, 4L, 5L, 4L, 3L, 4L, 5L, 1L, 5L, 4L, 1L, 3L, 1L, 1L, 3L, 
5L, 2L), diseaseA = c(1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 
0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 
1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 
0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1), diseaseB = c(0, 1, 
0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 
0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 
0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 
1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 
1, 0, 1, 0), diseaseC = c(0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 
1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 
1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 
1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 
0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0), raceeth = structure(c(2L, 
2L, 2L, 2L, 3L, 2L, 2L, 3L, 3L, 2L, 2L, 2L, 2L, 3L, 3L, 2L, 3L, 
2L, 2L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
1L, 1L, 1L, 2L, 1L, 1L, 3L, 3L, 2L, 2L, 3L, 3L, 2L, 2L, 2L, 2L, 
2L, 2L, 3L, 2L, 1L, 2L, 3L, 3L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 2L, 3L, 3L, 1L, 3L, 3L, 3L, 1L, 3L, 3L, 2L, 
3L, 3L, 2L, 1L, 2L, 2L, 1L, 3L, 2L), .Label = c("Hispanic", "NH White", 
"NH Black"), class = "factor")), row.names = c(NA, 90L), class = "data.frame")

如果我可以提供任何额外的信息,请告诉我。

我计算了每位患者的疾病(我认为患者坚持他们的种族,这就是为什么按 patient_id 和种族分组应该没问题,我按两个变量分组,因为我需要保留种族列还有)

library(dplyr)

df2 <- df %>%
group_by(patient_id,raceeth) %>%
summarise_all(sum) %>%
ungroup

df2

输出;

  patient_id raceeth  diseaseA diseaseB diseaseC
       <int> <fct>       <dbl>    <dbl>    <dbl>
1          1 NH White       12        8       11
2          2 NH White       11       11       10
3          3 Hispanic        6        4        7
4          4 NH Black       12        8        8
5          5 NH Black        3        8        6

现在我可以计算每个种族组的平均值;

df3 <- df2 %>%
select(-patient_id) %>%
group_by(raceeth) %>%
summarise_all(mean)%>%
ungroup

df3

输出;

  raceeth  diseaseA diseaseB diseaseC
  <fct>       <dbl>    <dbl>    <dbl>
1 Hispanic      6        4        7  
2 NH White     11.5      9.5     10.5
3 NH Black      7.5      8        7