2012-07-18 30 views
15

Tôi đã tìm kiếm đầy đủ để có bản dịch R trực tiếp cho FIRST. và cuối cùng. con trỏ trong bước SAS DATA nhưng dường như không thể tìm thấy. Đối với những người không quen thuộc với SAS, FIRST. là một boolean xác định sự xuất hiện đầu tiên của một phần tử đã cho trong bảng và LAST. là một boolean xác định diện mạo cuối cùng. Ví dụ, hãy xem xét các bảng được sắp xếp như sau:Làm thế nào tôi có thể tìm thấy lần xuất hiện đầu tiên và cuối cùng của một phần tử trong một data.frame?

V1 V2 V3 
1  1  1 
1  1  2 
1  2  3 
1  2  4 
2  3  5 
2  3  6 
2  4  7 
2  4  8 
3  5  9 
3  5  10 
3  6  11 
3  6  12 

Vì SAS bước DỮ LIỆU đọc bảng từng dòng, tôi có thể sử dụng một tuyên bố như:

IF FIRST.V1 THEN DO ... 

FIRST.V1 sẽ trả về TRUE nếu và chỉ nếu đây là lần đầu tiên quan sát thấy trong V1. Nói cách khác, nó sẽ trả về true cho V1 [1] (lần xuất hiện đầu tiên của '1'), V1 [5] (lần xuất hiện đầu tiên của '2'), và V1 [9] (lần xuất hiện đầu tiên của '3'). Cuối cùng. các hàm con trỏ theo kiểu tương tự, nhưng với sự xuất hiện cuối cùng của phần tử đó.

Có điều gì trong số R mô phỏng điều này không?

+0

lẽ 'nhân đôi() '? Nhưng thật khó để nói bởi vì bạn đã không thực sự nói với chúng tôi những gì bạn đang thực sự mục tiêu là. – joran

+0

có thể có thêm giải pháp R-ish (ví dụ: với 'ddply') thay vì lặp qua chuỗi dữ liệu được đặt tại một thời điểm ... –

+0

Tôi không muốn thực sự lặp qua dòng data.frame theo dòng. Tôi chỉ muốn một hàm sẽ trả về true nếu nó là lần xuất hiện đầu tiên của giá trị trong cột đó và sai khác. Ngoài ra, một trong đó trả về true chỉ khi nó là sự xuất hiện cuối cùng của giá trị và sai khác. Giải pháp của Spacedman dưới đây là quá đủ cho những mục đích này. – asteri

Trả lời

21

Bạn có thể làm điều này với trùng lặp và rev (ví LAST):

> v1=c(1,1,1,2,2,3,3,3,3,4,4,5) 

> data.frame(v1,FIRST=!duplicated(v1),LAST=rev(!duplicated(rev(v1)))) 
    v1 FIRST LAST 
1 1 TRUE FALSE 
2 1 FALSE FALSE 
3 1 FALSE TRUE 
4 2 TRUE FALSE 
5 2 FALSE TRUE 
6 3 TRUE FALSE 
7 3 FALSE FALSE 
8 3 FALSE FALSE 
9 3 FALSE TRUE 
10 4 TRUE FALSE 
11 4 FALSE TRUE 
12 5 TRUE TRUE 
+0

Thật tuyệt vời! Cảm ơn nhiều. – asteri

+5

Cuối cùng cũng có thể được tìm thấy qua: 'LAST =! Duplicate (v1, fromLast = TRUE)' –

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