长数作为字符串

Cli*_*ers 20 r data.table

作为我的数据集的一部分,其中一列是一系列24位数字.

例:

bigonumber <- 429382748394831049284934
Run Code Online (Sandbox Code Playgroud)

当我导入它使用任一data.table::freadread.csv,它显示为在指数格式数字(EG:4.293827e + 23).

options(digits=...) 由于该数字超过22位,因此无效.

当我做

as.character(bigonumber) 
Run Code Online (Sandbox Code Playgroud)

我得到的是"4.29382748394831e + 23"

有没有办法bigonumber转换为字符串并将所有数字显示为字符?我不需要对它进行任何数学计算,但我确实需要搜索它并dplyr加入它.

导入后我需要这个,因为列号因月而异.

(是的,在完美的世界中,我的上游数据提供者会使用哈希而不是长数和静态列数,每个月都保持相同,但我不能指示它们.)

Ran*_*tch 15

您可以在fread或read.csv语句中指定colClasses.

bignums
429382748394831049284934
429382748394831049284935
429382748394831049284936
429382748394831049284937
429382748394831049284938
429382748394831049284939

bignums <- read.csv("~/Desktop/bignums.txt", sep="", colClasses = 'character')
Run Code Online (Sandbox Code Playgroud)

  • 您甚至可以执行`read.csv("〜/ Desktop/bignums.txt",sep ="",colClasses = c(bignums ='character'))`以保留一列. (3认同)
  • 这是正确的答案.`colClasses`也适用于`fread`. (2认同)

RHe*_*tel 10

你可以压制科学记数法

options(scipen=999)
Run Code Online (Sandbox Code Playgroud)

如果你定义了数字

bigonumber <- 429382748394831049284934
Run Code Online (Sandbox Code Playgroud)

你可以把它转换成一个字符串:

big.o.string <- as.character(bigonumber)
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用,因为R将数字转换为double,从而失去了精度:

#[1] "429382748394831019507712"
Run Code Online (Sandbox Code Playgroud)

如@SabDeM所指出的,最后的数字不会被保留.甚至设定

options(digits=22)
Run Code Online (Sandbox Code Playgroud)

没有帮助,无论如何22是允许的最大数字; 在你的情况下,有24位数字.因此,您似乎必须直接将数据作为字符或因子读取.已经发布了很好的答案,展示了如何实现这一目标.

作为旁注,有一个叫做gmp允许使用任意大整数的包.但是,有一个问题:它们必须被读作字符(同样,为了防止R的内部转换为double).

library(gmp)
bigonumber <- as.bigz("429382748394831049284934")
> bigonumber
Big Integer ('bigz') :
[1] 429382748394831049284934
> class(bigonumber)
[1] "bigz"
Run Code Online (Sandbox Code Playgroud)

优点是您确实可以将这些条目视为数字并执行计算,同时保留所有数字.

> bigonumber * 2
#Big Integer ('bigz') :
#[1] 858765496789662098569868
Run Code Online (Sandbox Code Playgroud)

这个包和我在这里的答案可能无法解决您的问题,因为直接将数字作为字符读取是实现目标的一种更简单的方法,但我认为无论如何我可能会发布此信息作为可能需要使用更多大整数的用户的信息超过22位数.