2011-10-17 24 views
30

I R, aşağıdaki veri çerçevesi vardır:benzersiz() birden çok değişken

Mahsus listelemek istediğiniz
> 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 ... 

seçilen birden fazla değişken değerleri (SQL kendine özgü olduğu gibi). Örneğin, unique(yad) bana her 42 elemanların isimlerini verir, ama ben (tüm benzersiz kombinasyonları ile birlikte yad ve per) iki sütun ayıklamak gerekir:

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

Bunu nasıl başarabiliriz?

cevap

75

unique()'u kullanma hakkında ne düşünüyorsunuz?

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 Ayrıca dizeleri normalleştirmek (tokmağı, gsub özel karakterleri, vb) öneririz. –

+0

Eğer df bir matris ise nasıl yapılır? Bunu 'data.frame''e dönüştüreyim mi yoksa bunu yapmak için bir işlev var mı? – sop

+2

Aslında bu işi yapan unique.matrix() 'yi buldum, zaten – sop

5

Bir dizi faktörün tüm benzersiz kombinasyonlarını elde etmenin birkaç yolu vardır.

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

Bu, Josh'un cevabına eklenir.

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 

Uyarı: data.table

Örnek yinelenen satırları filtre uygularken

Ayrıca diğer değişkenlerin değerlerini tutabilir diğer değişkenlerle değerlerin farklı kombinasyonlar varsa, o zaman Sonucunuz V1 ve V2

ait

eşsiz kombinasyonu olacak

+0

garip teşekkürler, benzersiz işlem çalışır, ancak sonuç dt NA için ayarlanmış tüm diğer sütunlara sahiptir. Neden biliyor musun? –

+0

Bunu tespit ettiğiniz için teşekkür ederiz. Bu işlem bir birleştirme yapar ve bu nedenle bazı "NA" değerlerini üretebilir. Çözüm, 'allow.cartesian = TRUE' yerine' nomatch = 0' yerine, sonuçlarda NA' değerlerini dikkate almazdı. Cevabı güncelledim. Teşekkürler –

-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

Bu sadece size farklı değerleri vermez - orijinal data.frame üzerine yazılır. OP'nin ne istediği değil. – BenBarnes

+0

Eğer üzerine yazmak istemiyorsanız, o zaman basit bir ahbap. Sadece 3. satır 1. d.DF yerine df2 koydu. – ashok

İlgili konular