Read.table / read.csv में colClasses तर्क के लिए कस्टम दिनांक प्रारूप निर्दिष्ट करें


101

सवाल:

क्या कोई तरीका है जब read.table / read.csv में colClasses तर्क का उपयोग करते हुए दिनांक प्रारूप निर्दिष्ट करें?

(मुझे लगता है कि मैं आयात करने के बाद परिवर्तित कर सकता हूं, लेकिन इस तरह कई तारीख कॉलम के साथ, इसे आयात चरण में करना आसान होगा)


उदाहरण:

मेरे पास प्रारूप में दिनांक स्तंभों के साथ .csv है %d/%m/%Y

dataImport <- read.csv("data.csv", colClasses = c("factor","factor","Date"))

इससे रूपांतरण गलत हो जाता है। उदाहरण के लिए, 15/07/2008बन जाता है 0015-07-20


प्रतिकारक कोड:

data <- 
structure(list(func_loc = structure(c(1L, 2L, 3L, 3L, 3L, 3L, 
3L, 4L, 4L, 5L), .Label = c("3076WAG0003", "3076WAG0004", "3076WAG0007", 
"3076WAG0009", "3076WAG0010"), class = "factor"), order_type = structure(c(3L, 
3L, 1L, 1L, 1L, 1L, 2L, 2L, 3L, 1L), .Label = c("PM01", "PM02", 
"PM03"), class = "factor"), actual_finish = structure(c(4L, 6L, 
1L, 2L, 3L, 7L, 1L, 8L, 1L, 5L), .Label = c("", "11/03/2008", 
"14/08/2008", "15/07/2008", "17/03/2008", "19/01/2009", "22/09/2008", 
"6/09/2007"), class = "factor")), .Names = c("func_loc", "order_type", 
"actual_finish"), row.names = c(NA, 10L), class = "data.frame")


write.csv(data,"data.csv", row.names = F)                                                        

dataImport <- read.csv("data.csv")
str(dataImport)
dataImport

dataImport <- read.csv("data.csv", colClasses = c("factor","factor","Date"))
str(dataImport)
dataImport

और यहाँ आउटपुट कैसा दिखता है:

कोड आउटपुट


ऐसा करने का एक तरीका यह होगा कि आप अपना खुद का संस्करण बनाएं read.tableऔर formatउस तर्क को जोड़ दें जिस पर पारित किया गया है as.Date। मुझे आश्चर्य नहीं होगा अगर वहाँ एक बेहतर तरीका है जो मैं नहीं सोच रहा हूँ, हालांकि।
जॉरन

जवाबों:


158

आप अपना स्वयं का फ़ंक्शन लिख सकते हैं जो एक स्ट्रिंग को स्वीकार करता है और इसे उस तिथि में कनवर्ट करता है जो आप चाहते हैं प्रारूप का उपयोग करके, फिर setAsइसे asविधि के रूप में सेट करने के लिए उपयोग करें । फिर आप colClasses के हिस्से के रूप में अपने फ़ंक्शन का उपयोग कर सकते हैं।

प्रयत्न:

setAs("character","myDate", function(from) as.Date(from, format="%d/%m/%Y") )

tmp <- c("1, 15/08/2008", "2, 23/05/2010")
con <- textConnection(tmp)

tmp2 <- read.csv(con, colClasses=c('numeric','myDate'), header=FALSE)
str(tmp2)

फिर संशोधित करें यदि आपके डेटा के लिए काम करने की आवश्यकता है।

संपादित करें ---

हो सकता है कि आप setClass('myDate')चेतावनी से बचने के लिए पहले भागना चाहें (आप चेतावनी को अनदेखा कर सकते हैं, लेकिन यदि आप ऐसा करते हैं तो यह आपको परेशान कर सकता है और यह एक सरल कॉल है जो इससे छुटकारा दिलाता है)।


2
वाह - सेटर्स एक लाइफसेवर है! मैंने पहले कभी इस फ़ंक्शन को कैसे नहीं देखा है?
user295691

4
ध्यान दें कि आपको इस प्रश्न में विस्तृत रूप से "myDate" चेतावनी के लिए 'कोई परिभाषा नहीं' मिल सकती है ।
डैनी डी'अमोरस

1
क्या करना setMethod('myDate')चाहिए? इसे चलाने से मुझे सिर्फ एक त्रुटि मिलती है ...
जोश ओ'ब्रायन

1
@ जोश'ब्रायन, खेद है कि होना चाहिए था setClass(अब तय)। यह क्या करता है setAs'myDate' के बारे में एक चेतावनी जारी करने से रोकता है जो एक वर्ग के रूप में मौजूद नहीं है। चेतावनी हानिरहित है और सब कुछ अभी भी काम करता है, लेकिन कक्षा सेट करने का मतलब है कि आप चेतावनी भी नहीं देखते हैं।
ग्रेग स्नो

1
@MySchizoBuddy, यदि आपके पास केवल एक ही तारीख का कॉलम है और आप एक बार ऐसा कर रहे हैं, तो इससे कोई फर्क नहीं पड़ता कि आप इसे किस तरीके से करते हैं। लेकिन अगर आपके पास अपने डेटासेट में कई कॉलम हैं जो तारीखों के हैं, तो मुझे लगता है कि पढ़ने के बाद प्रत्येक कॉलम को बदलने की तुलना में यह दृष्टिकोण शायद सरल होगा।
ग्रेग स्नो

25

यदि केवल 1 दिनांक स्वरूप आप बदलना चाहते हैं, तो आप Defaultsडिफ़ॉल्ट स्वरूप को बदलने के लिए पैकेज का उपयोग कर सकते हैंas.Date.character

library(Defaults)
setDefaults('as.Date.character', format = '%d/%M/%Y')
dataImport <- read.csv("data.csv", colClasses = c("factor","factor","Date"))
str(dataImport)
## 'data.frame':    10 obs. of  3 variables:
##  $ func_loc     : Factor w/ 5 levels "3076WAG0003",..: 1 2 3 3 3 3 3 4 4 5
##  $ order_type   : Factor w/ 3 levels "PM01","PM02",..: 3 3 1 1 1 1 2 2 3 1
##  $ actual_finish: Date, format: "2008-10-15" "2009-10-19" NA "2008-10-11" ...

मुझे लगता है कि @Greg स्नो का उत्तर कहीं बेहतर है, क्योंकि यह अक्सर उपयोग किए जाने वाले फ़ंक्शन के डिफ़ॉल्ट व्यवहार को नहीं बदलता है।


7

मामले में आपको समय की भी आवश्यकता होती है:

setClass('yyyymmdd-hhmmss')
setAs("character","yyyymmdd-hhmmss", function(from) as.POSIXct(from, format="%Y%m%d-%H%M%S"))
d <- read.table(colClasses="yyyymmdd-hhmmss", text="20150711-130153")
str(d)
## 'data.frame':    1 obs. of  1 variable:
## $ V1: POSIXct, format: "2015-07-11 13:01:53"

2

कुछ समय पहले, इस बीच समस्या हैडली विकम द्वारा हल की गई है। इसलिए आजकल समाधान एक ऑन्लाइनर तक कम हो गया है:

library(readr)
data <- read_csv("data.csv", 
                  col_types = cols(actual_finish = col_datetime(format = "%d/%m/%Y")))

शायद हम अनावश्यक सामान से भी छुटकारा पाना चाहते हैं:

data <- as.data.frame(data)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.