Próbuję wypełnić wektor binarny na podstawie przecięcia dwóch data.frames na wielu kryteriach.R przecinają dane.frame na wielu kryteriach
Mam kod działa, ale czuję, że jest to nadmierna pamięć tylko po to, aby uzyskać wektor binarny.
Po zastosowaniu kodu do pełnych danych (40 mm + wiersze). Zaczynam mieć problemy z pamięcią.
Czy istnieje prostszy sposób na uzyskanie wektora?
Oto kilka przykładowych danych (np sub próbka będzie zawierać tylko OB w pełnej próbie.):
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")
Oto mój kod roboczych:
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
Dzięki wyprzedzeniem dla każdego Wsparcie!
Należy wyjaśnić, co chcesz w języku naturalnym. (Kod, o którym mówisz, działa właśnie zablokował moją sesję R, prawdopodobnie dlatego, że nie ma funkcji "trim"?) Nie, pierwsze wywołanie 'sqldf' blokuje ją. –
@Dwin, właśnie miałem ten sam problem z blokowaniem. Ale tylko w pierwszych 4 liniach fragmentu 'q_intersect'. Nawiasem mówiąc, Brad, w poprzednim pytaniu używasz 'data.table' i tutaj używasz' data.frame'. Czy to jest celowe? –
@RicardoSaporta Cześć. Właśnie odznaczone data.table. Zobacz wczoraj dyskusję na czacie, która mnie poprawiła. Może zrobić większy untagging sweep. Widok SO jest taki, że tagi są dla pytań, a nie odpowiedzi. Ze świeżymi oczami widzę i zgadzam się, że wyszukiwanie "[data.table] data.table to: pytanie" jest tym, co powinno wyglądać samo "[data.table]". Jednak wydaje się być ok (patrz czat), aby oznaczyć zaakceptowane odpowiedzi za pomocą 'data.table' gdzie również> 10 głosów. Aby wyszukać odpowiedzi za pomocą data.table, możemy użyć "[r] - [data.table] data.table is: answer". –