2012-07-18 28 views
15

Szukałem wyczerpująco dla bezpośredniego tłumaczenia R dla FIRST. i ostatni. wskaźniki w krokach SAS DATA, ale nie mogą go znaleźć. Dla tych, którzy nie znają SAS, FIRST. jest boolowskim, który identyfikuje pierwszy wygląd danego elementu w tabeli i OSTATNIE. jest wartością logiczną, która identyfikuje ostatni wygląd. Na przykład, rozważmy następujący posortowaną tablicę:Jak mogę znaleźć pierwsze i ostatnie wystąpienia elementu w 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 

Ponieważ SAS kroki odczytać dane tabel linia po linii, mogę użyć instrukcji jak:

IF FIRST.V1 THEN DO ... 

FIRST.V1 zwróci TRUE tylko wtedy, gdy po raz pierwszy zaobserwowano w V1. Innymi słowy, zwróci true dla V1 [1] (pierwsze pojawienie się "1"), V1 [5] (pierwsze pojawienie się "2") i V1 [9] (pierwsze pojawienie się "3"). Ostatni. wskaźnik działa w analogiczny sposób, ale z końcowym wyglądem tego elementu.

Czy jest coś w R, które emuluje to?

+0

Może 'powielane()'? Ale trudno powiedzieć, bo tak naprawdę nie powiedziałeś nam, jaki masz cel. – joran

+0

może być więcej R-ish rozwiązanie (np. Z 'ddply') zamiast pętli przez zestaw danych linii na raz ... –

+0

Nie chcę faktycznie pętli przez dane.frame linia po linii. Chcę tylko funkcję, która zwróci true, jeśli jest to pierwszy występ wartości w tej kolumnie i false w przeciwnym razie. Także ten, który zwraca true tylko wtedy, gdy jest ostatnim pojawieniem się wartości, a false w przeciwnym wypadku. Rozwiązanie firmy Spacedman poniżej jest więcej niż wystarczające do tych celów. – asteri

Odpowiedz

21

Można to zrobić z duplikowane i rev (na końcu):

> 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

To fantastyczne! Dziękuję Ci bardzo. – asteri

+5

Ostatni można również znaleźć poprzez: 'LAST =! Duplicated (v1, fromLast = TRUE)' –

Powiązane problemy