您可以使用正则表达式:
as.integer(sub("0*$", "", test))
# [1] 3745 22704
而且,这里是一个有趣的一个使用递归:
remove_zeroes <- function(x) {
x <- as.integer(x)
i <- x %% 10L == 0
if (any(i)) {
x[i] <- x[i]/10L
Recall(x)
} else x
}
remove_zeroes(c(123, 1230, 1230000))
# [1] 123 123 123
基准:
test <- sample.int(1e5)
library(microbenchmark)
microbenchmark(
as.integer(sub("0*$", "", test)),
as.integer(sub("0+$", "", test)),
remove_zeroes(test))
# Unit: milliseconds
# expr min lq median uq max neval
# as.integer(sub("0*$", "", test)) 134.51669 138.91855 141.28812 145.96486 170.93705 100
# as.integer(sub("0+$", "", test)) 113.91206 118.83564 123.42199 126.44162 179.03642 100
# remove_zeroes(test) 38.01125 47.45385 49.79928 54.87592 89.05354 100
有趣的是,在我写完答案后,我想到了确切的事情,但没有做出改变......这确实有点快。谢谢。 – flodel 2014-09-28 10:43:53