在不同的变量值上重复sqldf

时间:2012-07-06 18:15:31

标签: r sqldf

只是一点背景:我通过统计学进入编程,我没有太多正式的编程经验,我只知道如何使事情有效。我可以从不同的方向接受任何建议,但我目前正在使用多个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,或者是否甚至可能。在我的表格中,我在多年的数据中使用相同的查询 - 任何精简我的代码的方法都会非常感激。

1 个答案:

答案 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 功能。