Encontrar valores duplicados por linha em um data.frame

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

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.
participantes (2)
-
Benilton Carvalho
-
Guilherme Gerhardt Mazzochini