2015-02-18 77 views
5

與我發現的問題不同,我想獲得兩列的唯一性,而無需排序。獨特的行,考慮兩列,在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行是 「重複」 在這個意義上,B-A是相同的B-A。

我知道如何找到第1列和第2列的獨特性,但是我會發現在這種方法下每行都是唯一的。

+0

這不是一個數據幀,而是一個矩陣;如果它是一個df,那麼'unique(df)'就可以做到這一點。先嚐試'df <-data.frame(c(「a」,「b」,「c」,「b」),c(「b」,「d」,「e」,「a」)))。 – Frank 2015-02-18 00:47:41

+2

我不這麼認爲,'unique(df)'不會檢查列以查看c('a','b')'與c('b','a' )'(爲什麼要這樣?)。稍微更多的工作... – r2evans 2015-02-18 00:52:14

回答

6

有辦法做到這一點很多的,這裏是一個:

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

一個給人的唯一行,其他的給出了面具。

+0

這種方法返回一行(第1,2,3行)的第一個唯一發生,但它不會返回定義的重複行(行1,4)/唯一行(2,3)原始的海報。 – atreju 2015-09-01 10:05:15

0

如果所有的元素都是字符串(heck,即使不是,你也可以強制它們),那麼一個技巧就是將其創建爲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 
+1

這不是很好的使用'dplyr'。如果你想走這條路線,我會建議看看'distinct'。在一個小的(100k行)數據集上,這種方法目前在我的系統上需要4秒以上,而基本的R方法需要約1.3秒,而data.table方法需要約0.03秒。 – A5C1D2H2I1M1N2O1R2T1 2015-02-18 02:28:41

+1

使用'pmin'和'pmax'是速度的來源。我的'data.table'應答的'dplyr'變體運行在〜0.05秒。作爲參考,我引用的變體看起來像這樣:data.frame(df,stringsAsFactors = FALSE)%>%mutate(key = paste0(pmin(X1,X2),pmax(X1,X2),sep = 「」))%>%distinct(key)' – A5C1D2H2I1M1N2O1R2T1 2015-02-18 02:32:03

+0

您的代碼當然令人印象深刻。我仍然在學習'dplyr'的細節,這對你來說一定是顯而易見的。 – r2evans 2015-02-18 04:39:46

5

如果只是兩列,您還可以使用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: 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 
3

你可以使用igraph來創建無向圖,然後將其轉換回數據。框架

unique(get.data.frame(graph.data.frame(df, directed=FALSE),"edges")) 
相關問題