2012-10-24 6 views
7

Mam ogromną ramkę danych. Jedna kolumna to liczba całkowita z zakresu od 1 do 2. Potrzebuję sposobu na znalezienie ciągłych wierszy z pewną liczbą określonych wartości w tej kolumnie, podzielenie tych wierszy i przetworzenie ich później na wykresy.Jak wyszukiwać równe zmienne w wierszach (w inteligentny sposób) i przechowywać zgodnie z wierszami jako podzbiory?

Dołączyłem mały przykład, który wykonuje przynajmniej część pożądanej pracy: Jestem w stanie wydrukować podzestawy, których szukam. Pozostają jednak dwa pytania:

  • Domyślam się, że istnieją sposoby mądrzejsze w R, a następnie zastosować pętlę "dla" w pełnym data.frame. Jakieś wskazówki?
  • Które polecenie mam umieścić tam, gdzie teraz polecenie "print" zapisuje tymczasowy plik data.frame? Sądzę, że potrzebuję listy ze względu na różną długość podzbiorów ...

Już wcześniej obejrzałem agregat lub ddply, ale nie mogłem znaleźć rozwiązania.

Każda pomoc jest bardzo ceniona.

test<-c(rep(1,3),rep(2,5),rep(1,3),rep(2,3),rep(1,3),rep(2,8),rep(1,3)) 
letters<-c("a","b","c","d") 
a1<-as.data.frame(cbind(test,letters)) 

BZ<-2 #The variable to look for 
n_BZ=4 #The number of minimum appearences 

k<-1 # A variable to be used as a list item index in which the subset will be stored 

for (i in 2:nrow(a1)){ 
    if (a1$test[i-1]!=BZ & a1$test[i]==BZ)  # When "test" BECOMES "2" 
    {t_temp<-a1[i,]}       #... start writing a temporary array 
    else if (a1$test[i-1]==BZ & a1$test[i]==BZ) # When "test" REMAINS "2" 
    {t_temp<-rbind(t_temp,a1[i,])}    #... continue writing a temporary array 
    else if (a1$test[i-1]==BZ & a1$test[i]!=BZ) # When "test" ENDS BEING "2" 
    {if (nrow(t_temp)>n_BZ)      #... check if the temporary array has more rows then demanded 
     {print(t_temp)        #... print the array (desired: put the array to a list item k) 
     k<-k+1}}         #... increase k 
    else          # If array too small 
    {t_temp<-NULL}        # reset 
} 

Odpowiedz

6

Funkcja rle jest bardzo przydatna do takich rzeczy. Pobiera on wektor atomowy i zwraca list z elementami lengths i values, gdzie lengths zawiera długość przebiegu każdej wartości w values.

Ponieważ wywołanie cbind w przykładzie wymusza kolumnę test do factor, najpierw przekształca go numeric:

a1 <- within(a1, test <- as.numeric(as.character(test))) 

Następnie wynik można uzyskać w miły (w zasadzie), jednej liniowej:

with(rle(a1$test), 
    split(a1, rep(seq_along(lengths), lengths))[values == BZ & lengths >= n_BZ] 
) 
+1

+1, miłe użycie 'rle()' i 'split()' –

+0

Dzięki, dobre wezwanie do konwersji. –

+0

Dzięki za szybką odpowiedź, spróbuję ... –

Powiązane problemy