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