【问题标题】:Repeat sqldf over different values of a variable对变量的不同值重复 sqldf
【发布时间】:2012-07-07 05:30:30
【问题描述】:

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

【问题讨论】:

  • 您可以改用 SQL 的GROUP BY 函数。您使用哪个数据库?
  • 据我所知,您不能GROUP BY 一个日期范围。我有 MMDDYY 形式的日期,我想将它们分组为月和周。
  • 例如MySQL 有一个 MONTH 函数:dev.mysql.com/doc/refman/5.1/en/…

标签: r sqldf


【解决方案1】:

读入数据,将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

编辑:

关于按周执行的问题,请参阅 zoo quick reference vignette 中的 nextfri 函数。

【讨论】:

  • 谢谢!不知道为什么我自己没有想到,但这正是我需要做的。
猜你喜欢
  • 2017-04-17
  • 2015-08-09
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
相关资源
最近更新 更多