2015-11-19 8 views
8

में विफल रहता है मेरे पास एक डेटा सेट है जिसमें इन और आउट के लिए दिनांक और समय हैं। प्रत्येक पंक्ति एक इन और आउट सेट है, लेकिन कुछ खाली हैं। मैं na.omit और में एक अच्छा पढ़ा (यह एक csv, और read.csv पर na.strings=c("") काम करता था) के साथ रिक्त स्थान निकाल सकते हैं।कुछ हिस्सों खाली होने पर दिनांक या डेटाटाइम फ़ील्ड को कैसे परिवर्तित करें; na.omit

बेशक, क्योंकि असली दुनिया ट्यूटोरियल पसंद नहीं करती है, कुछ बार केवल तिथियां होती हैं, इसलिए मेरा as.POSIXlt(Dataset$In,format="%m/%d/%Y %H:%M") "केवल दिनांक समय" पर NA देता है।

na.omit इन पंक्तियों को दूर नहीं करता। तो प्रश्न 2

  1. क्यों काम नहीं करते हैं, या मैं इसे कैसे काम कर सकता हूं?

  2. बेहतर, मैं 2 कॉल के बिना या प्रारूप स्ट्रिंग में किसी प्रकार के वैकल्पिक पैरामीटर के साथ एक कॉलम को दोनों तिथियों और टाइम्स (पॉज़िक्स प्रारूप में) में कैसे परिवर्तित कर सकता हूं? (या यह भी संभव है?)।

यह तिथियों और समय का नमूना है। मैं असली फाइल साझा नहीं कर सकता, 1 यह बहुत बड़ा है, 2 यह पीआईआई है।

Id,In,Out 
1,8/15/2015 8:00,8/15/2015 17:00 
1,8/16/2015 8:04,8/16/2015 
1,8/17/2015 8:50,8/17/2015 18:00 
1,8/18/2015,8/18/2015 17:00 
2,8/15/2015,8/15/2015 13:00 
2,8/16/2015 8:00,8/16/2015 17:00 
3,8/15/2015 4:00,8/15/2015 11:00 
3,8/16/2015 9:00,8/16/2015 19:00 
3,8/17/2015,8/17/2015 17:00 
3,, 
4,, 
4,8/16/2015 6:00,8/16/2015 20:00 
+0

? '00: 00'? पहले प्रश्न के बारे में – Roland

+0

। एक 'POSIXlt' ऑब्जेक्ट वास्तव में एक' सूची' है। 'अनक्लास (डीएफ $ इन) 'देखें। फिक्स आसान है। इसके बजाए 'POSIXct' का प्रयोग करें। यह दुर्लभ है कि 'POSIXlt'' POSIXct' से बेहतर विकल्प है। – Roland

+1

ठीक है, 'as.POSIXlt' को' as.POSIXct' में बदलें और आप सेट हैं। – Roland

उत्तर

4
DF <- read.table(text = "Id,In,Out 
       1,8/15/2015 8:00,8/15/2015 17:00 
       1,8/16/2015 8:04,8/16/2015 
       1,8/17/2015 8:50,8/17/2015 18:00 
       1,8/18/2015,8/18/2015 17:00 
       2,8/15/2015,8/15/2015 13:00 
       2,8/16/2015 8:00,8/16/2015 17:00 
       3,8/15/2015 4:00,8/15/2015 11:00 
       3,8/16/2015 9:00,8/16/2015 19:00 
       3,8/17/2015,8/17/2015 17:00", header = TRUE, sep = ",", 
       stringsAsFactors = FALSE) #set this option during import 


DF$In[nchar(DF$In) < 13] <- paste(DF$In[nchar(DF$In) < 13], "0:00") 
DF$Out[nchar(DF$Out) < 13] <- paste(DF$Out[nchar(DF$Out) < 13], "0:00") 

DF$In <- as.POSIXct(DF$In, format = "%m/%d/%Y %H:%M", tz = "GMT") 
DF$Out <- as.POSIXct(DF$Out, format = "%m/%d/%Y %H:%M", tz = "GMT") 
# Id     In     Out 
#1 1 2015-08-15 08:00:00 2015-08-15 17:00:00 
#2 1 2015-08-16 08:04:00 2015-08-16 00:00:00 
#3 1 2015-08-17 08:50:00 2015-08-17 18:00:00 
#4 1 2015-08-18 00:00:00 2015-08-18 17:00:00 
#5 2 2015-08-15 00:00:00 2015-08-15 13:00:00 
#6 2 2015-08-16 08:00:00 2015-08-16 17:00:00 
#7 3 2015-08-15 04:00:00 2015-08-15 11:00:00 
#8 3 2015-08-16 09:00:00 2015-08-16 19:00:00 
#9 3 2015-08-17 00:00:00 2015-08-17 17:00:00 

