【问题标题】:R! posIXCT in sqldfR! sqldf 中的 posIXCT
【发布时间】:2014-12-03 05:15:39
【问题描述】:

第一次提问,如有遗漏,我深表歉意:

我将一个 excel 文件导入到 R 中!使用XLconnect,str()函数如下:

data.frame':    931 obs. of  5 variables:
 $ Media        : chr  "EEM" "EEM" "EEM" "EEM" ...
 $ Month        : POSIXct, format: "2014-08-01" "2014-08-01" "2014-08-01" "2014-08-01" ...
 $ Request_Row  : num  8 25 26 37 38 44 53 62 69 83 ...
 $ Total_Click  : num  12 9 9 8 8 8 7 7 7 7 ...
 $ Match_Type   : chr  "S" "S" "S" "S" ...

当我使用以下 sqldf 时,我没有选择任何行,无论如何可能是错误的:

sqldf(" select Media, sum(Total_Click) , avg(Request_Row), min(Request_Row) , max(Request_Row), count(distinct(Media)) from All_Data 
      where Request_Row < 100  
      and month='2014-09-01'
      group by 1,2 order by 2,6 desc ")

<0 rows> (or 0-length row.names)

感谢您的帮助

Vj

【问题讨论】:

  • “2014-09-01”月份是否真的存在于excel文件中?
  • 请注意month != Month。 (R 区分大小写,您可能会考虑修复您的问题标题,因为它目前“只是丑陋”。)
  • 听到没有回应我会认为拼写是问题并投票关闭作为一个简单的错字。
  • 谢谢各位!这样就解决了问题,strftime('%Y-%m-%d', month, 'unixepoch', 'localtime') ='2014-08-01'
  • 这里的问题不仅仅是月/月。我的答案中概述的代码存在多个问题,因此我投票重新打开。

标签: r posixct sqldf


【解决方案1】:

不清楚是什么意思,但显示的代码有这些问题:

  1. 数据中使用Month,但SQL语句中使用month

  2. SQLite 没有日期或时间类型,因此如果您向 SQLite 发送 POSIXct 值,它将被解释为自 UNIX 纪元以来的秒数(在 GMT 时区中)。因此,月份与字符串的比较将不起作用。您可以使用 SQLite strftimedate 函数将秒数转换为 yy-mm-dd。或者使用具有日期时间类型的数据库。 sqldf支持H2数据库,支持日期时间类型。

  3. 该语句正在尝试按Mediasum(Total_Click) 进行分组。按聚合值分组是不合法的,尽管根据您的意图,也许可以通过嵌套选择来完成。

  4. 由于语句按Media 分组,因此表达式count(distinct(Media)) fromAll_Data 将始终为1,因为这样的组中只能有一个Media

您需要澄清您的意图是什么,但如果我们放弃或修复各个点,我们可以得到:

sqldf("select 
          Media,
          sum(Total_Click) sum_Total_Click, 
          avg(Request_Row) avg_Request_Row, 
          min(Request_Row) min_Request_Row,
          max(Request_Row) max_Request_Row
    from All_Data
    where Request_Row < 100
    and date(month, 'unixepoch', 'localtime') = '2014-08-01'
    group by 1 order by 2 desc")

给出:

  Media sum_Total_Click avg_Request_Row min_Request_Row max_Request_Row
1   EEM              38              24               8              37

RH2 要使用 RH2 软件包和 H2 数据库,请确保您已安装 Java 和 RH2(RH2 包含 H2 数据库,因此 不需要 需要单独安装) 然后:

library(RH2)
library(sqldf)
sqldf("...")

其中 ... 替换为相同的 SQL 语句,但日期比较简化为这一行:

and month = '2014-08-01'

数据:发布到 SO R 标签时,请使用dput 显示您的数据。在这种情况下使用了:

All_Data <-
structure(list(Media = c("EEM", "EEM", "EEM", "EEM"), Month = structure(c(1406865600, 
1406865600, 1406865600, 1406865600), class = c("POSIXct", "POSIXt"
), tzone = ""), Request_Row = c(8, 25, 26, 37), Total_Click = c(12, 
9, 9, 8), Match_Type = c("S", "S", "S", "S")), .Names = c("Media", 
"Month", "Request_Row", "Total_Click", "Match_Type"), row.names = c(NA, 
-4L), class = "data.frame")

更新:其他修订。

【讨论】:

  • 对于延迟回复我深表歉意;月份到月份的错字不是我测试过的问题,这是一个错字,不是在原始 R 代码中谢谢 VJ
猜你喜欢
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 2019-01-13
相关资源
最近更新 更多