질문을 올바르게 이해하면가 h_no
증가하지 않는 시기를 감지 한 다음 class
. (이 문제를 어떻게 해결했는지 살펴 보겠습니다. 마지막에는 자체 기능이 있습니다.)
일
우리 h_no
는 현재 열에 대해서만 신경 을 쓰므로 데이터 프레임에서 추출 할 수 있습니다.
> h_no <- data$h_no
우리는 h_no
상승하지 않을 때를 감지하고 싶습니다 . 이것은 연속적인 요소의 차이가 음수이거나 0 일 때 알아낼 수 있습니다. 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
and FALSE
는 기본적으로 1
and와 동일 0
하므로 누적 합을 구하면 nonpos
(거의) 적절한 지점에서 1 씩 증가합니다. cumsum
(기본적으로의 반대 기능 diff
)이 작업을 수행 할 수 있습니다.
> cumsum(nonpos)
[1] 0 0 0 1 1 1 1 1 1 1 2 2 2 2
그러나 두 가지 문제가 있습니다. 숫자가 너무 적습니다. 그리고 첫 번째 요소가 누락되었습니다 (첫 번째 클래스에 4 개가 있어야 함).
첫 번째 문제는 간단히 해결 1+cumsum(nonpos)
됩니다.. 두 1
번째 요소는 첫 번째 요소가 항상 클래스에 있으므로 벡터 앞에 a 를 추가하면 됩니다 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에 권장되는 명시 적 반복을 피하고 많은 중간 벡터 및 목록 등을 생성하지 않기 때문에 좋습니다. 또한 한 줄에 작성하는 방법도 깔끔합니다. :))