2012-12-07 12 views
8

जो अब तक मिला है वह डेटाफ्रेम कॉलम है जो विभिन्न वर्ण प्रारूपों में तिथियों के साथ है। कुछ, कुछ %d.%m.%Y पैटर्न में दिखाई %m/%d/%Y में:एक ही कॉलम में एकाधिक दिनांक प्रारूपों को कैसे बदलें

data$initialDiagnose = as.character(data$initialDiagnose) 
data$initialDiagnose[1:10] 

[1] "14.01.2009" "9/22/2005" "4/21/2010" "28.01.2010" "09.01.2009" "3/28/2005" "04.01.2005" "04.01.2005" "9/17/2010" "03.01.2010" 

मैं उन्हें एक प्रारूप में तिथि() के रूप में चाहते हैं, लेकिन आर निश्चित रूप से मना कर दिया।
तो मैं पहली बार में करने की कोशिश की उन्हें विभाजक से बदलने के लिए: '।'

data$initialDiagnose[grep('/', data$initialDiagnose)] = as.character.Date(data$initialDiagnose[grep('/', data$initialDiagnose)], format = '%m/%d/%Y') 

एनालॉग के लिए खजूर। लेकिन यह काम नहीं किया।

मैं उन्हें सभी प्रारूपों में कैसे बदल सकता हूं, कि मैं उनके साथ काम कर सकता हूं?

उत्तर

16
a <- as.Date(data$initialDiagnose,format="%m/%d/%Y") # Produces NA when format is not "%m/%d/%Y" 
b <- as.Date(data$initialDiagnose,format="%d.%m.%Y") # Produces NA when format is not "%d.%m.%Y" 
a[is.na(a)] <- b[!is.na(b)] # Combine both while keeping their ranks 
data$initialDiagnose <- a # Put it back in your dataframe 
data$initialDiagnose 
[1] "2009-01-14" "2005-09-22" "2010-04-21" "2010-01-28" "2009-01-09" "2005-03-28" "2005-01-04" "2005-01-04" "2010-09-17" "2010-01-03" 

Additionnaly यहां पिछले विधि एक स्थिति है जहाँ आप तीन (या अधिक) विभिन्न स्वरूपों के लिए अनुकूलित है:

data$initialDiagnose 
[1] 14.01.2009 9/22/2005 12 Mar 97 4/21/2010 28.01.2010 09.01.2009 3/28/2005 
Levels: 09.01.2009 12 Mar 97 14.01.2009 28.01.2010 3/28/2005 4/21/2010 9/22/2005 

multidate <- function(data, formats){ 
    a<-list() 
    for(i in 1:length(formats)){ 
     a[[i]]<- as.Date(data,format=formats[i]) 
     a[[1]][!is.na(a[[i]])]<-a[[i]][!is.na(a[[i]])] 
     } 
    a[[1]] 
    } 

data$initialDiagnose <- multidate(data$initialDiagnose, 
            c("%m/%d/%Y","%d.%m.%Y","%d %b %y")) 
data$initialDiagnose 
[1] "2009-01-14" "2005-09-22" "1997-03-12" "2010-04-21" "2010-01-28" "2009-01-09" "2005-03-28" 
+0

धन्यवाद ! ठीक काम करता है। – Rob

12

मैं इसके उपयोग में आसानी के लिए lubridate चाहते:

library(lubridate) 

# note added ugly formats below 
data <- data.frame(initialDiagnose = c("14.01.2009", "9/22/2005", 
     "4/21/2010", "28.01.2010", "09.01.2009", "3/28/2005", 
     "04.01.2005", "04.01.2005", "Created on 9/17/2010", "03 01 2010")) 

mdy <- mdy(data$initialDiagnose) 
dmy <- dmy(data$initialDiagnose) 
mdy[is.na(mdy)] <- dmy[is.na(mdy)] # some dates are ambiguous, here we give 
data$initialDiagnose <- mdy  # mdy precedence over dmy 
data 
# initialDiagnose 
#  2009-01-14 
#  2005-09-22 
#  2010-04-21 
#  2010-01-28 
#  2009-09-01 
#  2005-03-28 
#  2005-04-01 
#  2005-04-01 
#  2010-09-17 
#  2010-03-01 
+0

मैं स्पष्ट रूप से परिभाषित वरीयता के मूल्य की सराहना करता/सोचता हूं यहां बहुत बड़ा है। –

संबंधित मुद्दे