独特的行,考虑两列,在R,没有秩序

不像我发现的问题,我想获得没有秩序的两列独特。

我有一个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" 

在这种情况下,第1行和第4行是“重复”,意思是ba和ba一样。

我知道如何find第1列和第2列的独特之处,但是我会发现在这种方法下每一行都是唯一的。

有很多方法可以做到这一点,这里是一个:

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

一个给出独特的行,另一个给出掩码。

如果只有两列,你也可以使用pminpmax ,如下所示:

 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: ab # 2: bd # 3: ce 

使用“dplyr”的类似方法可能是:

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

您可以使用igraph创build一个无向图,然后转换回data.frame

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

如果所有的元素都是string(即使不是,你也可以强制它们),那么一个技巧就是将其创build为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 ab ab ## 2 bd bd ## 3 ce ce ## 4 ba ab 

$key列现在应该告诉你重复。

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