2

Rを使用した入院データの質問処理に関する提案を提供してくれてありがとう。この問題について追加の質問があります。実際、それはその質問の前のタスクであるはずです。

これで、次のようなデータセットができました。

Patient_ID Date Ward
P001       1    A
P001       2    A
P001       3    A
P001       4    A
P001       4    B
P001       5    B
P001       6    B
P001       7    B
P001       7    C
P001       8    B
P001       9    B
P001       10   B

私はそれを次のように変換する必要があります:

Patient_ID Date Ward
P001       1    A
P001       2    A
P001       3    A
P001       4    A;B
P001       5    B
P001       6    B
P001       7    B;C
P001       8    B
P001       9    B
P001       10   B

現在、私はそれを使用して変換しましたddply、コードは以下に添付されています:

data <- ddply(data,
              c("Patient_ID", "Date"),
              function(df)
                {data.frame(Ward=paste(unique(df[,"Ward"]),collapse=";"))
                },
              .progress="text"
              )

unique(Patients_ID)これで問題を解決できますが、データセットに8818と1861がある場合は、非常に遅くなります(P4 3.2マシンでは20分以上)unique(Date)。どうすればそれを改善できますか?ありがとう!

4

1 に答える 1

3

データがオブジェクト内にあると仮定すると、これが機能します。pdat

res <- with(pdat,
            aggregate(Ward, by = list(Date = Date, Patient_ID = Patient_ID),
                      FUN = paste, collapse = ";"))
names(res)[3] <- "Ward"
res <- res[, c(2,1,3)]

そして与える:

> res
   Patient_ID Date Ward
1        P001    1    A
2        P001    2    A
3        P001    3    A
4        P001    4  A;B
5        P001    5    B
6        P001    6    B
7        P001    7  B;C
8        P001    8    B
9        P001    9    B
10       P001   10    B

ddply()それはより多くの患者などに喜んで拡張する必要があり、あなたのバージョンよりもかなり高速です:

> system.time(replicate(1000,{
+ res <- with(pdat,
+             aggregate(Ward, by = list(Date = Date, Patient_ID = Patient_ID),
+                       FUN = paste, collapse = ";"))
+ names(res)[3] <- "Ward"
+ res <- res[, c(2,1,3)]
+ }))
   user  system elapsed 
  2.113   0.002   2.137

vs

> system.time(replicate(1000,{
+ ddply(pdat,
+       c("Patient_ID", "Date"),
+       function(df)
+       data.frame(Ward=paste(unique(df[,"Ward"]),collapse=";"))
+       )
+ }))
   user  system elapsed 
 12.862   0.006  12.966

しかし、これはddply()スピードアップできないという意味ではありません-私はこのパッケージに精通していません。

2つのバージョンが同じようにスケーリングするかどうか(つまりaggregate()、単純なデータに対するこれらの繰り返しのテストでバージョンが速いという理由だけで、はるかに大きなタスクに適用したときに同じ利点が得られるという意味ではありません)はまだわかりませんが、データの小さなサブセットで2つのバージョンをテストし、数人以上の患者を使用して、それらがどの程度適切にスケーリングされるかを確認します。


編集: 簡単なテスト-あなたが私たちに与えた患者データを繰り返して、4人の新しい患者(合計5人を与える)を生成し、すべて同じデータで、集計1が少し良くスケーリングすることを示唆しています。バージョンの実行時間はaggregate()、1000回の繰り返しで最大4.6秒(〜2倍)になりましたが、ddply()バージョンのタイミングは最大52秒(〜4倍)になりました。

于 2010-11-12T10:14:51.370 に答える