2013-02-15 3 views
1

У меня есть папка со многими файлами (читайте через list.files и lapply), которые используют сочетание двух и четырехзначных лет. Даты в 80-х и 90-х годах - две цифры, а даты в 2000-х - четыре цифры (но они смешаны по каждому файлу, поэтому я не могу повторно указать имя файла).Даты ввода с двумя и четырьмя цифрами

Есть ли предпочтительный способ справиться с этим? У меня есть следующее специальное решение.

vec1 <- c("06/30/97", "12/31/99", "01/01/2000", "05/25/2001") 
vec2 <- as.POSIXlt(as.Date(vec1, "%m/%d/%Y")) 
vec3 <- vec2 
vec3$year <- ifelse(vec3$year < 100, vec3$year + 1900, vec3$year) 

Это кажется особенно шумным. Эти случаи работают, но это обязательно сделает правильную корректировку% y до% Y? Я боюсь, что это будет терпеть неудачу из-за високосных лет и тому подобное. Благодаря!

ответ

2

Если вы знаете, что вы просто должны добавить «19» до даты, которые имеют только 2-цифры года, вы также можете сделать это с gsub:

vec1 <- c("06/30/97", "12/31/99", "01/01/2000", "05/25/2001") 
gsub("(.*)/(..)$", "\\1/19\\2", vec1) 
# [1] "06/30/1997" "12/31/1999" "01/01/2000" "05/25/2001 
+1

+1 ОК, это на самом деле проще :) – plannapus

+0

Спасибо, Джуба. Это всегда очевидно в ретроспективе. :) (И я могу легко найти нарушения ... все данные находятся в 80-х, 90-х и 2000-х годах.) –

2

Мы можем изменить свою answer to a previous question, чтобы приспособиться к этому более «неоднозначным» делам:

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

multidate(vec1, c("%m/%d/%Y","%m/%d/%y")) 
[1] "1997-06-30" "1999-12-31" "2000-01-01" "2001-05-25" 
#or 
multidate(vec1, c("%m/%d/%y","%m/%d/%Y")) 
[1] "1997-06-30" "1999-12-31" "2000-01-01" "2001-05-25" 

До тех пор, пока вы не имеете дату в будущем она работает. Если вы это сделаете, измените Sys.Date() на любую другую дату в будущем.

+0

Спасибо за урок. В этом случае я считаю, что решение 'gsub()' для меня немного лучше. –