你好,我有一个包含多个患者的数据集,每个患者都有多个观察结果
我想为每位患者选择最早的观察结果。
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"。