Plyr в R очень медленно при слиянии - PullRequest
3 голосов
/ 21 октября 2010

Я использую пакет plyr в R для следующих действий:

  • выбрать строку из таблицы A согласно столбцу A и столбцу B
  • найти строку из таблицы B, имеющую одинаковое значение в столбце A и столбце B
  • скопировать столбец C из таблицы B в таблицу A

Я сделал индикатор выполнения, чтобы показать прогресс, но после того, как он показывает 100%, он, кажется, все еще работает, поскольку я вижу, что мой процессор все еще занят RGUI, но он просто не заканчивается.

В моей таблице A содержится около 40000 строк данных с уникальным столбцом A и столбцом B.

Я подозреваю, что часть "комбинирования" рабочего процесса "split-conquer-объединить" в plyr не может обработать эти 40000 строк данных, потому что я могу сделать это для другой таблицы с 4000 строками данных.

Есть предложения по повышению эффективности? Спасибо.

UPDATE

Вот мой код:

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

1 Ответ

2 голосов
/ 21 октября 2010

Если я правильно понял, чего вы пытаетесь достичь, это должно делать то, что вы хотите, довольно быстро и без особых потерь памяти.

#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

Это применимо, только если комбинации уникальны.Если это не так, вам придется позаботиться об этом в первую очередь.Без данных совершенно невозможно узнать, чего вы пытаетесь достичь именно в своей полной функции, но вы должны быть в состоянии перенести приведенную здесь логику на ваш собственный случай.

...