Sto tentando di popolare un vettore binario basato sull'intersezione di due data.frames su più criteri.R intersect data.frame su più criteri
Ho il codice in funzione ma ritengo che la memoria sia eccessiva solo per ottenere il vettore binario.
Quando applico il mio codice ai miei dati completi (40mm + righe). Comincio ad avere problemi di memoria.
C'è un modo più semplice per produrre il vettore?
Ecco alcuni dati di esempio (ad esempio, campione sub include solo oss nel campione completo.):
ob1_1 <- as.data.frame(cbind(c(1999),c("111","222","666","777")),stringsAsFactors=FALSE)
ob2_1 <- as.data.frame(cbind(c(2000),c("111","333","555","777")),stringsAsFactors=FALSE)
ob3_1 <- as.data.frame(cbind(c(2001),c("111","222","333","777")),stringsAsFactors=FALSE)
ob4_1 <- as.data.frame(cbind(c(2002),c("111","444","555","777")),stringsAsFactors=FALSE)
full_sample <- rbind(ob1_1,ob2_1,ob3_1,ob4_1)
colnames(full_sample) <- c("yr","ID")
ob1_2 <- as.data.frame(cbind(c(1999),c("111","222","777")),stringsAsFactors=FALSE)
ob2_2 <- as.data.frame(cbind(c(2000),c("333")),stringsAsFactors=FALSE)
ob3_2 <- as.data.frame(cbind(c(2001),c("888")),stringsAsFactors=FALSE)
ob4_2 <- as.data.frame(cbind(c(2002),c("111","444","555","777")),stringsAsFactors=FALSE)
sub_sample <- rbind(ob1_2,ob2_2,ob3_2,ob4_2)
colnames(sub_sample) <- c("yr","ID")
Ecco il mio codice di lavoro:
q_intersect <- ""
q_intersect <- paste(q_intersect , "select a.yr, a.ID ", sep=" ")
q_intersect <- paste(q_intersect , "from full_sample a ", sep=" ")
q_intersect <- paste(q_intersect , "intersect ", sep=" ")
q_intersect <- paste(q_intersect , "select b.yr, b.ID ", sep=" ")
q_intersect <- paste(q_intersect , "from sub_sample b ", sep=" ")
q_intersect <- trim(gsub(" {2,}", " ", q_intersect))
intersect_temp <- cbind(sqldf(q_intersect),1)
colnames(intersect_temp) <- c("yr","ID","in_both")
q_expand <- ""
q_expand <- paste(q_expand , "select in_both ", sep=" ")
q_expand <- paste(q_expand , "from full_sample a ", sep=" ")
q_expand <- paste(q_expand , "left join intersect_temp b ", sep=" ")
q_expand <- paste(q_expand , "on a.yr=b.yr ", sep=" ")
q_expand <- paste(q_expand , "and a.ID=b.ID ", sep=" ")
q_expand <- trim(gsub(" {2,}", " ", q_expand))
solution <- as.integer(sqldf(q_expand)[,1])
solution [is.na(solution)] <- 0
Grazie in anticipo per qualsiasi Aiuto!
Si dovrebbe spiegare che cosa si vuole in linguaggio naturale. (Il codice che dici sta funzionando ha semplicemente bloccato la mia sessione di R, probabilmente perché non c'è alcuna funzione 'trim'?) No, la prima chiamata' sqldf' la blocca. –
@Dwin, ho appena avuto lo stesso problema di blocco. Ma solo entro le prime 4 righe della parte 'q_intersect'. Per inciso, Brad, nella tua domanda precedente stavi usando 'data.table' e qui stai usando' data.frame'. È deliberato? –
@RicardoSaporta Salve. Hanno appena taggato data.table. Vedi la discussione nella chatroom di ieri che mi ha corretto. Potrebbe fare uno sweep di disinserimento maggiore. La vista SO è che i tag sono per domande e non risposte. Con occhi nuovi, ora vedo e concordo che la ricerca "[data.table] data.table è: domanda" è come dovrebbe apparire "[data.table]" da solo. Comunque sembra ok (vedi chat) per taggare le risposte accettate usando 'data.table' dove voti> 10 pure. Per cercare le risposte usando data.table possiamo usare "[r] - [data.table] data.table is: answer". –