我在MSSQL数据库中有很多数据。我写了一个查询来获取我需要的数据,并希望将这些数据加载到R中进行分析。
问题:当将数据加载到R中时,我的CustomerID号码正在被更改,即SQL Server中的CustomerID将显示为“xxxx0101”[我用xxxx截断了CustomerID字段以显示它只能在末尾附近更改]但在R中它显示为“xxxx2724”(引号不表示字符串:SQL中的数据类型是varchar(30); R似乎是自动分配数据类型)。此外,它将对我的DataValues进行舍入(SQL:2.84 .... 7366 R:2.84 ..... 6575)
SQL表结构:
CustomerID | DataValue
xxxxxxx0101 | 2.84...7366
在R中,相同的信息显示为:
CustomerID | DataValue
xxxxxxx2724 | 2.84...6575
我不明白为什么R会改变我的字段的值。
R代码:
require(RODBC)
myScript = paste(gsub("\t", " ", readLines("TestQuery.sql")), collapse = " ")
myData = data.frame(sqlQuery(myDBConnection, myCode))
View(myData)
将paste()和gsub()函数添加到主readLines()中以删除像\ t(用于制表符)之类的内容并将我的多行SQL查询存储到一个字符串中。我不相信这会导致问题,我已将myScript的结果直接粘贴回MSSQL服务器并验证它返回完全与TestQuery.sql相同的结果
我正在使用RODBC包来连接我的R和SQL。不确定它是否是正确使用的包,如果有更新的包没有这个问题。如果我正在运行一个小的测试查询,例如:
data.frame(sqlQuery(myDBConnection, "select top 10 CustomerID from CustList
order by CustomerID"))
我只有其他一些CustomerID正确的问题。
有趣的事实:我的同事运行我的SQL查询,从中创建了一个SAS数据集,然后将数据集从SAS加载到R作为数据框,并且没有我上面提到的问题(他使用R中的Haven库来读取他的SAS数据集)
更新:我尝试首先初始化一个字符类型为空的数据框,然后使用stringsAsFactors = FALSE一次一个地加载每个CustomerID。代码如下:
foo = sqlQuery(myDBConnection, "select top 10 CustomerID from CustList
order by CustomerID", stringsAsFactors = FALSE)
testDF = data.frame(CustomerID = character(), stringsAsFactors = FALSE)
for( i in 1:10 )
{
testDF[i,1] = foo[i,1]
}
View(testDF)
但是,10个CustomerID中有8个未更改,最后更改的两个更改为+1。我认为它与系列中的下一个只是前一个相关的事实有关,即它将是xxxx100然后是xxxx101,xxxx100打印两次。注意:每个CustomerID都是唯一的,因此原始数据集中不会发生这种情况并且已经过验证。
我想循环调用我的sqlQuery()而不是先将数据加载到'foo'中,但我无法弄清楚在我的sqlQuery函数中放置一个迭代变量。如果有人知道,我们将不胜感激。
答案 0 :(得分:0)
如果你的SQL Server版本是2016,你可以在SQL Server本身使用R功能,它不会给出这个转换错误
答案 1 :(得分:0)
在您描述的场景中,听起来您只是从SQL返回两个不同的记录(每个记录都有自己唯一的CustomerID值),因为您没有明确地对数据进行排序或过滤。
Here is a Stack Overflow discussion on this topic
您的测试SQL查询:
"select top 10 CustomerID from CustList order by CustomerID"
不能保证得到相同的"前10"来自SQL的记录,没有明确的WHERE或ORDER BY语句。
在SQL查询结尾添加ORDER BY语句将确保每次都返回相同的记录顺序。
{{1}}