2011-10-17 21 views
30

के लिए मैं आर में निम्न डेटा फ्रेम:अद्वितीय() एक से अधिक चर

> str(df) 
'data.frame': 545227 obs. of 15 variables: 
$ ykod : int 93 93 93 93 93 93 93 93 93 93 ... 
$ yad : Factor w/ 42 levels "BAKUGAN","BARBIE",..: 30 30 30 30 30 30 30 30 30 30 ... 
$ per : Factor w/ 3 levels "2 AYLIK","3 AYLIK",..: 3 3 3 3 3 3 3 3 3 3 ... 
$ donem: int 201101 201101 201101 201101 201101 201101 201101 201101 201101 201101 ... 
$ sayi : int 201101 201101 201101 201101 201101 201101 201101 201101 201101 201101 ... 
$ mkod : int 4 5 9 11 12 18 20 22 25 26 ... 
$ mad : Factor w/ 10464 levels " Defne Market   ",..: 405 8075 9710 10145 9297 7973 2542 3892 2759 5769 ... 
$ mtip : Factor w/ 29 levels "Abone Bürosu          ",..: 2 20 20 2 2 2 2 2 2 2 ... 
$ kanal: Factor w/ 2 levels "OB","SS": 2 2 2 2 2 2 2 2 2 2 ... 
$ bkod : int 110565 110565 110565 110565 110565 110565 110565 110565 110565 110565 ... 
$ bad : Factor w/ 212 levels "4. Levent","500 Evler",..: 167 167 167 167 167 167 167 167 167 167 ... 
$ bolge: Factor w/ 12 levels "Adana Şehiriçi",..: 7 7 7 7 7 7 7 7 7 7 ... 
$ sevk : int 2 3 3 3 2 2 2 6 2 2 ... 
$ iade : int 2 1 0 2 0 2 1 0 0 2 ... 
$ satis: int 0 2 3 1 2 0 1 6 2 0 ... 

मैं अद्वितीय सूचीबद्ध करना चाहते हैं का चयन किया कई वैरिएबल के मान (एसक्यूएल के DISTINCT की तरह)। उदाहरण के लिए, unique(yad) मुझे प्रत्येक 42 तत्वों के नाम देता है, लेकिन मैं दो स्तंभों को निकालने के लिए (yad और per एक साथ, सभी अद्वितीय संयोजन के साथ) की जरूरत है:

yad   per 
---   --- 
BARBIE  AYLIK 
BAKUGAN  2 AYLIK 
MICKEY MOUSE 2 AYLIK 
TINKERBELL 3 AYLIK 
...   ... 

मैं यह कैसे प्राप्त कर सकते हैं?

उत्तर

75

unique() का उपयोग करने के बारे में कैसे?

df <- data.frame(yad = c("BARBIE", "BARBIE", "BAKUGAN", "BAKUGAN"), 
       per = c("AYLIK", "AYLIK", "2 AYLIK", "2 AYLIK"), 
       hmm = 1:4) 

df 
#  yad  per hmm 
# 1 BARBIE AYLIK 1 
# 2 BARBIE AYLIK 2 
# 3 BAKUGAN 2 AYLIK 3 
# 4 BAKUGAN 2 AYLIK 4 

unique(df[c("yad", "per")]) 
#  yad  per 
# 1 BARBIE AYLIK 
# 3 BAKUGAN 2 AYLIK 
+1

+ 1 तारों को सामान्यीकृत करने की भी सिफारिश करेगा (विशेष रूप से, विशेष पात्रों को बाहर निकालना, आदि)। –

+0

अगर डीएफ' एक मैट्रिक्स है तो इसे कैसे करें? क्या मैं इसे 'data.frame' में बदल दूंगा, या ऐसा करने के लिए कोई फ़ंक्शन है? – sop

+2

असल में मुझे 'अद्वितीय.मैट्रिक्स()' मिला है जिसने काम किया है, वैसे भी – sop

5

कारकों के एक सेट के सभी अद्वितीय संयोजन प्राप्त करने के कुछ तरीके हैं।

with(df, interaction(yad, per, drop=TRUE)) # gives labels 
with(df, yad:per)       # ditto 

aggregate(numeric(nrow(df)), df[c("yad", "per")], length) # gives a data frame 
7

यह जोश के उत्तर के अतिरिक्त है।

library(data.table) 

#create data table 
dt <- data.table(
    V1=LETTERS[c(1,1,1,1,2,3,3,5,7,1)], 
    V2=LETTERS[c(2,3,4,2,1,4,4,6,7,2)], 
    V3=c(1), 
    V4=c(2)) 

> dt 
# V1 V2 V3 V4 
# A B 1 2 
# A C 1 2 
# A D 1 2 
# A B 1 2 
# B A 1 2 
# C D 1 2 
# C D 1 2 
# E F 1 2 
# G G 1 2 
# A B 1 2 

# set the key to all columns 
setkey(dt) 

# Get Unique lines in the data table 
unique(dt[list(V1, V2), nomatch = 0]) 

# V1 V2 V3 V4 
# A B 1 2 
# A C 1 2 
# A D 1 2 
# B A 1 2 
# C D 1 2 
# E F 1 2 
# G G 1 2 

चेतावनी:

तुम भी अन्य चरों के मान जबकि data.table

उदाहरण डुप्लिकेट पंक्तियों को छान रख सकते अन्य चर में मूल्यों के विभिन्न संयोजनों देखते हैं, तो अपने परिणाम V1 और V2

की

अद्वितीय संयोजन किया जाएगा

+0

अजीब, अद्वितीय ऑपरेशन काम करता है लेकिन परिणाम डीटी में अन्य सभी कॉलम एनए पर सेट हैं। तुम जानते हो क्यों? –

+0

इसे ढूंढने के लिए धन्यवाद। यह ऑपरेशन विलय करता है और इसलिए यह कुछ 'NA' मान उत्पन्न कर सकता है। समाधान 'allow.cartesian = TRUE' को 'nomatch = 0' के साथ प्रतिस्थापित करना होगा, जो परिणामों में' NA' मानों को अनदेखा करेगा। मैंने जवाब अपडेट कर लिया है। धन्यवाद –

-1
df$new_var = paste(df$yad,df$per,sep = "_") 
length(unique(df$new_var)) #for checking 
df = df[!duplicated(df$new_var),] 
nrow(df) # for checking , this should be equal to 2nd line output 
df$new_var = NULL 
+0

यह आपको केवल विशिष्ट मान नहीं देता है - यह मूल डेटा.फ्रेम को ओवरराइट करता है। ओपी क्या पूछ रहा है नहीं। – BenBarnes

+0

यदि आप इसे ओवरराइट नहीं करना चाहते हैं, तो यह साधारण दोस्त है। सिर्फ तीसरी पंक्ति में डीएफ के बजाय डीएफ 2 डालें। पहले – ashok

संबंधित मुद्दे