3

Rでplyrパッケージを使用して、次のことを行っています。

  • 列 A と列 B に従ってテーブル A から行を取り出す
  • 列 A と列 B に同じ値を持つテーブル B の行を見つける
  • 列 C をテーブル B からテーブル A にコピーする

進行状況を表示する進行状況バーを作成しましたが、100% になった後もまだ実行されているように見えます。CPU がまだ RGUI によって占有されていることがわかりますが、終了しません。

私のテーブルAには、一意の列Aと列Bを持つ約40000行のデータがあります.

plyr の「split-conquer-combine」ワークフローの「combine」部分では、この 40000 行のデータを処理できないと思われます。これは、4000 行のデータを持つ別のテーブルに対して処理できるためです。

効率を改善するための提案はありますか?ありがとう。

アップデート

これが私のコードです:

for (loop.filename in (1:nrow(filename)))
  {print("infection source merge")
   print(filename[loop.filename, "table_name"])
   temp <- get(filename[loop.filename, "table_name"])
   temp1 <- ddply(temp,
                  c("HOSP_NO", "REF_DATE"),
                  function(df)
                    {temp.infection.source <- abcde[abcde[,"Case_Number"]==unique(df[,"HOSP_NO"]) &
                                              abcde[,"Reference_Date"]==unique(df[,"REF_DATE"]),
                                              "Case_Definition"]
                     if (length(temp.infection.source)==0) {
                         temp.infection.source<-"NIL"
                         } else {
                         if (length(unique(temp.infection.source))>1) {
                             temp.infection.source<-"MULTIPLE"
                             } else {
                            temp.infection.source<-unique(temp.infection.source)}}
                     data.frame(df,
                                INFECTION_SOURCE=temp.infection.source)
                     },
                    .progress="text")
   assign(filename[loop.filename, "table_name"], temp1)
  }
4

1 に答える 1

2

私があなたが達成しようとしていることを正しく理解していれば、これはあなたが望むことを、かなり速く、そしてあまり多くの記憶喪失なしに行うはずです。

#toy data
A <- data.frame(
    A=letters[1:10],
    B=letters[11:20],
    CC=1:10
)

ord <- sample(1:10)
B <- data.frame(
    A=letters[1:10][ord],
    B=letters[11:20][ord],
    CC=(1:10)[ord]
)
#combining values
A.comb <- paste(A$A,A$B,sep="-")
B.comb <- paste(B$A,B$B,sep="-")
#matching
A$DD <- B$CC[match(A.comb,B.comb)]
A

これは、組み合わせが一意である場合にのみ適用されます。そうでない場合は、最初にその面倒を見る必要があります。データがなければ、完全な関数で何を達成しようとしているのかを正確に知ることは不可能ですが、ここで示したロジックを自分のケースに移植できるはずです。

于 2010-10-21T10:07:32.963 に答える