2012-12-20 92 views
82

Tôi đã đọc tệp CSV vào một tệp dữ liệu R. Một số hàng có cùng một phần tử trong một trong các cột. Tôi muốn xóa các hàng trùng lặp trong cột đó. Ví dụ:Xóa các hàng trùng lặp

platform_external_dbus   202   16      google  1 
platform_external_dbus   202   16   space-ghost.verbum  1 
platform_external_dbus   202   16     localhost  1 
platform_external_dbus   202   16   users.sourceforge  8 
platform_external_dbus   202   16     hughsie  1 

Tôi chỉ muốn một trong các hàng này vì các hàng khác có cùng dữ liệu trong cột đầu tiên.

+2

mà một trong những bạn muốn? chỉ là người đầu tiên? nói cách khác: bạn có muốn giữ 'google' hoặc' localhost' hoặc 'hughsie' không? –

+0

Nó không quan trọng đối với phần này của phân tích thống kê của tôi. Tôi chỉ cố gắng liên kết tiêu đề dự án (cột đầu tiên), số lỗi (cột thứ hai) và số lượng tổ chức trên dự án (cột thứ ba). – user1897691

+3

tuyệt. ném các cột không cần thiết ra và sử dụng? độc đáo –

Trả lời

114

chỉ cô lập khung dữ liệu của bạn vào các cột mà bạn cần, sau đó sử dụng chức năng độc đáo: D

# in the above example, you only need the first three columns 
deduped.data <- unique(yourdata[ , 1:3 ]) 
# the fourth column no longer 'distinguishes' them, 
# so they're duplicates and thrown out. 
+0

Điều này có vẻ như nó sẽ hoạt động hoàn hảo. Bạn có thể giải thích cho tôi điều gì đang xảy ra với phần '[, 1: 3]' của đoạn mã đó không? Tôi mới đến R đó là lý do tại sao tôi hỏi những gì tôi chỉ có thể giả định là một câu hỏi rõ ràng. – user1897691

+6

@ user1897691 đánh dấu nó là chính xác sau đó;) [xem này] (http://www.screenr.com/fCs8) và nếu bạn thích điều đó, hãy kiểm tra [twotorials.com] (http://twotorials.com) –

110

Đối với những người đã đến đây để tìm kiếm một câu trả lời chung cho việc loại bỏ hàng trùng lặp, sử dụng !duplicated():

a <- c(rep("A", 3), rep("B", 3), rep("C",2)) 
b <- c(1,1,2,4,1,1,2,2) 
df <-data.frame(a,b) 

duplicated(df) 
[1] FALSE TRUE FALSE FALSE FALSE TRUE FALSE TRUE 

> df[duplicated(df), ] 
    a b 
2 A 1 
6 B 1 
8 C 2 

> df[!duplicated(df), ] 
    a b 
1 A 1 
3 A 2 
4 B 4 
5 B 1 
7 C 2 

trả lời từ: Removing duplicated rows from R data frame

+0

I muốn tạo một varibale mới mà cờ nếu có một bản sao * trên một biến nhất định * gần giống như df $ trùng lặp <- ifelse (giá trị hàng này trong cột a == giá trị hàng trước đó trong cột a, 1, 0) – jacob

+0

@ jacob xem câu hỏi này http://stackoverflow.com/questions/12495345/find-indices-of-duplicated-rows –

+1

Điều này giữ giá trị xuất hiện đầu tiên và loại bỏ phần còn lại của các bản sao, phải không? Hoặc nó loại bỏ các giá trị ngẫu nhiên? – alphabetagamma

37

chức năng distinct() trong dplyr packa ge thực hiện loại bỏ trùng lặp tùy ý, cho phép đặc tả của các biến trùng lặp (như trong câu hỏi này) hoặc xem xét tất cả các biến.

dữ liệu:

dat <- data.frame(a = rep(c(1,2),4), b = rep(LETTERS[1:4],2)) 

Di chuyển hàng nơi cột quy định được nhân đôi:

library(dplyr) 
dat %>% distinct(a, .keep_all = TRUE) 

    a b 
1 1 A 
2 2 B 

Di hàng là bản sao hoàn chỉnh của các hàng khác:

dat %>% distinct 

    a b 
1 1 A 
2 2 B 
3 1 C 
4 2 D 
5

Với sqldf:

# Example by Mehdi Nellen 
a <- c(rep("A", 3), rep("B", 3), rep("C",2)) 
b <- c(1,1,2,4,1,1,2,2) 
df <-data.frame(a,b) 

Giải pháp:

library(sqldf) 
    sqldf('SELECT DISTINCT * FROM df') 

Output:

a b 
1 A 1 
2 A 2 
3 B 4 
4 B 1 
5 C 2 
21

Gói data.table cũng có uniqueduplicated phương pháp riêng của nó với một số tính năng bổ sung.

Cả unique.data.tableduplicated.data.table phương pháp có một by đối số bổ sung cho phép bạn vượt qua một character hoặc integer vector của tên cột hoặc vị trí của họ tương ứng

library(data.table) 
DT <- data.table(id = c(1,1,1,2,2,2), 
       val = c(10,20,30,10,20,30)) 

unique(DT, by = "id") 
# id val 
# 1: 1 10 
# 2: 2 10 

duplicated(DT, by = "id") 
# [1] FALSE TRUE TRUE FALSE TRUE TRUE 

Một tính năng quan trọng của các phương pháp này là một buổi biểu diễn lớn thu được cho các tập dữ liệu lớn hơn

library(microbenchmark) 
library(data.table) 
set.seed(123) 
DF <- as.data.frame(matrix(sample(1e8, 1e5, replace = TRUE), ncol = 10)) 
DT <- copy(DF) 
setDT(DT) 

microbenchmark(unique(DF), unique(DT)) 
# Unit: microseconds 
#  expr  min   lq  mean median  uq  max neval cld 
# unique(DF) 44708.230 48981.8445 53062.536 51573.276 52844.591 107032.18 100 b 
# unique(DT) 746.855 776.6145 2201.657 864.932 919.489 55986.88 100 a 


microbenchmark(duplicated(DF), duplicated(DT)) 
# Unit: microseconds 
#   expr  min   lq  mean  median  uq  max neval cld 
# duplicated(DF) 43786.662 44418.8005 46684.0602 44925.0230 46802.398 109550.170 100 b 
# duplicated(DT) 551.982 558.2215 851.0246 639.9795 663.658 5805.243 100 a 
2

Hoặc bạn có thể lồng dữ liệu trong cột 4 và 5 thành một hàng duy nhất với tidyr:

library(tidyr) 
df %>% nest(V4:V5) 

# A tibble: 1 × 4 
#      V1 V2 V3    data 
#     <fctr> <int> <int>   <list> 
#1 platform_external_dbus 202 16 <tibble [5 × 2]> 

Các col 2 và 3 bản sao bây giờ được loại bỏ để phân tích thống kê, nhưng bạn đã giữ col 4 và 5 dữ liệu trong một tibble và có thể quay trở lại vào khung dữ liệu ban đầu bất cứ lúc nào với unnest().

0

câu trả lời chung có thể ví dụ:

df <- data.frame(rbind(c(2,9,6),c(4,6,7),c(4,6,7),c(4,6,7),c(2,9,6)))) 



new_df <- df[-which(duplicated(df)), ] 

đầu ra:

 X1 X2 X3 
    1 2 9 6 
    2 4 6 7 
Các vấn đề liên quan