r-如何创建变量得分最低的一个患者观察的数据帧子集



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

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

假设您的数据帧名为df,请使用plyr包中的ddply函数:

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

我会使用data.table包:

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

假设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中找到的SQL扩展,因此请确保您使用的是SQLite后端。(除非加载了RH2、RProgreSQL或RMYSQL,否则SQLite是sqldf的默认后端。)

子集/ave

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

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

我几乎认为它们应该是一个名为"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"。

相关内容

最新更新