9

我正在尝试使用 RODBC 将 Oracle 数据集市中的数据提取到 R 中。我已经能够解决我的一些问题,但我有一个基本问题。

如何保留数据库中的格式?

使用以下命令

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

我的数据按预期检索,但是当它们应该是字符时,某些字段在 R 中被转换为数字和逻辑一次。如果我使用,我可以解决这个问题:

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

但是当我希望它们成为日期时,我“丢失”了被格式化为日期的列。

4

2 回答 2

6

你也陷入了我一直在努力解决的问题中。我不能就什么是“正确”或“最好”发表意见,而只能评论我过去所做的事情。

我通常会按照您在第一个示例中所做的操作,并在类型更改进入 R 后处理它们。如果您想执行后一种方法,您可以在日期进入 R 时转换它。我的 Oracle 系统似乎总是设置最多以“22-NOV-10”格式返回日期,这很烦人。因此,我将在查询中使用 Oracle to_char() 函数将日期格式化为 R 可以轻松识别的内容。

因此,例如,我的 SELECT 语句中可能有这个:

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

然后我将其拉入一个名为 myData 的数据框中并执行以下操作:

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

是否处理修复日期或处理修复其他字段实际上取决于您拥有多少日期字段以及第一种方法搞砸了多少非日期字段。但根据我的经验,我要么最终修复一个,要么修复另一个。

使用方法 1 时您可能会考虑的事项:尝试在 SQL 中使用 cast() 以将字段强制为特定类型。我唯一遇到 RODBC 骚扰我的数据类型的问题是服务器端的类型不明确。这通常是 SQL 端的 CASE 语句或类似语句的结果。

于 2010-11-22T20:08:54.767 回答
2

as.is参数可以是布尔向量。

因此,如果您的结果集由两个日期列和一个字符列组成,您可以执行以下操作:

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

编辑:正如 Kalin 所建议的,您还可以参考应该“原样”的列。例如

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

将“原样”保留第二列和第四列。

于 2017-05-10T21:07:22.040 回答