只是一点背景:我通过统计学进入编程,我没有太多正式的编程经验,我只知道如何使事情有效。我可以从不同的方向接受任何建议,但我目前正在使用多个sqldf查询来获取我想要的数据。我最初在SAS开始统计编程,我经常使用的一件事就是宏编程能力。
对于一个简单的例子,我说我的表A如下:
Name Sex A B DateAdded
John M 72 1476 01/14/12
Sue F 44 3269 02/09/12
Liz F 90 7130 01/01/12
Steve M 21 3161 02/29/12
我目前使用的select语句的格式如下:
sqldf("SELECT AVG(A), SUM(B) FROM A WHERE DateAdded >= '2012-01-01' AND DateAdded <= '2012-01-31'")
现在我想在DateAdded所在的2月份的enteries上运行相同的查询。根据我使用SAS的经验,您可以为DateAdded的值创建宏变量。我已经考虑将其作为(非常非常慢)for循环运行,但我不确定如何将R变量传递给sqldf,或者是否甚至可能。在我的表格中,我在多年的数据中使用相同的查询 - 任何精简我的代码的方法都会非常感激。
答案 0 :(得分:3)
读入数据,将DateAdded
列转换为Date
类,添加yearmon
(年/月)列,然后使用sqldf
或{{1}按年/月汇总:
aggregate
既然我们拥有正确形式的数据,那么答案只是一行代码。这有两种方式:
Lines <- "Name Sex A B DateAdded
John M 72 1476 01/14/12
Sue F 44 3269 02/09/12
Liz F 90 7130 01/01/12
Steve M 21 3161 02/29/12"
DF <- read.table(text = Lines, header = TRUE)
# convert DateAdded column to Date class
DF$DateAdded <- as.Date(DF$DateAdded, format = "%m/%d/%y")
# add a year/month column using zoo
library(zoo)
DF$yearmon <- as.yearmon(DF$DateAdded)
最后两行的结果是:
# 1. using sqldf
library(sqldf)
sqldf("select yearmon, avg(A), avg(B) from DF group by yearmon")
# 2. using aggregate
aggregate(cbind(A, B) ~ yearmon, DF, mean)
编辑:
关于您按周执行此操作的问题,请参阅zoo quick reference vignette中的> sqldf("select yearmon, avg(A), avg(B) from DF group by yearmon")
yearmon avg(A) avg(B)
1 Jan 2012 81.0 4303
2 Feb 2012 32.5 3215
>
> # 2. using aggregate
> aggregate(cbind(A, B) ~ yearmon, DF, mean)
yearmon A B
1 Jan 2012 81.0 4303
2 Feb 2012 32.5 3215
功能。