2014-09-27 78 views
3

假设我有以下矢量从右侧删除零并在数字的左侧添加一些?

test<- c(374500, 2270400) 

首先,我想要得到的去除零,以获得类似:

test2<- c(3745, 22704) 

然后,我要零添加到左侧,以有6位数字。那部分我知道该怎么办:

test3 <- formatC(test2, width = 6, format = "d", flag = "0") 

你能帮我第一步吗?

回答

7

您可以使用正则表达式:

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 
+0

有趣的是,在我写完答案后,我想到了确切的事情,但没有做出改变......这确实有点快。谢谢。 – flodel 2014-09-28 10:43:53

1

迟到了,但这里有一个qdap方法:

test<- c(374500, 2270400) 

library(qdap) 
pad(as.numeric(rm_default(test, pattern="0+$")), 6, sort=FALSE) 

## [1] "003745" "022704"