2012-04-05 11 views

Odpowiedz

14

Jest to dość proste, jeśli wiesz o funkcji sign ...

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

... a jeśli wiesz o funkcji 'diff' :) – Tommy

+0

Dziękuję. To bardzo pomocne. –

+0

Uważaj, ta odpowiedź uważa, że ​​c (0,1) ma zmienić znak. To może lub nie być pożądane w zależności od aplikacji! – MHH

1

wolę odpowiedź Joshua, ale tutaj jest alternatywą, bardziej skomplikowany dla zabawy:

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

+1 za skomplikowaną zabawę! –

+0

podobnie jak w powyższej odpowiedzi @JoshuaUlrich, ta odpowiedź uważa, że ​​c (0,1) ma zmienić znak. To może lub nie być pożądane w zależności od aplikacji! – MHH

-1

Jeśli chcesz być straszny człowiek, zawsze można użyć pętli 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

Nie byłem spadkobiercą, ale jeśli masz zamiar być okropną osobą i użyć pętli, powinieneś przynajmniej sprawdzić, czy pierwszy element jest pozytywny czy negatywny. Funkcja as is wykrywa pierwszą wartość ujemną - nie pierwszą zmianę znaku. – Dason

Powiązane problemy