Якщо я правильно розумію питання, ви хочете виявити, коли h_no
він не збільшується, а потім збільшується class
. (Я збираюся ознайомитися з тим, як я вирішив цю проблему, в кінці є автономна функція.)
Робочий
h_no
На даний момент нас хвилює лише стовпець, тому ми можемо отримати це з кадру даних:
> h_no <- data$h_no
Ми хочемо виявити, коли h_no
не йде вгору, що ми можемо зробити, працюючи, коли різниця між послідовними елементами або негативна, або нульова. R забезпечує diff
функцію, яка дає нам вектор відмінностей:
> d.h_no <- diff(h_no)
> d.h_no
[1] 1 1 1 -3 1 1 1 1 1 1 -6 1 1 1
Після того, як ми це зробимо, знайти прості речі, які не є позитивними:
> nonpos <- d.h_no <= 0
> nonpos
[1] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
[13] FALSE FALSE
В R, TRUE
і FALSE
в основному такі ж, як 1
і0
, тому якщо ми отримаємо сукупну суму nonpos
, вона збільшиться на 1 в (майже) відповідних плямах. cumsum
Функція (яка в основному протилежність diff
) може це зробити.
> cumsum(nonpos)
[1] 0 0 0 1 1 1 1 1 1 1 2 2 2 2
Але є дві проблеми: цифри - одна занадто мала; і, нам не вистачає першого елемента (у першому класі повинно бути чотири).
Перша проблема просто вирішується: 1+cumsum(nonpos)
. А другий просто вимагає додавання а 1
до фронту вектора, оскільки перший елемент завжди в класі 1
:
> classes <- c(1, 1 + cumsum(nonpos))
> classes
[1] 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3
Тепер ми можемо прикріпити його назад до нашого кадру даних cbind
(використовуючи class=
синтаксис, ми можемо дати стовпцю class
заголовок):
> data_w_classes <- cbind(data, class=classes)
А data_w_classes
тепер містить результат.
Кінцевий результат
Ми можемо стиснути лінії разом і згорнути все це у функції, щоб полегшити їх використання:
classify <- function(data) {
cbind(data, class=c(1, 1 + cumsum(diff(data$h_no) <= 0)))
}
Або, оскільки це має сенс для class
бути фактором:
classify <- function(data) {
cbind(data, class=factor(c(1, 1 + cumsum(diff(data$h_no) <= 0))))
}
Ви використовуєте будь-яку функцію, як:
> classified <- classify(data) # doesn't overwrite data
> data <- classify(data) # data now has the "class" column
(Цей спосіб вирішення цієї проблеми хороший тим, що дозволяє уникнути явної ітерації, що, як правило, рекомендується для R, і уникає генерації безлічі проміжних векторів та списку тощо. А також це якось добре, як це можна записати в одному рядку :))