
14 Ago
2012
14 Ago
'12
14:44
enjoy > set.seed(321) > nr <- 9e5 > nc <- 23 > t0 <- proc.time() > v <- as.data.frame(matrix(sample(1:3, nr*nc, rep=TRUE), nc=nc)) > tmp <- v[, -1] != v[,1] > x <- vector('integer', nrow(tmp)) > for (i in ncol(tmp):1) + x[tmp[,i]] <- i+1L > rm(tmp) > (t0 <- proc.time()-t0) user system elapsed 6.944 1.532 8.477 2012/8/14 Guilherme Gerhardt Mazzochini <gmazzochini@gmail.com>: > Olá pessoal, > > Eu possuo um banco de dados com com quase 900 mil linhas e 23 colunas. Segue > um exemplo simplificado abaixo: > > > set.seed(321) > v<-data.frame(rbind(sample(1:3,10,replace = T), > sample(1:3,10,replace = T), > sample(1:3,10,replace = T), > sample(1:3,10,replace = T), > rep(1,10))) > >> v > X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 > 1 3 1 2 2 3 2 1 2 3 2 > 2 1 1 2 3 2 3 3 1 1 1 > 3 1 1 2 2 2 3 2 1 3 1 > 4 2 3 3 2 3 1 3 3 2 1 > 5 1 1 1 1 1 1 1 1 1 1 > > > Para cada linha eu quero determinar qual a coluna do primeiro valor que não > é duplicado do primeiro elemento da linha (coluna 1) e salvar em um vetor o > numero da coluna do primeiro elemento não duplicado. > Assim, > >> which(v[1,]!=v[1,1])[1] > [1] 2 > > Ou seja, a segunda coluna possui o primeiro elemento diferente do elemento > na primeira coluna. > > Eu tentei fazer um loop para fazer isso para todas as linhas, mas devido ao > grande número de linhas está demorando muito tempo. > > x<-numeric(nrow(v)) > for(i in 1:nrow(v)){ > x[i]<-which(v[i,]!=v[i,1])[1] > } > >> x > [1] 2 3 3 2 NA # o valor NA é porque na quinta linha todos os valores > são iguais. > > Alguém tem idéia de como eu posso fazer isso de forma mais rápida?? > > Obrigado antecipadamente, > > Guilherme > > > _______________________________________________ > R-br mailing list > R-br@listas.c3sl.ufpr.br > https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br > Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código > mínimo reproduzível.