我觉得有一种非常简单的方法可以做到这一点,但我找不到它......
我正在使用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输出。
这是我目前的代码。
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"))
ETA:如果可以的话,我宁愿在Base R中这样做,但如果必须的话,我总是可以使用额外的包。
答案 0 :(得分:4)
您可以使用yearmon
包
zoo
类
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
答案 1 :(得分: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
有了额外的年份,你会看到“May”一起,所以这是需要的:
tbl[order( substr(names(tbl), 5,8), match(substr(names(tbl), 1,3), month.abb) )]