[R-br] Encontrar valores duplicados por linha em um data.frame

Benilton Carvalho beniltoncarvalho em gmail.com
Terça Agosto 14 11:44:43 BRT 2012


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 em 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 em 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.


Mais detalhes sobre a lista de discussão R-br