2012-12-06 41 views
22

Tôi có một khung dữ liệu như vậybản sao trong nhiều cột

> df 
    a b c d 
1 1 2 A 1001 
2 2 4 B 1002 
3 3 6 B 1002 
4 4 8 C 1003 
5 5 10 D 1004 
6 6 12 D 1004 
7 7 13 E 1005 
8 8 14 E 1006 

Tôi muốn loại bỏ các hàng nơi có được lặp lại giá trị trong cột C và cột d. Vì vậy, trong ví dụ này, các hàng 2,3,5 và 6 sẽ bị loại bỏ.

Tôi đã sử dụng này, mà làm việc:

df[!(df$c %in% df$c[duplicated(df$c)] & df$d %in% df$d[duplicated(df$d)]),] 
>df 
    a b c d 
1 1 2 A 1001 
4 4 8 C 1003 
7 7 13 E 1005 
8 8 14 E 1006 

nhưng có vẻ như vụng về và tôi không thể không nghĩ rằng có một cách tốt hơn. Bất kỳ đề xuất nào?

Trong trường hợp bất cứ ai muốn tái tạo dữ liệu-frame đây là dput:

df = structure(list(a = c(1, 2, 3, 4, 5, 6, 7, 8), b = c(2, 4, 6, 
8, 10, 12, 13, 14), c = structure(c(1L, 2L, 2L, 3L, 4L, 4L, 5L, 
5L), .Label = c("A", "B", "C", "D", "E"), class = "factor"), 
    d = c(1001, 1002, 1002, 1003, 1004, 1004, 1005, 1006)), .Names = c("a", 
"b", "c", "d"), row.names = c(NA, -8L), class = "data.frame") 
+0

Xem thêm http://stackoverflow.com/questions/13742446/duplicates-in-multiple-columns –

Trả lời

21

Nó hoạt động nếu bạn sử dụng duplicated hai lần:

df[!(duplicated(df[c("c","d")]) | duplicated(df[c("c","d")], fromLast = TRUE)), ] 

    a b c d 
1 1 2 A 1001 
4 4 8 C 1003 
7 7 13 E 1005 
8 8 14 E 1006 
+1

Ai đó có thể giải thích cho tôi lý do tại sao tính năng này hoạt động? Tôi đã sử dụng nó, và nó hoạt động, nhưng tôi không hiểu. Tại sao "KHÔNG trùng lặp" HOẶC "sao chép" bỏ qua khung dữ liệu? – jessi

+2

@Jessi Công thức * KHÔNG (trùng lặp HOẶC trùng lặp) *. Bản sao đầu tiên không xác định lần xuất hiện đầu tiên của các giá trị trùng lặp và lần lặp lại thứ hai không xác định lần xuất hiện cuối cùng của các giá trị được sao chép. Cùng nhau, họ xác định * tất cả * giá trị trùng lặp. –

+0

Làm cách nào để giữ bản ghi trùng lặp đầu tiên? – mob

14

Thực hiện một đối tượng mới với 2 cột:

df_dups <- df[c("c", "d")] 

Bây giờ áp dụng nó vào df chính của bạn:

df[!duplicated(df_dups),] 

Nhìn gọn gàng hơn và dễ thấy/thay đổi các cột bạn đang sử dụng.

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