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