2012-04-05 8 views

Respuesta

14

Esto es bastante simple, si usted sabe acerca de la función sign ...

which(diff(sign(df))!=0) 
# [1] 2 
+1

... y si conoce la función 'diff' :) – Tommy

+0

Gracias. Eso es muy útil. –

+0

Tenga cuidado, esta respuesta considera que c (0,1) tiene un cambio de signo. Esto puede o no ser deseado dependiendo de la aplicación. – MHH

1

prefiero la respuesta de Joshua, pero aquí es una alternativa, uno más complicado sólo por diversión:

head(cumsum(rle(sign(df))$lengths),-1) 
+0

+1 por diversión complicada! –

+0

de forma similar a la respuesta anterior por @JoshuaUlrich, esta respuesta considera que c (0,1) tiene un cambio de signo. Esto puede o no ser deseado dependiendo de la aplicación. – MHH

-1

Si quieres ser una persona terrible, usted podría utilizar siempre un bucle for:

signchange <- function(x) { 
    index = 0 
    for(i in 1:length(x)) 
    { 
     if(x[i] < 0) 
     { 
      return (index) 
     } 
     else 
     { 
      index = index + 1 
     } 
    } 
    return (index) 
} 
+2

No fui el votante negativo pero si vas a ser una persona terrible y usas un bucle, al menos deberías comprobar si el primer elemento es positivo o negativo. La función como es detecta el primer valor negativo, no el primer cambio de signo. – Dason

Cuestiones relacionadas