2013-03-26 33 views
13

Vì vậy, tôi có một tập dữ liệu vào R với cách bố trí sau làm ví dụ:Hủy bỏ tất cả các bản sao trừ dụ cuối cùng

ID Date Tally 
1 2/1/2011 1 
2 2/1/2011 2 
3 2/1/2011 3 
1 2/1/2011 4 
2 2/1/2011 5 
1 2/1/2011 6 
3 2/1/2011 7 
4 2/1/2011 8 
2 2/1/2011 9 

Tôi muốn loại bỏ tất cả các trường ngoại trừ trường hợp cuối cùng của bài id. Ngay bây giờ tất cả mọi thứ tôi có thể tìm thấy trực tuyến, và các chức năng tôi đang sử dụng là loại bỏ tất cả mọi thứ trừ trường hợp FIRST.

Vì vậy, khung dữ liệu mới của tôi sẽ như thế nào:

ID Date Tally 
1 2/1/2011 6 
3 2/1/2011 7 
4 2/1/2011 8 
2 2/1/2011 9 

Làm thế nào để làm điều này? Ngay bây giờ tôi chỉ có thể giữ trường hợp đầu tiên. Tôi muốn nó làm ngược lại? Bất kỳ giúp đỡ?

Mang theo tôi Tôi mới tham gia R :)

Trả lời

9

Sử dụng !rev(duplicated(rev(ID))) để lọc ra tất cả trừ lần xuất hiện cuối cùng duy nhất.

Để dataset lọc, sử dụng dataset[!rev(duplicated(rev(dataset$ID))),]

10

Này sẽ không chỉ là trường hợp tiêu chuẩn cho việc sử dụng các tham số 'fromLast' để duplicated?

dat[ !duplicated(dat[, c("ID", "Date")], fromLast=T),] 
#--------- 
    ID  Date Tally 
6 1 2/1/2011  6 
7 3 2/1/2011  7 
8 4 2/1/2011  8 
9 2 2/1/2011  9 

Ví dụ của bạn không đủ phong phú để biết liệu bạn có cần cột "Ngày" trong thử nghiệm trùng lặp hay không, vì vậy có lẽ bạn có thể đơn giản hóa. Tôi để nó vào để minh họa rằng duplicated có phương thức data.frame. Tôi thích !duplicated đến unique vì nó cho phép dễ dàng truy cập vào phần bổ sung nếu bạn so sánh các nhóm.

+0

(+1) Thật vậy. :-) Tuy nhiên, tôi có một vấn đề với 'duplicated.data.frame', bởi vì mã về cơ bản là 'trùng lặp (do.call (" dán ", c (x, sep =" \ r ")), fromLast = fromLast) ', mà, như trang trợ giúp chỉ ra," có thể không hoàn hảo nếu khung dữ liệu có các ký tự có trả về vận chuyển được nhúng hoặc các cột không được ánh xạ một cách đáng tin cậy vào các ký tự ". –

4

Sử dụng một data.table tham gia, bạn có thể thiết lập mult = 'last'

Ví dụ

library(data.table) 
DT <- data.table(DF, key = 'id') 

# join with the unique ID values 
DT[unique(DT[,list(ID)]), mult= 'last'] 

    ID  Date Tally 
1: 1 2/1/2011  6 
2: 2 2/1/2011  9 
3: 3 2/1/2011  7 
4: 4 2/1/2011  8 

Nếu bạn biết các ID duy nhất bạn có thể cũng bất kỳ

DT[.(1:4), mult='last'] 
DT[list(1:4), mult = 'last'] 
1

Sử dụng dplyr sau:

data <- data %>% 
    group_by(ID) %>% 
    slice(which.max(Tally)) 
Các vấn đề liên quan