Уникальные строки, с учетом двух столбцов, в R, без порядка

В отличие от вопросов, которые я нашел, я хочу получить уникальный из двух столбцов без заказа.

У меня есть дф:

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" 

В этом случае строка 1 и строка 4 являются "дубликатами" в том смысле, что ba совпадает с ba.

Я знаю, как найти уникальные столбцы 1 и 2, но в этом подходе я нашел бы каждую строку уникальной.

4 ответа

Решение

Есть много способов сделать это, вот один:

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

Один дает уникальные строки, другой дает маску.

Если это только две колонки, вы также можете использовать pmin а также pmax, как это:

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

Аналогичный подход с использованием "dplyr" может быть:

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

Вы могли бы использовать igraph создать неориентированный граф, а затем преобразовать обратно в data.frame

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

Если все элементы являются строками (черт возьми, даже если нет, и вы можете привести их), то одна хитрость заключается в том, чтобы создать его как data.frame и использовать некоторые из dplyrТрюки на нем.

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

$key Колонка теперь должна сказать вам повторы.

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
Другие вопросы по тегам