2010-07-26 77 views
0

最近,我需要一系列的日期從形式"July 25, 2010"轉換爲標準的R格式"2010-07-25"創建switch語句

> head(old.data$dateoccurred)` 
[1] "April 9, 2004"  "September 1, 2004" "February 7, 2005 

爲了解決這個問題,我想提出一個12的情況下開關 - 返回一個月的數字表示的語句;然而,R不支持本地交換機(至少我找不到一臺交換機)。

因此,創建開關的最類似R的方法是什麼?

回答

5

DrewConway很好地回答了切換問題。基礎日期問題具有專門針對它的功能。 strptime()將字符串轉換爲標準時間對象,您可以將其設置爲任何您喜歡的格式。

strptime("September 1, 2004", "%B %d, %Y") 

[1] "2004-09-01" 

+0

謝謝,約翰。我不知道這個功能。 – DrewConway 2010-07-26 11:27:12

1

這個答案的靈感來自於使用Python中的dictreplicate switch behavior。而不是有一個本地交換機,創建一個list由月份名稱與值索引的數字等效:

months<-list("January"="01","February"="02","March"="03","April"="04","May"="05","June"="06","July"="07","August"="08","September"="09","October"="10","November"="11","December"="12") 

有了這個名單,它是直接使用sapply創建轉換:

new.dates<-sapply(as.character(old.data$dateoccurred),function(x) paste(strsplit(x," ")[[1]][3],month.convert(strsplit(x," ")[[1]][1]),sub(",","",strsplit(x," ")[[1]][2]),sep="-")) 

現在我們按照我想要的方式格式化數據。

head(new.data$dateoccurred) 
[1] 2004-04-09 2004-09-01 2005-02-07 2005-02-19 2005-02-22 2005-03-11 
264 Levels: 2004-04-09 2004-09-01 2005-02-07 2005-02-19 2005-02-22 2005-03-11 2005-03-15 2005-03-19 2005-05-13 2005-06-28 2005-06-29 2005-07-05 ... 2009-12-22 
+0

好的技巧,德魯,但R-ISH辦法做到這一點的確是約翰的回答(當然,串在上面的表達式的常量可以用四弦的載體來代替)。將日期字符串解析爲Date()類型(您可以驗證,計算,用'pp做'difftime()'),然後將其格式化爲您喜歡的任何其他文本表示形式。 – 2010-07-26 01:42:12