为啥 formatC() 函数通过对某些特定值的强制引入 NA?

Posted

技术标签:

【中文标题】为啥 formatC() 函数通过对某些特定值的强制引入 NA?【英文标题】:Why is formatC() function introducing NA by coercion on some specific values?为什么 formatC() 函数通过对某些特定值的强制引入 NA? 【发布时间】:2020-02-27 21:50:40 【问题描述】:

我正在尝试格式化数字,以便它们具有固定宽度,需要引入前导零。在这个this answer 到一个相关问题之后,我正在使用formatC 函数来实现这一点。但我得到了意想不到的结果。

例如,此代码按预期工作:

formatC(2102040015, format = "d", width = 10, flag = "0")
## [1] "2102040015"
formatC(102040015, format = "d", width = 10, flag = "0")
## [1] "0102040015"

但是当我尝试对这些数字使用相同的方法时,我得到了奇怪的结果:

formatC(2152040015, format = "d", width = 10, flag = "0")
## Warning message:
## In storage.mode(x) <- "integer" :
##  NAs introduced by coercion to integer range
## [1] "        NA"
formatC(2522040015, format = "d", width = 10, flag = "0")
## Warning message:
## In storage.mode(x) <- "integer" :
##  NAs introduced by coercion to integer range
## [1] "        NA"

经过一些测试,我得出的结论是,对于每个大于 2150000000 的数字,我都会收到此消息和 " NA" 结果。如果您能给我有关此行为的见解,我将不胜感激。提前谢谢!

【问题讨论】:

【参考方案1】:

在你使用format="d" 的地方,你是在告诉 R 你将专门格式化整数。 R可以存储的最大整数是.Machine$integer.max,通常是

.Machine$integer.max
# [1] 2147483647

超过该数量的数字将存储为浮点数。所以也许你想改用这个:

formatC(2152040015, format = "f", width = 10, flag = "0", digits = 0)

【讨论】:

谢谢@MrFlick 这完全回答了我的问题!所以我猜format = "f"(结合digits = 0 参数)是一种更通用的方法,对吧?我想我会从现在开始使用它。

以上是关于为啥 formatC() 函数通过对某些特定值的强制引入 NA?的主要内容,如果未能解决你的问题,请参考以下文章

为啥贪心硬币找零算法对某些硬币组不起作用?

汇总数据

为啥对 Python 值的引用(即函数参数)存储在 CPython 的堆栈(帧)中?

为啥某些 Emacs 函数不能通过 `M-x` 使用?

为啥云函数 URL (Firebase) 可以公开访问?如何限制对特定外部呼叫的访问? [复制]

仅在某些特定单元格中显示 QComboBox(通过委托)?