यदि मैं प्रश्न को सही ढंग से समझता हूं, तो आप यह जानना चाहते हैं कि जब 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
आर में, TRUEऔर FALSEमूल रूप से के रूप में ही हैं 1और 0इसलिए, अगर हम संचयी राशि प्राप्त करते हैं nonpos, तो यह उचित स्पॉट में 1 (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
(इस समस्या को हल करने का यह तरीका अच्छा है क्योंकि यह स्पष्ट पुनरावृत्ति से बचा जाता है, जो आम तौर पर आर के लिए सिफारिश की जाती है, और बहुत सारे मध्यवर्ती वैक्टर और सूची आदि को उत्पन्न करने से बचती है और यह भी थोड़े साफ-सुथरे हैं कि यह एक पंक्ति पर कैसे लिखा जा सकता है :))