r unique plyr dplyr

Filas únicas, considerando dos columnas, en R, sin orden



unique plyr (4)

Hay muchas maneras de hacer esto, aquí hay una:

unique(t(apply(df, 1, sort))) duplicated(t(apply(df, 1, sort)))

Uno da las filas únicas, el otro da la máscara.

A diferencia de las preguntas que he encontrado, quiero obtener el único de dos columnas sin orden.

Tengo un df:

df<-cbind(c("a","b","c","b"),c("b","d","e","a")) > df [,1] [,2] [1,] "a" "b" [2,] "b" "d" [3,] "c" "e" [4,] "b" "a"

En este caso, la fila 1 y la fila 4 son "duplicados" en el sentido de que ba es lo mismo que ba.

Sé cómo encontrar únicos en las columnas 1 y 2, pero encontraría cada fila única bajo este enfoque.


Puede usar igraph para crear un gráfico no dirigido y luego volver a convertirlo en un marco de datos.

unique(get.data.frame(graph.data.frame(df, directed=FALSE),"edges"))


Si solo son dos columnas, también puede usar pmin y pmax , de esta manera:

library(data.table) unique(as.data.table(df)[, c("V1", "V2") := list(pmin(V1, V2), pmax(V1, V2))], by = c("V1", "V2")) # V1 V2 # 1: a b # 2: b d # 3: c e

Un enfoque similar con "dplyr" podría ser:

library(dplyr) data.frame(df, stringsAsFactors = FALSE) %>% mutate(key = paste0(pmin(X1, X2), pmax(X1, X2), sep = "")) %>% distinct(key) # X1 X2 key # 1 a b ab # 2 b d bd # 3 c e ce


Si todos los elementos son cadenas (diablos, incluso si no es así y puede forzarlos), entonces un truco es crearlo como un marco de datos y usar algunos de los trucos de dplyr en él.

library(dplyr) df <- data.frame(v1 = c("a","b","c","b"), v2 = c("b","d","e","a")) df$key <- apply(df, 1, function(s) paste0(sort(s), collapse='''')) head(df) ## v1 v2 key ## 1 a b ab ## 2 b d bd ## 3 c e ce ## 4 b a ab

La columna $key ahora debería decirle las repeticiones.

df %>% group_by(key) %>% do(head(., n = 1)) ## Source: local data frame [3 x 3] ## Groups: key ## v1 v2 key ## 1 a b ab ## 2 b d bd ## 3 c e ce