2015-02-18 5 views
5

मुझे मिले प्रश्नों के विपरीत, मैं आदेश के बिना दो कॉलम का अद्वितीय प्राप्त करना चाहता हूं।आर में दो कॉलम पर विचार करते हुए अद्वितीय पंक्तियां,

मैं एक 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 "डुप्लीकेट" इस अर्थ में कि बी-बी-एक के रूप में ही है।

मुझे पता है कि स्तंभ 1 और 2 के अद्वितीय कैसे खोजें, लेकिन मुझे इस दृष्टिकोण के तहत प्रत्येक पंक्ति अद्वितीय दिखाई देगी।

+0

यह डेटा.फ्रेम नहीं है बल्कि एक मैट्रिक्स है; अगर यह एक डीएफ था, 'अद्वितीय (डीएफ) 'चाल करेगा। 'Df <-data.frame (सी (" ए "," बी "," सी "," बी "), सी (" बी "," डी "," ई "," ए ") का प्रयास करें। – Frank

+2

मुझे ऐसा नहीं लगता है, 'अद्वितीय (डीएफ) 'कॉलम में जांच नहीं करता है यह देखने के लिए कि' c ('a', 'b')' प्रभावी रूप से 'c ('b', 'a') '(और यह क्यों होना चाहिए?)। थोड़ा अधिक काम ... – r2evans

उत्तर

6

बहुत के तरीके यह करने के लिए की हैं, यहाँ एक है:

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

एक अद्वितीय पंक्तियां देता है, अन्य मुखौटा देता है।

+0

यह दृष्टिकोण पंक्ति के पहले अद्वितीय अवसर (पंक्तियों 1,2,3) देता है लेकिन यह डुप्लिकेट पंक्तियों (पंक्तियों 1,4)/अद्वितीय पंक्तियों (2,3) को परिभाषित नहीं करता है जैसा कि परिभाषित किया गया है मूल पोस्टर। – atreju

0

यदि सभी तत्व तार हैं (बिल्ली, भले ही नहीं और आप उन्हें मजबूर कर सकें), तो एक चाल इसे डेटा.फ्रेम के रूप में बनाना और 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' का बहुत अच्छा उपयोग नहीं है। यदि आप इस मार्ग पर जाना चाहते हैं तो मैं 'विशिष्ट' को देखने का सुझाव दूंगा। एक छोटी (100k पंक्तियों) डेटासेट पर, यह दृष्टिकोण वर्तमान में मेरे सिस्टम पर 4 सेकंड लेता है जबकि बेस आर दृष्टिकोण ~ 1.3 सेकंड लेता है और डेटाटेबल दृष्टिकोण ~ 0.03 सेकंड लेता है। – A5C1D2H2I1M1N2O1R2T1

+1

'पमिन' और' pmax' का उपयोग करना जहां गति आती है। मेरे 'data.table' उत्तर का 'dplyr' संस्करण ~ 0.05 सेकेंड पर चलता है। संदर्भ के लिए, मैं जिस प्रकार का संदर्भ दे रहा हूं, वह इस तरह दिखता है: 'data.frame (df, stringsAsFactors = FALSE)%>% mutate (key = paste0 (pmin (X1, X2), pmax (X1, X2), sep = ""))%>% विशिष्ट (कुंजी) ' – A5C1D2H2I1M1N2O1R2T1

+0

आपका कोड निश्चित रूप से प्रभावशाली है। मैं अभी भी 'dplyr' के इंस-एंड-आउट सीख रहा हूं, जो आपको स्पष्ट दिखाना चाहिए। – r2evans

5

तो यह सिर्फ दो कॉलम है, तो आप भी 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 
3

आप कर सकते थे अप्रत्यक्ष ग्राफ बनाने के लिए igraph का उपयोग करें और फिर डेटा.फ्रेम

पर वापस कनवर्ट करें
unique(get.data.frame(graph.data.frame(df, directed=FALSE),"edges")) 
संबंधित मुद्दे