将日期格式化为月份-年份,同时保持日期类别不变。

6

我觉得有一个相当简单的方法可以做到这一点,但我不容易找到它...

我正在使用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()以Jan 12,Mar 12等格式呈现日期。但是,当您使用format.Date()时,又会得到字符字符串。这意味着当您对它们应用table()时,它们按字母顺序排列(我的当前设置为Aug 12,Jul 12,Jun 12,Mar 12等)。
我知道在SAS中,您可以使用格式更改日期的外观,同时将其保留为日期(因此仍然可以对其进行日期操作)。是否可以使用R执行相同的操作?
我的计划是通过多个步骤构建一个漂亮的数据框架,然后(确保所有日期都转换为字符串以实现兼容性)使用xtable()制作漂亮的LaTeX输出。
以下是我目前的代码。
load("temp.RData")
ds$date_visit <- as.Date(ds$date_visit,format="%Y-%m-%d")
table(format.Date(safebeat_recruiting$date_baseline,format="%b %Y"))

预计完成时间:如果可能的话,我更倾向于只使用Base R进行操作,但是如果必须的话,我可以考虑使用附加包。


脑海中首先想到的是先使用原始日期格式创建表格,然后在使用xtable之前进行转换。 - joran
是的,但如果你在完整日期上使用table()函数,你会得到每个日期的摘要。所以,你不会得到按月份汇总的摘要,而是按天...嗯。我可能刚刚指出了自己逻辑上的致命缺陷。 - TARehman
2个回答

5
你可以使用 zoo 包中的 yearmon 类。
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

如果可能的话,我更喜欢只使用基本包,但了解zoo包也是很好的。谢谢! - 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 

随着时间的推移,您会看到所有的“五月”都在一起,因此需要这样做:

 tbl[order( substr(names(tbl), 5,8),  match(substr(names(tbl), 1,3), month.abb) )]

太棒了!谢谢!我不知道他们已经有一个月向量了。 - TARehman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接