Ich versuche, einen binären Vektor basierend auf der Schnittmenge von zwei data.frames auf mehrere Kriterien zu füllen.R schneiden data.frame auf mehreren Kriterien
Ich habe den Code funktioniert, aber ich fühle, dass es Speicher übermäßig ist, nur um den binären Vektor zu bekommen.
Wenn ich meinen Code auf meine vollständigen Daten (40mm + Zeilen) anwenden. Ich habe Probleme mit dem Gedächtnis.
Gibt es eine einfachere Möglichkeit, den Vektor zu erzeugen?
Hier einige Beispieldaten (zB wird Unter Probe nur obs enthält in voller Probe.):
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")
Hier ist mein Arbeitscode:
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
Dank im Voraus für jeden Hilfe!
sollten Sie erklären, was Sie in natürlicher Sprache wollen. (Der Code, den Sie sagen, arbeitet gerade meine Sitzung von R gesperrt, möglicherweise, weil es keine 'trimmen' Funktion gibt?) Nein, der erste' sqldf' Anruf sperrt es. –
@Dwin, ich hatte gerade das gleiche Lockup-Problem. Aber nur innerhalb der ersten 4 Zeilen des 'q_intersect' Teils. Übrigens, Brad, in deiner vorherigen Frage hast du 'data.table' benutzt und hier benutzt du' dat.frame'. Ist das Absicht? –
@RicardoSaporta Hallo. Habe die Datentabelle einfach getaggt. Sehen Sie sich die Diskussion im Chatroom gestern an, die mich korrigiert hat. Könnte einen größeren untagging Sweep machen. Die SO-Ansicht besagt, dass Tags für Fragen und nicht für Antworten stehen. Mit frischen Augen sehe ich nun und stimme zu, dass die Suche "[data.table] data.table is: question" lautet, wie "[data.table]" alleine aussehen sollte. Es scheint jedoch in Ordnung zu sein (siehe Chat), akzeptierte Antworten mit 'data.table' zu kennzeichnen, wobei auch votes> 10 sind. Um mit data.table nach Antworten zu suchen, können wir "[r] - [data.table] data.table is: answer" verwenden. –