Soruyu doğru anlarsam, ne zaman h_noartmadığını tespit etmek ve ardından class. (Bu sorunu nasıl çözdüğümü inceleyeceğim, sonunda kendi kendine yeten bir işlev var.)
Çalışma
Şu h_noan için yalnızca sütunu önemsiyoruz , bu nedenle bunu veri çerçevesinden çıkarabiliriz:
> h_no <- data$h_no
Ne zaman h_noyükselmediğini tespit etmek istiyoruz , bunu ardışık elemanlar arasındaki farkın negatif veya sıfır olduğu zaman çalışarak yapabiliriz. R diffbize farklılıkların vektörünü veren işlevi sağlar:
> d.h_no <- diff(h_no)
> d.h_no
[1] 1 1 1 -3 1 1 1 1 1 1 -6 1 1 1
Buna sahip olduğumuzda, olumlu olmayanları bulmak basit bir mesele:
> nonpos <- d.h_no <= 0
> nonpos
[1] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
[13] FALSE FALSE
R'de, TRUEve FALSEtemelde ile aynıdır 1ve 0bu nedenle kümülatif toplamını alırsak nonpos, uygun noktalarda (neredeyse) 1 oranında artacaktır. cumsum(Temelde tersidir fonksiyonu diff) yapabilirsiniz.
> cumsum(nonpos)
[1] 0 0 0 1 1 1 1 1 1 1 2 2 2 2
Ancak iki sorun var: sayılar çok küçük; ve ilk öğeyi kaçırıyoruz (birinci sınıfta dört tane olmalı).
İlk sorun kolayca çözülür: 1+cumsum(nonpos). Ve ikincisi 1, vektörün önüne bir eklemeyi gerektirir , çünkü ilk eleman her zaman sınıftadır 1:
> classes <- c(1, 1 + cumsum(nonpos))
> classes
[1] 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3
Şimdi, onu veri çerçevemize geri ekleyebiliriz cbind( class=sözdizimini kullanarak , sütuna classbaşlık verebiliriz ):
> data_w_classes <- cbind(data, class=classes)
Ve data_w_classesşimdi sonucu içerir.
Son sonuç
Satırları birlikte sıkıştırabilir ve kullanımını kolaylaştırmak için hepsini bir işleve sarabiliriz:
classify <- function(data) {
cbind(data, class=c(1, 1 + cumsum(diff(data$h_no) <= 0)))
}
Ya da classfaktör olması mantıklı olduğu için :
classify <- function(data) {
cbind(data, class=factor(c(1, 1 + cumsum(diff(data$h_no) <= 0))))
}
Her iki işlevi de şu şekilde kullanırsınız:
> classified <- classify(data) # doesn't overwrite data
> data <- classify(data) # data now has the "class" column
(Bu problemi çözmenin bu yöntemi iyidir, çünkü genellikle R için tavsiye edilen açık yinelemeyi önler ve çok sayıda ara vektör ve liste vb. Üretmekten kaçınır. Ve ayrıca bir satıra nasıl yazılabileceği de oldukça temiz :))