gpt4 book ai didi

RODBC:积极转换字符和数字(有/无原样)

转载 作者:行者123 更新时间:2023-12-04 11:32:34 27 4
gpt4 key购买 nike

相关 https://stackoverflow.com/a/33284035/3358272 ,我发现从 SQL Server (2014) 中提取数据的行为不一致。

library(RODBC)
sqlQuery(.conn, "CREATE TABLE r2test ( [mychar] [NVARCHAR](16), [mynum] [FLOAT])")
# character(0)
sqlQuery(.conn, "INSERT INTO r2test (mychar,mynum) VALUES ('1',3.141593),('2',6.283185)")
character(0)
str(sqlQuery(.conn, "SELECT * FROM r2test", stringsAsFactors = FALSE))
# 'data.frame': 2 obs. of 2 variables:
# $ mychar: int 1 2
# $ mynum : num 3.14 6.28

在该示例中,我们看到了不希望的行为: mychar 的字符正在内部转换为整数。根据前面提到的 SO 答案, as.is选项解决了这个问题,但也有一个不幸的副作用,即强制以十进制表示的浮点数为字符串:
str(sqlQuery(.conn, "SELECT * FROM r2test", stringsAsFactors = FALSE, as.is = TRUE))
# 'data.frame': 2 obs. of 2 variables:
# $ mychar: chr "1" "2"
# $ mynum : chr "3.1415929999999999" "6.2831849999999996"

如果 mychar 中的至少一个实际上不是整数可化的,一切都很好:
sqlQuery(.conn, "INSERT INTO r2test (mychar,mynum) VALUES ('a',9.424778)")
# character(0)
str(sqlQuery(.conn, "SELECT * FROM r2test", stringsAsFactors = FALSE))
# 'data.frame': 3 obs. of 2 variables:
# $ mychar: chr "1" "2" "a"
# $ mynum : num 3.14 6.28 9.42

不幸的是,数据模型不支持任意添加一些东西来鼓励这种行为(或者我只是没有想到一个足够好的方法来做到这一点)。数据模型使得 mychar 的值包括 011它们在字符方面是不同的。我发现的唯一解决方法是使用 as.is = TRUE ,这将需要我 as.numeric所有相关的专栏,都是乏味且(理论上)不必要的工作。

由于文档建议需要设置 DBMSencoding ,我检查了当前的编码(由 https://stackoverflow.com/a/5182469/3358272 帮助):
sqlQuery(.conn, "SELECT SERVERPROPERTY('Collation')")
# 1 SQL_Latin1_General_CP1_CI_AS

我试过使用(踢): DBMSencoding="latin1" , DBMSencoding="UTF-8" , 并且通过默认的 DBMSencoding=""行为没有改变。

我如何鼓励不要过度强制数据类型的行为?

目前在 ubuntu 上使用 R-3.2.5 和 RODBC-1.3.13。

最佳答案

如果我理解正确,我认为如果您正在寻找什么,

str(sqlQuery(
.conn,
"SELECT * FROM r2test",
stringsAsFactors = FALSE,
as.is = c(TRUE, FALSE)
))
#'data.frame': 2 obs. of 2 variables:
# $ mychar: chr "1" "2"
# $ mynum : num 3.14 6.28

在哪里 as.is被指定为逻辑向量(必须与结果集中的列数具有相同的长度)。公平地说,这并没有很好地说明。 sqlQuery 的手册页只是将您推荐给 as.is read.table 中的参数,其中指出:

Note that as.is is specified per column (not per variable) and so includes the column of row names (if any) and any columns to be skipped.



这种方法的缺点是您需要提前知道要转换哪些列以及不转换哪些列。就我个人而言,我不明白为什么默认行为不只是将 SQL 字符类型映射到 R 字符类型、将 SQL 数字类型映射到 R 数字类型等,但也许在后端有一个很好的理由。自动转换 '1' , '2' , ... 到整数 不是 对我来说似乎是一个“功能”。

关于RODBC:积极转换字符和数字(有/无原样),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38443157/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com