Read.table / read.csv এ কলস ক্লাসের আর্গুমেন্টের জন্য কাস্টম তারিখের ফর্ম্যাটটি নির্দিষ্ট করুন


101

প্রশ্ন:

Read.table / read.csv এ colClass আর্গুমেন্ট ব্যবহার করার সময় তারিখ বিন্যাস নির্দিষ্ট করার কোনও উপায় আছে কি?

(আমি বুঝতে পারি আমি আমদানির পরে রূপান্তর করতে পারি, তবে এর মতো অনেক তারিখ কলামের সাথে এটি আমদানি পদক্ষেপে করা আরও সহজ হবে)


উদাহরণ:

ফর্ম্যাটে তারিখ কলামগুলি সহ আমার কাছে একটি .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। যদিও এর থেকে আরও ভাল উপায়ের কথা আমি ভাবছি না তবে আমি অবাক হব না।
23:32

উত্তর:


158

আপনি নিজের ফাংশনটি লিখতে পারেন যা কোনও স্ট্রিং গ্রহণ করে এবং আপনার পছন্দ মতো ফর্ম্যাট ব্যবহার করে একটি তারিখে রূপান্তর করে, তারপরে setAsএটিকে কোনও asপদ্ধতি হিসাবে সেট করতে ব্যবহার করুন । তারপরে আপনি আপনার ফাংশনটি কলক্লাসগুলির অংশ হিসাবে ব্যবহার করতে পারেন।

চেষ্টা করুন:

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
বাহ - সেটএস একটি লাইফসেভার! এই ফাংশনটি আমি এর আগে কখনই দেখিনি?
ব্যবহারকারী 295691

4
নোট করুন যে আপনি এই প্রশ্নের বিবরণ হিসাবে ক্লাস "মাইডেট" এর কোনও সতর্কতা পেতে পারেন ।
ড্যানি ডি'আমরস

1
কী setMethod('myDate')করার কথা? এটি চালানো আমাকে একটি ত্রুটি দেয় ...
জোশ

1
@ জোশব্রায়ান, দুঃখিত যে এটি করা উচিত ছিল setClass(এখনই স্থির)। এটি কী করে তা setAs'মাইডেট' সম্পর্কে সতর্কতা জারি করা থেকে ক্লাস হিসাবে বিদ্যমান নয় prevent সতর্কবার্তাটি নিরীহ এবং সমস্ত কিছু এখনও কাজ করে তবে শ্রেণি নির্ধারণের অর্থ হ'ল আপনি এমনকি সতর্কতাটি দেখতে পান না।
গ্রেগ স্নো

1
@ মাইস্কিজোবাডি, যদি আপনার কেবলমাত্র একটি তারিখ কলাম থাকে এবং আপনি একবারে এটি করে থাকেন তবে সম্ভবত আপনি কোন উপায়ে এটি করছেন তা বিবেচ্য নয়। তবে আপনার ডেটাসেটে যদি কয়েকটি কলাম থাকে যা তারিখগুলি থাকে তবে আমি মনে করি এই পন্থাটি পড়ার পরে প্রতিটি কলাম পরিবর্তনের চেয়ে সহজ হবে।
গ্রেগ স্নো

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" ...

আমি মনে করি @ গ্রেগ স্নো এর উত্তর আরও ভাল, কারণ এটি প্রায়শই ব্যবহৃত ফাংশনের ডিফল্ট আচরণকে পরিবর্তন করে না।


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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.