Domanda

Sto usando il pacchetto plyr in R per effettuare le seguenti operazioni:

  • raccogliere una riga dalla tabella A secondo la colonna A e la colonna B
  • individua la riga dalla tabella B avente lo stesso valore nella colonna A e nella colonna B
  • copiare la colonna C dalla tabella B alla tabella A

Ho fatto la barra di avanzamento per mostrare lo stato di avanzamento, ma dopo si vede al 100% sembra essere ancora in esecuzione, come ho già vedere il mio CPU è ancora occupato da RGUI, ma semplicemente non finisce.

La mia tabella A sta avendo circa 40000 righe di dati con colonna unica A e B della colonna.

Ho il sospetto che il "combinano" parte del "split-conquista-unire" flusso di lavoro in plyr non può gestire questo 40000 righe di dati, perché non posso farlo per un altro tavolo con 4000 righe di dati.

Qualche suggerimento per migliorare l'efficienza? Grazie.

UPDATE

Ecco il mio codice:

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)
  }
È stato utile?

Soluzione

Se ho capito bene quello che stai cercando di raggiungere, questo dovrebbe fare quello che vuoi, piuttosto veloce, e senza perdita di memoria troppo.

#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

Questo vale solo se le combinazioni sono unici. Se non lo sono, si dovrà prendere cura di quella prima. Senza i dati è abbastanza impossibile sapere cosa si sta cercando di ottenere esattamente nella vostra funzione completa, ma si dovrebbe essere in grado di porto la logica qui dato al vostro caso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top