2012-09-14 46 views
6

Tôi có tập dữ liệu tôi muốn xóa các hàng dữ liệu có thông tin trùng lặp trong 4 cột khác nhau.xóa các hàng trùng lặp dựa trên các điều kiện từ nhiều cột trong r

foo<- data.frame(g1 = c("1","0","0","1","1"), v1 = c("7","5","4","4","3"), v2 = c("a","b","x","x","e"), y1 = c("y","c","f","f","w"), y2= c("y","y","y","f","c"), y3 = c("y","c","c","f","w"), y4= c("y","y","f","f","c"), y5=c("y","w","f","f","w"), y6=c("y","c","f","f","w")) 

foo sau đó trông giống như:

g1 v1 v2 y1 y2 y3 y4 y5 y6 
1 1 7 a y y y y y y 
2 0 5 b c y c y w c 
3 0 4 x f y c f f f 
4 1 4 x f f f f f f 
5 1 3 e w c w c w w 

Bây giờ, tôi muốn loại bỏ bất kỳ hàng đó đã nhân đôi dữ liệu dựa trên Y1-6columns. Vì vậy, chỉ có hàng 4 và 1 sẽ bị xóa nếu được thực hiện đúng cách, dựa trên tất cả các biến Y giống hệt nhau. Điều kiện nhiều cột của nó.

Tôi tin rằng tôi thân thiết nhưng nó không hoạt động chính xác.

Tôi đã thử: new = foo[!(duplicated(foo[,1:6]))] suy nghĩ để sử dụng lệnh trùng lặp mà nó sẽ tìm kiếm và chỉ tìm thấy những kết hợp chính xác?

Tôi đã nghĩ về việc sử dụng câu lệnh có điều kiện với &, nhưng cũng không thể biết cách thực hiện điều đó.
new = foo[foo$y1==foo$y2|foo$y3|foo$y4|foo$y5|foo$y6]

Tôi đã nghĩ về điều đó nhưng giờ đây Im bị choáng ngợp và mất mát. Tôi mong chờ foo để trông giống như:

g1 v1 v2 y1 y2 y3 y4 y5 y6 
2 0 5 b c y c y w c 
3 0 4 x f y c f f f 
5 1 3 e w c w c w w 

Trả lời

10
> foo[apply(foo[ , paste("y", 1:6, sep = "")], 1, 
      FUN = function(x) length(unique(x)) > 1), ] 
    g1 v1 v2 y1 y2 y3 y4 y5 y6 
2 0 5 b c y c y w c 
3 0 4 x f y c f f f 
5 1 3 e w c w c w w 
+1

ưa thích của tôi cho đến nay. –

+0

Tôi xin lỗi vì đã đơn giản hóa ví dụ của mình, bởi vì tôi có nhiều cột thông tin hơn ... nên dựa trên biến 1-6 CHỈ trong tổng số 9 cột thông tin. Tôi sẽ chỉnh sửa ví dụ trên – Kerry

+0

Tôi đã cập nhật câu trả lời của mình. Bây giờ, việc lựa chọn các hàng dựa trên các cột y1 - y6. –

2
foo[apply(foo, 1, function(x) any(x != x[1])),] 
1
> foo[ !rowSums(apply(foo[2:6], 2, "!=", foo[1]))==0, ] 
    y1 y2 y3 y4 y5 y6 
2 c y c y w c 
3 f y c f f f 
5 w c w c w w 

> foo[ ! colSums(apply(foo, 1, duplicated, foo[1])) == 5, ] 
    y1 y2 y3 y4 y5 y6 
2 c y c y w c 
3 f y c f f f 
5 w c w c w w 
Các vấn đề liên quan