我有一个数据框,其中包含过去10年内具有诊断代码历史的患者;类似的东西:
Patient_ID Diagnosis_Codes Diag_Code_Description
A 1 1:Hypertension
A 1 1:Hypertension
A 4 4:Diabetes
B 3 3:Depression
B 3 3:Depression
C 1 1:Hypertension
C 4 4:Diabetes
C 4 4:Diabetes
… … …
我想提取或制作一个数据框,其中包含每个诊断代码的唯一行Patient_ID和分隔列,其中包含每位患者的代码发生频率,如下表所示,但我不知道如何处理和执行这个任务在R:
Patient_ID Diag1_freq Diag2_freq Diag3_freq Diag4_freq …
A 2 0 0 1 …
B 0 0 2 0 …
C 1 0 0 2 …
… … … … … …
真实数据有近6万名患者,诊断代码范围介于1至999之间;所以结果数据帧将有60 000行和999列。真实数据集中的Patient_ID是数字而不是字符串,但我使用“A”,“B”和“C”来避免混淆。我感谢任何帮助,并提前多多感谢。
答案 0 :(得分:0)
您可以使用aggregate()
或dplyr::group_by()%>%summarise()
,或者您可以使用data.table中的某些功能以及更多信息Data.table
使用dplyr的示例:
a <- group_by(dataframe, Patient_ID)
这将在唯一的patient_id级别汇总数据。
b <- summarise(a,
Diag1_freq = length(Diagnosis_Codes[Diagnosis_Codes==1]),
Diag2_freq = ...
...)
答案 1 :(得分:0)
这是一种使用诊断值创建新变量的方法,然后使用cast()
包中的reshape2
函数来转换数据。
rawData <- "Patient_ID Diagnosis_Codes Diag_Code_Description
A 1 1:Hypertension
A 1 1:Hypertension
A 4 4:Diabetes
B 3 3:Depression
B 3 3:Depression
C 1 1:Hypertension
C 4 4:Diabetes
C 4 4:Diabetes"
theData <- read.table(textConnection(rawData),header=TRUE)
library(reshape2)
theData$variable <- sprintf("diag%04d",theData$Diagnosis_Codes)
castData <- dcast(theData,Patient_ID ~ variable)
输出看起来像这样。
的问候,
莱恩