r语言 - trunc() 和 as.integer() 有什么区别



trunc()as.integer()有什么区别?

为什么as.integer更快?谁能解释一下幕后发生的事情?

为什么trunc()返回类double而不是integer

x <- c(-3.2, -1.8, 2.3, 1.5, 1.500000001, -1.499999999)
trunc(x)
[1] -3 -1  2  1  1 -1
as.integer(x)
[1] -3 -1  2  1  1 -1
all.equal(trunc(x), as.integer(x))
[1] TRUE
sapply(list(trunc(x), as.integer(x)), typeof)
[1] "double" "integer"
library(microbenchmark)
x <- sample(seq(-5, 5, by = 0.001), size = 1e4, replace = TRUE)
microbenchmark(floor(x), trunc(x), as.integer(x), times = 1e4)
# I included floor() as well just to see the performance difference
Unit: microseconds
          expr    min     lq      mean median     uq       max neval
      floor(x) 96.185 97.651 126.02124 98.237 99.411 67892.004 10000
      trunc(x) 56.596 57.476  71.33856 57.770 58.649  2704.607 10000
 as.integer(x) 16.422 16.715  23.26488 17.009 18.475  2828.064 10000

help(trunc)

"trunc 采用单个数字参数 x 并返回一个数字向量,其中包含通过将 x 中的值截断为 0 而形成的整数。">

help(as.integer)

"非整数数值被截断为零(即,as.integer(x( 等于那里的 trunc(x(,[...]">

背景:我正在编写函数以在不同的时间/日期表示形式之间进行转换,例如120403 (hhmmss) -> 43443(自 00:00:00 以来的秒数( 性能才是最重要的。

注意:这个问题与浮点运算无关

SessionInfo: R version 3.3.2, Windows 7 x64

在技术方面,这些功能有不同的目标。

trunc函数删除数字的小数部分。

as.integer函数将输入值转换为 32 位整数。

因此as.integer会在大量(超过 2^31(上溢出:

x = 9876543210.5
sprintf("%15f", x)
# [1] "9876543210.500000"
sprintf("%15f", trunc(x))
# [1] "9876543210.000000"
as.integer(x)
# [1] NA

vector中的值已经numeric

as.integer用于将数据转换为numeric

as.integer("3.55")
# [1] 3
trunc("3.55")
# Error in trunc("3.55") : non-numeric argument to mathematical function

相关内容

  • 没有找到相关文章

最新更新