na.omitPOSIXlt वस्तुओं के साथ काम नहीं करता है, क्योंकि यह प्रलेखित है "वैक्टर, मैट्रिक्स और डेटा फ्रेम वैक्टर और मैट्रिक्स (केवल) शामिल संभाल।" (help("na.omit") देखें)। और सही मायनों में, POSIXlt वस्तुओं वैक्टर नहीं हैं:

unclass(as.POSIXlt(DF$In)) 
#$sec 
#[1] 0 0 0 0 0 0 0 0 0 
# 
#$min 
#[1] 0 4 50 0 0 0 0 0 0 
# 
#$hour 
#[1] 8 8 8 0 0 8 4 9 0 
# 
#$mday 
#[1] 15 16 17 18 15 16 15 16 17 
# 
#$mon 
#[1] 7 7 7 7 7 7 7 7 7 
# 
#$year 
#[1] 115 115 115 115 115 115 115 115 115 
# 
#$wday 
#[1] 6 0 1 2 6 0 6 0 1 
# 
#$yday 
#[1] 226 227 228 229 226 227 226 227 228 
# 
#$isdst 
#[1] 0 0 0 0 0 0 0 0 0 
# 
#attr(,"tzone") 
#[1] "GMT" 

वहाँ शायद ही POSIXct से अधिक POSIXlt पसंद करते हैं करने के लिए किसी भी कारण है (जो एक पूर्णांक मूल आंतरिक रूप से के बाद से सेकंड की संख्या दे रहा है और इस प्रकार कम स्मृति की जरूरत है)।

+0

सचमुच इच्छा है कि मैं 2 बार उभारा सकता हूं ... यह एक अच्छा जवाब था (आपका ज्ञान विशाल है।) –

2

आप रणनीति है कि और इस प्रक्रिया में इन चरित्र मूल्यों लाने "यथा-स्थान" के एक जोड़े को देखते हुए किया गया है। मैं लगभग as.POSIXlt का उपयोग कभी नहीं करता क्योंकि सूची में सूचीबद्ध सूची संरचनाओं से निपटने में इतनी सारी समस्याएं हैं, विशेष रूप से डेटाफ्रेम के साथ इसकी प्रभावी असंगतता पर विचार करना। यहाँ एक विधि है कि एक as -method को परिभाषित करते हुए read. स्तर पर परीक्षण और बलात्कार करता है:

setOldClass("inTime", prototype="POSIXct") 
setAs("character", "inTime", 
     function(from) structure(ifelse(is.na(as.POSIXct(from, format="%m/%d/%Y %H:%M")), 
              as.POSIXct(from, format="%m/%d/%Y") , 
              as.POSIXct(from, format="%m/%d/%Y %H:%M") ), 
           class="POSIXct")) 

read.csv(text=txt, colClasses=c("numeric", 'inTime','inTime')) 
    Id     In     Out 
1 1 2015-08-15 08:00:00 2015-08-15 17:00:00 
2 1 2015-08-16 08:04:00 2015-08-16 00:00:00 
3 1 2015-08-17 08:50:00 2015-08-17 18:00:00 
4 1 2015-08-18 00:00:00 2015-08-18 17:00:00 
5 2 2015-08-15 00:00:00 2015-08-15 13:00:00 
6 2 2015-08-16 08:00:00 2015-08-16 17:00:00 
7 3 2015-08-15 04:00:00 2015-08-15 11:00:00 
8 3 2015-08-16 09:00:00 2015-08-16 19:00:00 
9 3 2015-08-17 00:00:00 2015-08-17 17:00:00 

structure "लिफाफा" ifelse की बजाय अजीब व्यवहार, जो अन्यथा एक अंकीय वापसी होगी की वजह से की जरूरत है वर्ग 'POSIXct' की वस्तु के बजाय ऑब्जेक्ट। इनका क्या बार किया जाना चाहिए:

दूसरे प्रश्न के बारे में
संबंधित मुद्दे