2012-06-22 49 views
4

我覺得有一個非常簡單的方法來做到這一點,但我不會輕易找到它......格式[R日期同時保持它們歸類爲日期

我與R工作組從數據集中提取數據他們通過許多不同的特徵對其進行了總結。其中之一是發生事件的月份。我們有事件的數據庫的確切日期,是這樣的:

person_id date_visit 
1   2012-05-03 
2   2012-08-13 
3   2012-12-12 
... 

我想用table()函數生成彙總表,將是這個樣子:

Month Freq 
Jan 12 1 
Feb 12 2 
Mar 12 1 
Apr 12 3 
... 

我的問題是這個。我讀過數據並使用as.Date()將字符串轉換爲日期。我可以使用format.Date()獲取格式爲1月12日,3月12日等的日期。但是,當您使用format.Date()時,最終會再次出現字符串。這意味着當你向他們申請table()時,他們按照字母順序排列(我現在的設置是8月12日,7月12日,6月12日,3月12日等等)。

我知道在SAS中,您可以使用格式來更改日期的外觀,同時將其保留爲日期(因此您仍然可以對日期進行操作)。使用R可以完成同樣的事情嗎?

我的計劃是通過多個步驟構建一個漂亮的數據框,然後(爲確保所有日期轉換爲字符串,出於兼容性原因)使用xtable()來製作一個不錯的LaTeX輸出。

這是我目前的代碼。 ETA:如果可以的話,我寧願在Base R中做它,但如果必須我可以隨時使用其他軟件包。

+0

浮現在腦海的第一件事是使表先用原來的日期格式,然後在使用xtable之前轉換它們。 – joran

+0

是的,但是如果您在完整的日期上執行table(),則會根據各個日期獲取摘要。所以,你不會有一個月的總結,但白天......嗯。我可能只是用自己的邏輯指出了一個致命的缺陷。 – TARehman

回答

1

month.abb是R中的常數矢量和可用於排序的names表的字符串的第一個三個字母。

ds <- data.frame(person_id=1:3, date_visit=as.Date(c("2012-05-03", "2012-08-13", "2012-12-12"))) 
table(format(ds$date_visit, format="%b %Y")) 
tbl <- table(format(ds$date_visit, format="%b %Y")) 
tbl[order( match(substr(names(tbl), 1,3), month.abb))] 

May 2012 Aug 2012 Dec 2012 
     1  1  1 

有了更多年,你會看到「五一」一切都在一起,所以這將需要:

+0

天才。謝謝!我不知道他們已經有一個月的矢量了。棒極了。 – TARehman

4

你可以使用從zooyearmon

require("zoo") 
ds <- data.frame(person_id=1:3, date_visit=c("2012-05-03", "2012-08-13", "2012-12-12")) 
ds$date_visit <- as.yearmon(ds$date_visit) 
ds 
    person_id date_visit 
1   1 May 2012 
2   2 Aug 2012 
3   3 Dec 2012 
+0

如果可以的話,我更願意只使用基礎包,但瞭解動物園包是很好的。謝謝! – TARehman