我目前正在使用ngrams,这些ngrams以数字格式存储在data.table中,其中词汇表中的每个单词都有一个唯一的5位数字,单个4-gram看起来像这样:
10000100001017060484
以这种方式存储ngram的原因是数字对象在R中占用的空间要少得多。因此,我正在使用一些大数字,我偶尔需要转换为字符并返回做一些字符串操作。今天,我注意到我的Rstudio似乎没有正确存储大数字。例如:
as.numeric(125124313242345145234513234432)
[1] 125124313242345143744028208602
如您所见,顶部数字与底部非常不同。我使用的唯一全球选项是:
options(scipen=999)
有人可以解释为什么会发生这种情况,我该如何解决?
此致 卡姆兰。
答案 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
库
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
?在下面的代码中,您可能会发现根据设置在character
和numeric
之间进行转换可能会出现潜在错误。
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