sqldf в R возвращает NA для всех строк в выражении SQL CASE - PullRequest
0 голосов
/ 04 января 2019

У меня есть датафрейм в R, называемый "data".Столбец EventDate представляет собой date format, а остальные представляют собой двойные или символьные поля.

Я пытаюсь извлечь большинство столбцов из "data", но aggregate значения EventDate в обозначениях года-месяца вместо обозначений текущего года-месяца-дня (поэтому яв итоге в качестве значений строки нужно указать 01-2018, 02-2018, 03-2018 и т. д.).

У меня было много проблем, когда я делал это в базе R или находил какие-то пакеты, чтобы сделать это легко.У меня гораздо больше опыта в SQL, чем в R, поэтому я решил использовать пакет sqldf.

Вот код, который я написал:

newdata <- sqldf("SELECT ID1, ID2, ID3, Staff, Type, POC, TOC1, TOC2, TOC3, CASE
  WHEN EventDate >= '2018-01-01' AND EventDate < '2018-02-01' THEN 'Jan 2018'
  WHEN EventDate >= '2018-02-01' AND EventDate < '2018-03-01' THEN 'Feb 2018'
  WHEN EventDate >= '2018-03-01' AND EventDate < '2018-04-01' THEN 'Mar 2018'
  WHEN EventDate >= '2018-04-01' AND EventDate < '2018-05-01' THEN 'Apr 2018'
  WHEN EventDate >= '2018-05-01' AND EventDate < '2018-06-01' THEN 'May 2018'
  WHEN EventDate >= '2018-06-01' AND EventDate < '2018-07-01' THEN 'Jun 2018'
  WHEN EventDate >= '2018-07-01' AND EventDate < '2018-08-01' THEN 'Jul 2018'
  WHEN EventDate >= '2018-08-01' AND EventDate < '2018-09-01' THEN 'Aug 2018'
  WHEN EventDate >= '2018-09-01' AND EventDate < '2018-10-01' THEN 'Sep 2018'
  WHEN EventDate >= '2018-10-01' AND EventDate < '2018-11-01' THEN 'Oct 2018'
  WHEN EventDate >= '2018-11-01' AND EventDate < '2018-12-01' THEN 'Nov 2018'
  WHEN EventDate >= '2018-12-01' AND EventDate < '2019-01-01' THEN 'Dec 2018'
  END AS EventMonth
  FROM data
  ORDER BY EventMonth, Staff, ID1")

Код выполняется без проблем и производит в основномправильные результаты, только то, что он возвращает NA для всех строк в столбце EventMonth в «newdata» вместо "Jan 2018", "Feb 2018" и т. д.

Возможно, проблема с форматированием EventDateстолбец в "data", но data$EventDate указан как тип даты в RStudio и находится в yyyy-mm-dd format.

Я также попытался выполнить следующее (которое не выдает ошибку или не выдало никаких предупреждений) перед запуском предыдущего кода в качестве проверки работоспособности, но он все же дал мне столбец, полный NA для EventMonth:

data$EventDate <- as.Date(data$EventDate)

SQL выдает ожидаемый результат, когда я запускаю его в SQL Server (в столбце EventMonth нет NA), но, к сожалению, у меня не всегда будет доступ к SQL Server в будущем, поэтому я 'Я беспокоюсь с R на всех.

Мне нужен способ сделать это без фактического ядра базы данных SQL, чтобы выполнить аналогичные агрегации в будущем.Я недавно установил R, RStudio и пакет sqldf в течение последнего месяца, поэтому я не должен использовать ничего ужасно устаревшего.

Есть ли способ получить желаемый результат, используя sqldf, base R или какой-то другой пакет R ?

1 Ответ

0 голосов
/ 04 января 2019

возможно ли использовать SQLquery вместо sqldf.Если да, ваш запрос может работать таким образом.

У меня есть такая таблица на сервере SQL.

enter image description here

Вы можете установить соединение с вашим SQL-сервером, используя R.

 library(odbc)
 library(RODBC)
 library(sqldf)

 conn <- odbcDriverConnect('driver={SQL Server};server= 
 YOURserver;database=Yourdatabase;trusted_connection=true')

  Datanew <- sqlQuery(conn,"SELECT ID,Dates,Amount  ,
  case when Dates >= '2018-01-01' and Dates < '2018-02-01' then 'Jan 2018'
                when Dates >= '2018-02-01' and Dates < '2018-03-01' then 'Feb 2018' 
                when Dates >= '2018-03-01' and Dates < '2018-04-01' then 'Mar 2018' 
  end as Months, 
                 format(dates,'MMM yyyy') NewapproachDates
                FROM dbo.practicR;"); 

View(Datanew) 

Оператор case для преобразования дат в месяци год верен, но эта функция форматирования будет намного проще, поскольку вам не нужно указывать диапазон дат каждый раз, как вы делаете в выписке.Есть два столбца для дат (один из них предоставлен вами, а другой - новым)

Вывод такой:

enter image description here

...