【问题标题】:R is duplicating large integers when reading in a data frameR在读取数据帧时复制大整数
【发布时间】: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


【解决方案1】:

尝试使用 integer64:

library(bit64) 
as.integer64(x)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 2022-01-03
  • 2011-04-27
  • 2018-06-10
  • 2015-05-13
  • 1970-01-01
相关资源
最近更新 更多