What is the difference between trunc() and as.integer()?
Why is as.integer faster? Can anyone explain a bit what goes on behind the curtain?
Why does trunc() return class double instead of 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 takes a single numeric argument x and returns a numeric vector containing the integers formed by truncating the values in x toward 0."
help(as.integer):
"Non-integral numeric values are truncated towards zero (i.e., as.integer(x) equals trunc(x) there), [...]"
Background: I'm writing functions to translate between different time/date representation, such as 120403 (hhmmss) -> 43443 (seconds since 00:00:00) Performance is all that matters.
Note: this question has nothing to do with floating point arithmetic
SessionInfo: R version 3.3.2, Windows 7 x64
On the technical side, these functions have different goals.
The trunc function removes the fractional part of numbers.
The as.integer function converts the input values into 32-bit integers.
Thus as.integer would overflow on large numbers (over 2^31):
x = 9876543210.5
sprintf("%15f", x)
# [1] "9876543210.500000"
sprintf("%15f", trunc(x))
# [1] "9876543210.000000"
as.integer(x)
# [1] NA
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With