2014-12-02 4 views
0

первый вопрос, поэтому, если я что-то пропустил, я приношу свои извинения:R! posIXCT in sqldf

Я импортировал файл Excel в R! используя XLconnect, НТР() функция выглядит следующим образом:

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

+0

действительно ли в файле excel месяц '2014-09-01'? – Alex

+1

И обратите внимание, что 'month! = Month'. (R чувствителен к регистру, и вы можете подумать об исправлении заголовка вопроса, так как на данный момент он «просто уродлив».) –

+0

Услышав ответа, я предполагаю, что написание является вопросом и проголосовать за закрытие в качестве простой опечатки. –

ответ

0

Его не ясно, что подразумевается, но код, показанный имеет следующие проблемы:

  1. Month используется в данных, но month используется в операторе SQL

  2. SQLite не имеет даты или времени нет типов и поэтому, если вы отправите значение POSIXct в SQLite оно будет интерпретировано как число секунд с эпоху UNIX (в часовом поясе GMT). Таким образом, сравнение месяца с символьной строкой не будет работать. Вы можете преобразовать количество секунд в yy-mm-dd с помощью функций SQLite strftime или date. Альтернативно используйте базу данных, имеющую типы даты и времени. sqldf поддерживает базу данных H2 и поддерживает типы даты и времени.

  3. Сводка пытается группироваться по Media и sum(Total_Click). Группировка по агрегированной стоимости не является законной, хотя, возможно, это может быть сделано путем выбора вложенности в зависимости от того, что вы намеревались.

  4. Поскольку оператор группировки по Media expressoin count(distinct(Media)) from All_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") 

Обновления: Разных изменений.

+0

Я извиняюсь за задержку ответа; От месяца до месяца typo не проблема, которую я тестировал, это была опечатка здесь не в исходном коде R Спасибо VJ – user4313679