Remover valores duplicados em um conjunto de dados

17 views
Skip to first unread message

Luciano F. Sgarbi

unread,
Apr 29, 2015, 5:47:47 PM4/29/15
to r-...@listas.c3sl.ufpr.br, r-eco...@googlegroups.com
Prezados,
Tenho um conjunto de dados no seguinte formato:

df<-data.frame(destino=c('A','A','B','B','C','C'),
               origem=c('B','C','A','C','A','B'),
               dist=c(1,2,1,3,2,3))

Deste, a primeira coluna é um local a segunda também e a terceira é a distância entre estes dois locais.
Assim, é bastante intuitivo que a distância de A para B é a mesma que de B para A e portanto uma destas comparações pode ser eliminada.

Pergunta: 
Como que eu faço para remover as 'comparações duplicadas' do conjunto original (acima) de modo que ele fique igual ao conjunto abaixo???

rs<-data.frame(destino=c('A','A','B'),
               origem=c('B','C','C'),
               dist=c(1,2,3))

Abraços,
Luciano

--
Luciano F. Sgarbi
Laboratório de Ecologia Teórica e Síntese
Departamento de Ecologia, Instituto de Ciências Biológicas V.
Universidade Federal de Goiás, campus II, Goiânia-GO, Brasil

Nicholas Marino

unread,
Apr 29, 2015, 5:52:44 PM4/29/15
to r-eco...@googlegroups.com, r-...@listas.c3sl.ufpr.br
Essas distâncias vem de uma matriz de distância?

Luciano F. Sgarbi

unread,
Apr 29, 2015, 6:02:59 PM4/29/15
to r-eco...@googlegroups.com
​Pior que não!
:)​

Em 29 de abril de 2015 18:52, Nicholas Marino <nac.m...@gmail.com> escreveu:
Essas distâncias vem de uma matriz de distância?

--
Envie um código mínimo reproduzível.
Envie ou responda perguntas no e-mail (r-eco...@googlegroups.com)
---
Você recebeu essa mensagem porque está inscrito no grupo "R-Ecology" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para r-ecologia+...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/r-ecologia.
Para mais opções, acesse https://groups.google.com/d/optout.

Leonardo Bergamini

unread,
Apr 29, 2015, 6:04:33 PM4/29/15
to r-eco...@googlegroups.com
To sem o R aqui agora, mas você pode tentar aplicar um order pra cada linha de c(origem, destino), assim os pares que envolvem os mesmos pontos vao ficar sempre na mesma ordem.

Algo mais ou menos assim:

unique(data.frame(apply(df[,c("origem","destino")],1,order),df[,"distancia])

Em 29 de abril de 2015 18:52, Nicholas Marino <nac.m...@gmail.com> escreveu:
Essas distâncias vem de uma matriz de distância?

--

Augusto Ribas

unread,
Apr 29, 2015, 6:18:01 PM4/29/15
to r-eco...@googlegroups.com
Talvez não a solução mais bela e otima, mas funciona.

Basicamente, você nao quer repetir arestas em um grafo.

df<-data.frame(destino=c('A','A','B','B','C','C'),
               origem=c('B','C','A','C','A','B'),
               dist=c(1,2,1,3,2,3),stringsAsFactors=F)


Então da para criar um vetor de visitados, e a seleção, que são as linhas que vc vai selecionar, que não repetem arestas.

visitado<-vector()
selecao<-vector()

E mais dois contadores, para ir adicionando coisas aos vetores

elementos<-1
contador<-1


Dai você pega, e pergunta linha por linha, se essa aresta, esse caminho de um lugar para o outro existe, se não existir, você seleciona a linha, mas adiciona a  vetor visitado, que é das arestas que você ja visitou, a ida e a volta.
Dai quando testar se ja passou pela volta, ele vai ta escrito no vetor visitados e você nao vai mais selecionar ele.
Faltou colocar tudo isso numa função, mas nao como vai estar a estrutura dos seus dados de verdade, então dificilmente faria algo util

for( i in 1:nrow(df)){
          if(!(paste(df[i,1] ,df[i,2]) %in% visitado)){
              selecao[elementos]<-i
              elementos<-elementos+1
              visitado[c(contador,contador+1)]<-c(paste(df[i,1] ,df[i,2]),paste(df[i,2] ,df[i,1]))
              contador<-contador+2

          }
      }
df[selecao,]

Deve haver alguma função que faz isso, mas assim ja quebra o galho.
--
Grato
Augusto C. A. Ribas
 

Luciano F. Sgarbi

unread,
Apr 30, 2015, 11:19:45 AM4/30/15
to r-eco...@googlegroups.com
​Oi gente.

Olá pessoal.
Valeu pelas dicas.
A solução que eu cheguei foi a seguinte:
rs<-df[!duplicated(t(apply(df[,c("origem","destino")],1,sort))),]
Abraços
Reply all
Reply to author
Forward
0 new messages