如何使用变量的最低分数创建一个患者观察的数据框子集

时间:2013-06-27 20:18:07

标签: r dataframe data-management subset

您好我有一个包含多个患者的数据集,每个患者都有多个观察结果 我想为每位患者选择最早的观察结果。

Example: 

Patient ID    Tender    Swollen    pt_visit
101             1         10          6
101             6         12          12
101             4         3           18
102             9         5           18
102             3         6           24
103             5         2           12
103             2         1           18
103             8         0           24

pt_visit变量是观察时患者在研究中的月数。我需要的是每个患者根据pt_visit列中最低月数进行的第一次观察。但是,我需要对每个患者ID进行最早的观察。

我想要的结果:

Patient ID    Tender    Swollen    pt_visit
101             1         10          6
102             9         5           18
103             5         2           12

4 个答案:

答案 0 :(得分:1)

假设您的数据框名为df,请使用ddply包中的plyr功能:

require(plyr)
firstObs <- ddply(df, "PatientID", function(x) x[x$pt_visit == min(x$pt_visit), ])

答案 1 :(得分:1)

我会使用data.table包:

Data <- data.table(Data)
setkey(Data, Patient_ID, pt_visit)
Data[,.SD[1], by=Patient_ID]

答案 2 :(得分:1)

假设Patient ID列实际上名为Patient_ID,以下是一些方法。假设DF是输入数据框的名称:

<强> sqldf

library(sqldf)

sqldf("select Patient_ID, Tender, Swollen, min(pt_visit) pt_visit 
   from DF 
   group by Patient_ID")

sqldf("select *, min(pt_visit) pt_visit from DF group by Patient_ID")[-ncol(DF)]

注意:以上两种方法使用SQLite中只有SQLite的扩展,因此请确保使用的是SQLite后端。 (SQLite是sqldf的默认后端,除非加载了RH2,RProgreSQL或RMYSQL。)

<强>子集和/ AVE

subset(DF, ave(pt_visit, Patient_ID, FUN = rank) == 1)

注意:这利用了同一pt_visit内没有重复Patient_ID值的事实。如果有,我们需要将ties=参数指定为rank

答案 3 :(得分:0)

我几乎认为它们应该是名为“by”的subset参数,它与data.table中的参数相同。这是一个基础解决方案:

do.call(rbind,  lapply( split(dfr, dfr$PatientID), 
                  function(x) x[which.min(x$pt_visit),] ) )

    PatientID Tender Swollen pt_visit
101       101      1      10        6
102       102      9       5       18
103       103      5       2       12

我想你可以看出为什么@hadley建造'plyr'。