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.