在R中将数字转换为字符会更改数字

时间:2017-12-23 19:51:54

标签: r

我目前正在使用ngrams,这些ngrams以数字格式存储在data.table中,其中词汇表中的每个单词都有一个唯一的5位数字,单个4-gram看起来像这样:

10000100001017060484

以这种方式存储ngram的原因是数字对象在R中占用的空间要少得多。因此,我正在使用一些大数字,我偶尔需要转换为字符并返回做一些字符串操作。今天,我注意到我的Rstudio似乎没有正确存储大数字。例如:

as.numeric(125124313242345145234513234432)
[1] 125124313242345143744028208602

如您所见,顶部数字与底部非常不同。我使用的唯一全球选项是:

options(scipen=999)

有人可以解释为什么会发生这种情况,我该如何解决?

此致 卡姆兰。

2 个答案:

答案 0 :(得分:2)

如果您运行.Machine$integer.max,它将返回2147483647,这意味着R默认情况下不会处理大于2147483647的整数。如果你运行.Machine$double.xmax,你会得到一个1.797693e+308的值,这是R中浮点数的最大双重表示。推理可以看作是指数(308)和有效数(1.797 ......)这是存储数字的两组不同。

?.Machine

http://sites.stat.psu.edu/~drh20/R/html/base/html/zMachine.html

在你的情况下,如果你试图在数字中附加L(告诉R你想存储类似整数的方式),你会得到这样的结果:

as.numeric(125124313242345145234513234432L)
[1] 1.251243e+29
Warning message:
non-integer value 125124313242345145234513234432L qualified with L; using numeric value 

因此你可以看到,因为在R中保存整数和双重的限制你得到了这个结果。

要解决此问题,您可以使用gmp

将其转换为bigz
 as.bigz("125124313242345145234513234432")

<强>输出

Big Integer ('bigz') :
[1] 125124313242345145234513234432

这是我对在R中存储数字的理解,这可能不完美但是我在R中看到用于存储数字的东西。

您可以选择查看gmp文档:https://cran.r-project.org/web/packages/gmp/gmp.pdf

答案 1 :(得分:1)

很抱歉让这个答案,但它的评论太长了。如果您运行以下代码会发生什么。在我scipen = 999的机器上,您的转换效果很好。您是否已将ngrams的数字存储为numeric?在下面的代码中,您可能会发现根据设置在characternumeric之间进行转换可能会出现潜在错误。

mynumber <- 125124313242345145234513234432
options(scipen = 999)
mynumber == as.numeric(mynumber)
#[1] TRUE
mynumber == as.numeric(as.character(mynumber))
#[1] TRUE

options(scipen = 0)
mynumber == as.numeric(mynumber)
#[1] TRUE
mynumber == as.numeric(as.character(mynumber))
#[1] FALSE