ถ้าผมเข้าใจคำถามได้อย่างถูกต้องที่คุณต้องการในการตรวจสอบเมื่อไม่เพิ่มขึ้นและจากนั้นเพิ่มขึ้นh_no
class
(ฉันจะอธิบายถึงวิธีที่ฉันแก้ไขปัญหานี้มีฟังก์ชั่นที่มีอยู่ในตัวในตอนท้าย)
การทำงาน
เราสนใจเฉพาะh_no
คอลัมน์ในขณะนี้ดังนั้นเราจึงสามารถดึงข้อมูลนั้นออกจาก data frame
> 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)
. และอย่างที่สองเพียงแค่ต้องเพิ่ม a 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
ตอนนี้เราสามารถแนบกลับเข้าไปใน data frame ของเราด้วย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 และหลีกเลี่ยงการสร้างเวกเตอร์และรายการระดับกลางจำนวนมากเป็นต้นและยังเป็นวิธีที่ดีในการเขียนในบรรทัดเดียว :))