ऐसा लगता है कि यह एक त्वरित सुधार हो सकता है, लेकिन मैं थोड़ी देर के लिए स्टम्प्ड हो गया हूं।

मेरे डेटा फ्रेम में, मेरे पास दिनांक कॉलम है। हालाँकि, दिनांक कॉलम को एक पंक्ति में एक वर्ष के साथ प्रस्तुत किया जाता है, फिर उस वर्ष के सभी महीनों को उसी कॉलम में अगली कुछ पंक्तियों में, फिर अगले वर्ष, फिर उस वर्ष के महीनों के साथ प्रस्तुत किया जाता है। ऐसा कुछ जो दिखता है:

c("2011", "7", "8", "9", "10", "11", "12", "2012", "1", "2") 

मेरा प्रश्न यह है कि, मैं उस वर्ष को प्रत्येक माह के अंत में कैसे जोड़ूं? दूसरा मुख्य मुद्दा यह है कि मैं इसे कई अलग-अलग डेटा फ़्रेमों के लिए स्वचालित करने जा रहा हूं जो अलग-अलग महीनों और वर्षों में शुरू होते हैं। उदाहरण के लिए, एक डेटा फ़्रेम 2013 के जून में शुरू हो सकता है, जबकि दूसरा सितंबर 2012 से शुरू हो सकता है।

मैंने इस बारे में काफी समय से सोचा है, और इस तरह के विचारों के साथ आया हूं: प्रत्येक पंक्ति के लिए, 12 पूर्ववर्ती पंक्तियों को देखें (एक वर्ष में कितने महीने के लिए) और उस तत्व को ढूंढें जिसकी लंबाई 4 (के लिए) "2012" या अन्य वर्ष; प्रत्येक महीने में स्ट्रिंग की लंबाई 3 होती है)। हालाँकि, यह विफल हो जाता है क्योंकि क्या होगा यदि डेटा अक्टूबर 2011 से शुरू होता है। तब हमें उस पहले वर्ष के लिए केवल 3 महीने मिलते हैं और फिर जब मैं उस एल्गोरिथम को चलाता हूं तो यह पंक्तियों के लिए नकारात्मक मानों में चला जाएगा और इससे बाएं और दाएं त्रुटियां होंगी आर।

मैं वास्तव में इसमें मदद की सराहना करूंगा। मैं इसे बड़ी संख्या में डेटा फ़्रेम के लिए क्रैक करने के लिए प्रतीत नहीं कर सकता, जिसके माध्यम से मुझे इसके माध्यम से काम करने की आवश्यकता है।

1
ttlowwt 25 जुलाई 2017, 03:11

2 जवाब

सबसे बढ़िया उत्तर

अनुक्रमिक काउंटर के रूप में प्रत्येक समूह की पहचान करें, फिर अनुरोध के अनुसार सभी मानों को बदलें:

ave(
  x,
  cumsum(grepl("\\d{4}", x)),
  FUN=function(v) replace(v, -1, paste(v[-1],v[1],sep="-"))
)
# [1] "2011"    "7-2011"  "8-2011"  "9-2011"  "10-2011"
# [6] "11-2011" "12-2011" "2012"    "1-2012"  "2-2012" 
1
thelatemail 25 जुलाई 2017, 03:24

प्रत्येक पंक्ति के लिए वर्ष प्राप्त करने के लिए चिड़ियाघर पैकेज से na.locf का उपयोग करें, year, और फिर "yearmon" वर्ग (चिड़ियाघर में भी) में कनवर्ट करें। अंत में वर्ष को छोड़ दें (या आप जो चाहते हैं उसके आधार पर नहीं) और वैकल्पिक रूप से वर्ष/माह को इच्छानुसार प्रारूपित करें।

library(zoo)

# input
dat <- c("2011", "7", "8", "9", "10", "11", "12", "2012", "1", "2") 

year <- na.locf(ifelse(nchar(dat) == 4, dat, NA))
ym <- as.yearmon(paste(year, dat, sep = "-"))

और फिर आप जो चाहते हैं उसके आधार पर इनमें से किसी एक को आजमाएं:

na.omit(ym)
## [1] "Jul 2011" "Aug 2011" "Sep 2011" "Oct 2011" "Nov 2011" "Dec 2011" "Jan 2012" "Feb 2012"

format(na.omit(ym), "%Y-%m")
## [1] "2011-07" "2011-08" "2011-09" "2011-10" "2011-11" "2011-12" "2012-01" "2012-02"

ifelse(is.na(ym), year, format(ym))
## [1] "2011" "Jul 2011" "Aug 2011" "Sep 2011" "Oct 2011" "Nov 2011" "Dec 2011" "2012" "Jan 2012" "Feb 2012"

ifelse(is.na(ym), year, format(ym, "%Y-%m"))
## [1] "2011"    "2011-07" "2011-08" "2011-09" "2011-10" "2011-11" "2011-12" "2012"    "2012-01" "2012-02"

na.locf और "yearmon" वर्ग के बारे में अधिक जानकारी के लिए चिड़ियाघर के दस्तावेज़ देखें।

1
G. Grothendieck 25 जुलाई 2017, 04:15