Настройка запросов RODBC - PullRequest
       5

Настройка запросов RODBC

9 голосов
/ 22 ноября 2010

Я пытаюсь получить данные из нашего Oracle datamart в R с помощью RODBC.Мне удалось решить некоторые из моих проблем, но у меня есть один базовый вопрос.

Как сохранить форматирование, хранящееся в базе данных?

С помощью следующей команды

uapp <- sqlQuery(ch, SQL, stringsAsFactors=F)

Мои данные извлекаются, как и ожидалось, но некоторые поля преобразуются в числовые и логические один раз в R, когда они должны быть символами.Я могу обойти это, если использую:

uapp <- sqlQuery(ch, SQL, stringsAsFactors=F, as.is=T)

Но я "теряю" столбцы, отформатированные как даты, когда я хотел бы, чтобы они были.

Ответы [ 2 ]

6 голосов
/ 22 ноября 2010

Вы попали в разрыв, с которым я тоже боролся.Я не могу судить о том, что «правильно» или «лучше», но только о том, что я делал в прошлом.

Я обычно делаю то, что вы делали в первом примере, и просто имею дело с изменениями типов, когда они попадают в R. Если вы хотите использовать последний метод, вы можете преобразовать дату, как только она была в R. Мой OracleПохоже, что системы всегда настроены так, чтобы возвращать даты в формате «22-НОВ-10», что раздражает как анализ.Поэтому я использовал бы функцию Oracle to_char () в своем запросе, чтобы отформатировать даты во что-то, что R может легко распознать.

Так, например, у меня может быть это в моем операторе SELECT:

to_char(myDate, 'yyyy-mm-dd') as myDate

, затем я помещаю это в фрейм данных с именем myData и делаю это:

myData$properDate <- strptime(myData$myDate, "%Y-%m-%d")

Вопрос о том, иметь ли дело с фиксацией дат или с фиксацией других полей, зависит от того, сколько полей даты у вас есть и сколько полей без даты испортил первый метод.Но по своему опыту я либо исправляю одно, либо другое.

Что-то, что вы могли бы учесть при использовании метода 1: попробуйте использовать cast () в вашем SQL, чтобы принудительно задать поле определенного типа.Единственные случаи, когда у меня возникали проблемы с использованием RODBC для моих типов данных, это когда тип неоднозначен на стороне сервера.Обычно это результат операторов CASE или что-то подобное в конце SQL.

2 голосов
/ 11 мая 2017

Аргумент as.is может быть логическим вектором.

Поэтому, если ваш результирующий набор состоит, скажем, из двух столбцов даты, за которыми следует один столбец символов, вы можете сделать:

uapp <- sqlQuery(ch, SQL, stringsAsFactors = FALSE, as.is = c(FALSE, FALSE, TRUE))

РЕДАКТИРОВАТЬ : как предлагает Калин, вы также можете ссылаться на столбцы, которые должны быть "как есть".Например,

uapp <- sqlQuery(ch, SQL, stringsAsFactors = FALSE, as.is = c(2, 4))

оставит столбцы два и четыре "как есть".

...