作为我的数据集的一部分,其中一列是一系列24位数字。
示例:
bigonumber <- 429382748394831049284934
当我使用data.table::fread
或read.csv
导入它时,它会以指数格式显示为数字(EG:4.293827e + 23)。
options(digits=...)
将无效,因为该数字超过22位。
当我这样做时
as.character(bigonumber)
我得到的是“4.29382748394831e + 23”
有没有办法让bigonumber
转换为字符串并将所有数字显示为字符?我不需要对它进行任何数学计算,但我确实需要搜索它并且dplyr
加入它。
导入后我需要这个,因为列号因月而异。
(是的,在完美的世界中,我的上游数据提供者会使用哈希而不是长数和每个月保持相同的静态列数,但我不会向他们指示。)
答案 0 :(得分:15)
您可以在fread或read.csv语句中指定colClasses。
bignums
429382748394831049284934
429382748394831049284935
429382748394831049284936
429382748394831049284937
429382748394831049284938
429382748394831049284939
bignums <- read.csv("~/Desktop/bignums.txt", sep="", colClasses = 'character')
答案 1 :(得分:10)
您可以使用
来抑制科学记数法options(scipen=999)
如果您定义数字,那么
bigonumber <- 429382748394831049284934
您可以将其转换为字符串:
big.o.string <- as.character(bigonumber)
不幸的是,这不起作用,因为R将数字转换为double,从而失去了精度:
#[1] "429382748394831019507712"
@SabDeM指出,最后的数字不会被保留。甚至设置
options(digits=22)
没有帮助,无论如何22是允许的最大数字;在你的情况下,有24位数字。因此,您似乎必须直接将数据作为字符或因子读取。已经发布了很好的答案,展示了如何实现这一目标。
作为旁注,有一个名为gmp
的包允许使用任意大整数。但是,有一个问题:它们必须被视为字符(同样,为了防止R内部转换为双重)。
library(gmp)
bigonumber <- as.bigz("429382748394831049284934")
> bigonumber
Big Integer ('bigz') :
[1] 429382748394831049284934
> class(bigonumber)
[1] "bigz"
优点是您确实可以将这些条目视为数字并执行计算,同时保留所有数字。
> bigonumber * 2
#Big Integer ('bigz') :
#[1] 858765496789662098569868
这个包和我在这里的答案可能无法解决您的问题,因为直接将数字作为字符读取是实现目标的一种更简单的方法,但我想我可能会发布此信息作为可能需要使用大型用户的信息超过22位的整数。
答案 2 :(得分:3)
在bigonumber上使用.hasClass()
自己生成一个md5哈希值?
digest::digest
答案 3 :(得分:2)
使用“scan”读取文件 - “what”参数允许您定义每列的输入类型。
答案 4 :(得分:2)
如果您想将数字作为数字,则无法打印所有值。 digits
选项最多允许22位数。范围是1到22.它使用print.default
方法。您可以使用以下命令进行设置:
options( digits = 22 )
即使有这个选项,数字也会改变。我忽略了为什么会发生这种情况,很可能是因为你要打印的对象(数字)比允许的数字长,所以R做了一些奇怪的事情。我会调查一下。
答案 5 :(得分:2)
在我发布我的答案之前,我已经看到了这个,但是不再在这里看到它了。
将options(scipen)
设置为较大的值,以便不会截断:
options(scipen = 999)
bigonumber <- 429382748394831049284934
bigonumber
# [1] 429382748394831019507712
as.character(bigonumber)
# [1] "429382748394831019507712"