我正在审查一些代码并发现了这个奇怪的结果。如果您有一个具有一个整数类型值的数据帧,并且将其强制为整数,您会得到我认为您所期望的结果:
library(dplyr)
tibble(x = as.integer(c(1))) %>% as.integer()
[1] 1
Run Code Online (Sandbox Code Playgroud)
但如果它是 int64 类型,你会得到一些奇怪的东西:
library(bit64)
tibble(x = as.integer64(c(1))) %>% as.integer()
[1] 0
Run Code Online (Sandbox Code Playgroud)
是什么赋予了?我想这和班级有关系int64。但为什么我会得到零呢?这只是糟糕的错误处理吗?
dput好的,当您调用数据框时,有一个提示会发生什么int64:
structure(list(x = structure(4.94065645841247e-324,
class = "integer64")),
row.names = c(NA, -1L),
class = c("tbl_df", "tbl", "data.frame"))
Run Code Online (Sandbox Code Playgroud)
as.integer()正确地将 4.94065645841247e-324 转换为零也是如此。但为什么 DF 中存储的是这些内容呢?
另外,为了确保这不是bit64问题,我在从数据库返回的实际 df 上得到了非常相似的结构:
structure(list(max = structure(2.78554211125295e-320,
class = "integer64")),
class = "data.frame",
row.names = c(NA, -1L))
Run Code Online (Sandbox Code Playgroud)
我认为这是 的限制bit64。bit64使用 S3 方法as.integer.integer64从 int64 转换为 int,但仅限于向量(与可应用于其他对象的基 as.integer 不同)。基础as.integer不知道如何将 data.frame 上的 int64 转换为 int 或其他。
因此bit64,在加载之后,as.integer实际上将调用 as.integer.integer64所有 int64 向量,但不会调用 data.frame 或 tibble。
| 归档时间: |
|
| 查看次数: |
783 次 |
| 最近记录: |