【发布时间】:2019-06-21 10:43:07
【问题描述】:
我有一个数据库表,其中有一列包含不同的 17 位数字。当我要求 R 将该表的一部分或全部读入数据帧时,它会将某些值复制 4 或 5 次并丢弃其他值。效果是一个有 17 个唯一值的表最终会得到 6 个。这很奇怪。当我使用 RODBC 连接读取数据或将它们保存到 csv 并以这种方式加载它们时,就会发生这种情况。这绝对是一个 R 问题,因为我已经用假数据隔离了这个问题:
base_num <- "9600000005206"
# Now create a vector of unique numbers in character format
x <- paste0(base_num, seq(5680, 5760, 1))
x
x
[1] "96000000052065680" "96000000052065681" "96000000052065682"
"96000000052065683" "96000000052065684" "96000000052065685"
"96000000052065686"
[8] "96000000052065687" "96000000052065688" "96000000052065689"
"96000000052065690" "96000000052065691" "96000000052065692"
"96000000052065693"
[15] "96000000052065694" "96000000052065695" "96000000052065696"
"96000000052065697" "96000000052065698" "96000000052065699"
"96000000052065700"
# Convert them to numeric
# ta-da! Duplicate values and dropped values
as.numeric(x)
[1] 96000000052065680 96000000052065680 96000000052065680
96000000052065680 96000000052065680 96000000052065680 96000000052065680
[8] 96000000052065680 96000000052065696 96000000052065696
96000000052065696 96000000052065696 96000000052065696 96000000052065696
[15] 96000000052065696 96000000052065696 96000000052065696
96000000052065696 96000000052065696 96000000052065696 96000000052065696
当我从我知道该列包含唯一值的数据库或 CSV 中读取数据时,就会发生这种情况。谢谢。
编辑:
感谢您强调该问题以及如何在 R 中解决该问题。问题仍然是 R 在读取数据时正在完成此转换。即使我将查询指定为:
CAST(longnumber AS VARCHAR(50)) as 'target_column'
R still 将其视为一个过长的整数。我必须写:
CAST(longnumber AS VARCHAR(50)) + 'S' as 'target_column'
为了让 R 将其作为字符字段读入,这正是我所需要的。有什么想法吗?
【问题讨论】:
-
如果整数太大,R 切换为双精度。
-
试试
all.equal(as.numeric("96000000052065680" ), as.numeric("96000000052065680" ) + 1) -
您使用的是什么数据库?可以使用基于
DBI的包而不是使用RODBC来读取它。 -
SAP IQ 但我不愿意乱搞我们的数据库包(或者写一个新的!) - 我暂时继续使用“+'S'”解决方案.谢谢。
-
您应该能够使用
odbc包而不是RODBC。我认为它正在得到更积极的维护。
标签: sql r type-conversion precision