2013-08-13 38 views
19

Tôi có một khung dữ liệu như ví dụ sauTìm bao nhiêu lần hàng lặp lại lặp lại trong khung dữ liệu R

a = c(1, 1, 1, 2, 2, 3, 4, 4) 
b = c(3.5, 3.5, 2.5, 2, 2, 1, 2.2, 7) 
df <-data.frame(a,b) 

tôi có thể loại bỏ các hàng trùng lặp từ khung R dữ liệu bằng đoạn mã sau, nhưng làm thế nào tôi có thể tìm thấy như thế nào nhiều lần mỗi hàng trùng lặp lặp lại? Tôi cần kết quả như một véc tơ.

unique(df) 

hoặc

df[!duplicated(df), ] 

Trả lời

23

Dưới đây là giải pháp sử dụng chức năng ddply() từ thư viện plyr

library(plyr) 
ddply(df,.(a,b),nrow) 

    a b V1 
1 1 2.5 1 
2 1 3.5 2 
3 2 2.0 2 
4 3 1.0 1 
5 4 2.2 1 
6 4 7.0 1 
+2

Bạn có thể tiết kiệm một vài ký tự bằng cách thay thế '' function (x) nrow (x) '' với chỉ '' nrow' '. – orizon

+0

@ chân thành cảm ơn, đã cập nhật câu trả lời của tôi. –

+0

Có thể tạo lại điều này với dplyr không? – maj

16

Bạn luôn có thể giết chết hai con chim với một đá:

aggregate(list(numdup=rep(1,nrow(df))), df, length) 
# or even: 
aggregate(numdup ~., data=transform(df,numdup=1), length) 
# or even: 
aggregate(cbind(df[0],numdup=1), df, length) 

    a b numdup 
1 3 1.0  1 
2 2 2.0  2 
3 4 2.2  1 
4 1 2.5  1 
5 1 3.5  2 
6 4 7.0  1 
+0

Bạn có thể giải thích lý do đằng sau bản sao 'tổng hợp (danh sách (numdup = rep (1, nrow (df))), df, length)' ? – DukeLover

+0

@dukelover - tổng hợp cần (các) cột được tổng kết có cùng độ dài với các biến nhóm, vì vậy tôi chỉ lặp lại 1 để có được điều này. – thelatemail

+0

cảm ơn rất nhiều câu trả lời của bạn. Bạn có thể giải thích mã này 'tổng hợp (numdup ~., Dữ liệu = chuyển đổi (df, numdup = 1), chiều dài) '? - Đây là ý nghĩa của 'numdup ~'? – DukeLover

12

Dưới đây là hai cách tiếp cận.

# a example data set that is not sorted 
DF <-data.frame(replicate(sequence(1:3),n=2)) 

# example using similar idea to duplicated.data.frame 
count.duplicates <- function(DF){ 
x <- do.call('paste', c(DF, sep = '\r')) 
    ox <- order(x) 
    rl <- rle(x[ox]) 
    cbind(DF[ox[cumsum(rl$lengths)],,drop=FALSE],count = rl$lengths) 

} 
count.duplicates(DF) 
# X1 X2 count 
# 4 1 1  3 
# 5 2 2  2 
# 6 3 3  1 


# a far simpler `data.table` approach 
library(data.table) 
count.dups <- function(DF){ 

    DT <- data.table(DF) 
    DT[,.N, by = names(DT)] 
} 
count.dups(DF) 
# X1 X2 N 
# 1: 1 1 3 
# 2: 2 2 2 
# 3: 3 3 1 
6

Sử dụng dplyr:

summarise(group_by(df,a,b),length(b)) 

hoặc

group_size(group_by(df,a,b)) 
#[1] 1 2 2 1 1 1 
+1

đừng quên về đường ống! df%>% group_by (a, b)%>% group_size() –

Các vấn đề liên quan