1

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

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

4 回答 4

1

假设您的数据框被调用df,请使用包ddply中的函数plyr

require(plyr)
firstObs <- ddply(df, "PatientID", function(x) x[x$pt_visit == min(x$pt_visit), ])
于 2013-06-27T20:21:52.080 回答
1

我会使用 data.table 包:

Data <- data.table(Data)
setkey(Data, Patient_ID, pt_visit)
Data[,.SD[1], by=Patient_ID]
于 2013-06-27T20:22:26.910 回答
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 中找到的 SQL 扩展,因此请确保您使用的是 SQLite 后端。sqldf(除非加载了 RH2、RProgreSQL 或 RMYSQL ,否则SQLite 是默认后端。)

子集/平均

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

注意:这利用pt_visit了同一个Patient_ID. 如果有,我们需要将ties=参数指定给rank.

于 2013-06-28T01:23:10.090 回答
0

我几乎认为它们应该是一个subset名为“by”的参数,它的作用与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”。

于 2013-06-27T20:44:58.347 回答