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

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)]

注:上記の 2 つの代替方法は、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 に答える