0

只是一点背景:我是通过统计进入编程的,我没有太多正式的编程经验,我只是知道如何让事情发挥作用。我愿意接受任何从不同方向提出的建议,但我目前正在使用多个 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 在二月份的输入运行相同的查询。根据我对 SAS 的经验,您将为 DateAdded 的值创建宏变量。我考虑过将其作为(非常非常慢的)for 循环运行,但我不确定如何将 R 变量传递给 sqldf,或者这是否可能。在我的表中,我在多年的数据中使用相同的查询——任何简化我的代码的方法都将不胜感激。

4

1 回答 1

3

读入数据,将DateAdded列转换为Date类,添加yearmon(年/月)列,然后使用sqldfaggregate按年/月聚合:

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)

最后两行的结果是:

> 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

编辑:

关于您按周进行的问题,请参阅动物园快速参考小插图nextfri中的功能。

于 2012-07-06T18:49:26.733 回答