Soruyu doğru anlarsam, ne zaman h_no
artmadığı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_no
an için yalnızca sütunu önemsiyoruz , bu nedenle bunu veri çerçevesinden çıkarabiliriz:
> h_no <- data$h_no
Ne zaman h_no
yü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 diff
bize 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, TRUE
ve FALSE
temelde ile aynıdır 1
ve 0
bu 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 class
baş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 class
faktö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 :))