2011-10-17 4 views
30

Tôi có khung dữ liệu sau trong R:độc đáo() trong hơn một biến

> 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 ... 

Tôi muốn liệt kê độc đáo (như DISTINCT SQL của) các giá trị cho nhiều biến được chọn. Ví dụ, unique(yad) mang lại cho tôi tên của mỗi 42 yếu tố, nhưng tôi cần phải giải nén hai cột (yadper với nhau, với tất cả sự kết hợp độc đáo):

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

Làm thế nào tôi có thể đạt được điều này?

Trả lời

75

Cách tự sử dụng 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 Cũng khuyên bạn nên chuẩn hóa chuỗi (cho phép, gsub ra các ký tự đặc biệt, vv). –

+0

Làm thế nào để làm điều đó nếu 'df' là ma trận? Tôi sẽ biến nó thành 'data.frame', hay có chức năng để làm điều đó? – sop

+2

Trên thực tế tôi đã tìm thấy 'unique.matrix()' đã thực hiện công việc, nhờ anyway – sop

5

Có một vài cách để có được tất cả các kết hợp độc đáo của tập hợp các yếu tố.

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

Đây là một bổ sung cho câu trả lời của Josh.

Bạn cũng có thể giữ các giá trị của các biến khác trong khi lọc ra các hàng trùng lặp trong data.table

Ví dụ:

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 

Alert: Nếu có kết hợp khác nhau của các giá trị trong các biến khác, sau đó kết quả của bạn sẽ được kết hợp

độc đáo của V1 và V2

+0

lạ, hoạt động độc đáo hoạt động nhưng kết quả dt có tất cả các cột khác được đặt thành NA. Bạn có biết tại sao? –

+0

Cảm ơn bạn đã phát hiện ra điều đó. Thao tác này làm cho hợp nhất và do đó nó có thể tạo ra một số giá trị 'NA'. Giải pháp sẽ thay thế 'allow.cartesian = TRUE' bằng' nomatch = 0', điều sẽ bỏ qua các giá trị 'NA' trong kết quả. Tôi đã cập nhật câu trả lời. Cảm ơn –

-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

Điều này không chỉ cung cấp cho bạn các giá trị khác biệt - nó ghi đè lên tệp dữ liệu gốc. Không phải những gì OP yêu cầu. – BenBarnes

+0

Nếu bạn không muốn ghi đè lên nó, thì đó là dude đơn giản. Chỉ cần đặt df2 thay vì df trong dòng thứ nhất thứ nhất.DONE – ashok