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