2012-07-18 29 views
15

He buscado exhaustivamente una traducción R directa para el PRIMERO. y última. punteros en los pasos de SAS DATA pero parece que no pueden encontrar uno. Para aquellos que no están familiarizados con SAS, PRIMERO. es un booleano que identifica la primera aparición de un elemento dado en una tabla y ÚLTIMO. es un booleano que identifica la última aparición. Por ejemplo, considere la siguiente tabla ordenada:¿Cómo puedo encontrar la primera y la última aparición de un elemento en un 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 

Debido SAS pasos datos leídos tablas línea por línea, puedo usar una instrucción como:

IF FIRST.V1 THEN DO ... 

FIRST.V1 devolverá verdadero si y sólo si esta es la primera vez que se encuentra la observación en V1. En otras palabras, devolverá verdadero para V1 [1] (la primera aparición de '1'), V1 [5] (la primera aparición de '2') y V1 [9] (la primera aparición de '3') El último. el puntero funciona de manera análoga, pero con la apariencia final de ese elemento.

¿Hay algo en R que emule esto?

+0

Tal 'duplicados()'? Pero es difícil de decir porque realmente no nos has dicho cuál es tu objetivo real. – joran

+0

podría haber una solución R-ish más (por ejemplo, con 'ddply') en lugar de recorrer el conjunto de datos una línea a la vez ... –

+0

No quiero recorrer realmente el data.frame línea por línea. Solo quiero una función que devuelva verdadero si es la primera aparición del valor en esa columna y, en caso contrario, falsa. Además, uno que devuelve verdadero solo si es la última aparición del valor y falso de lo contrario. La solución de Spacedman a continuación es más que suficiente para estos propósitos. – asteri

Respuesta

21

Usted puede hacer esto con duplicada y rev (para el final):

> 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

¡Eso es fantástico! Muchas gracias. – asteri

+5

Última también se puede encontrar a través de: 'LAST =! Duplicado (v1, fromLast = TRUE)' –

Cuestiones relacionadas