在R中将数字转换为字符的最快方法

时间:2015-02-11 05:10:14

标签: r

我需要将数字向量转换为R中的字符。我知道,有不同的方法(见下文)。

似乎最快的方法是sprintf和gettextf。

set.seed(1)
a <- round(runif(100000), 2)
system.time(b1 <- as.character(a))
   user  system elapsed 
  0.108   0.000   0.105 
system.time(b2 <- formatC(a))
   user  system elapsed 
  0.052   0.000   0.052 
system.time(b3 <- sprintf('%.2f', a))
   user  system elapsed 
  0.044   0.000   0.046 
system.time(b4 <- gettextf('%.2f', a))
   user  system elapsed 
  0.048   0.000   0.046 
system.time(b5 <- paste0('', a))
   user  system elapsed 
  0.124   0.000   0.129 

还有其他方法可以将数字转换为R中的字符吗?感谢您的任何建议。

3 个答案:

答案 0 :(得分:9)

实际上似乎formatC更快出现了:

library(microbenchmark)
a <- round(runif(100000), 2)
microbenchmark(
  as.character(a), 
  formatC(a), 
  format(a), 
  sprintf('%.2f', a), 
  gettextf('%.2f', a), 
  paste0('', a)
)

输出:

Unit: milliseconds
                expr      min       lq     mean   median       uq       max neval
     as.character(a) 69.58868 70.74803 71.98464 71.41442 72.92168  82.21936   100
          formatC(a) 33.35502 36.29623 38.83611 37.60454 39.27079  72.92176   100
           format(a) 55.98344 56.78744 58.00442 57.64804 58.83614  66.15601   100
  sprintf("%.2f", a) 46.54285 47.40126 48.53067 48.10791 49.12717  65.26819   100
 gettextf("%.2f", a) 46.74888 47.81214 49.23166 48.60025 49.16692  84.90208   100
       paste0("", a) 86.62459 88.67753 90.80720 89.86829 91.33774 125.51421   100

我的sessionInfo

R version 3.1.0 (2014-04-10)
Platform: x86_64-apple-darwin13.1.0 (64-bit)

locale:
[1] en_AU.UTF-8/en_AU.UTF-8/en_AU.UTF-8/C/en_AU.UTF-8/en_AU.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] microbenchmark_1.4-2

loaded via a namespace (and not attached):
 [1] colorspace_1.2-4 digest_0.6.4     ggplot2_1.0.0    grid_3.1.0       gtable_0.1.2     MASS_7.3-35     
 [7] munsell_0.4.2    plyr_1.8.1       proto_0.3-10     Rcpp_0.11.3      reshape2_1.4     scales_0.2.4    
[13] stringr_0.6.2    tools_3.1.0    

答案 1 :(得分:6)

由于您已将a舍入为有限精度,请将唯一值转换一次,然后查看这些

f0 = formatC
f1 = function(x) { ux = unique(x); formatC(ux)[match(x, ux)] }

这给出了相同的结果

> identical(f0(a), f1(a))
[1] TRUE

并且至少对于样本数据集更快。

> microbenchmark(f0(a), f1(a))
Unit: milliseconds
  expr      min       lq     mean   median       uq      max neval
 f0(a) 46.05171 46.89991 47.33683 47.42225 47.58196 52.43244   100
 f1(a) 10.97090 11.39974 11.48993 11.52598 11.58505 11.90506   100

(虽然这种效率在R中确实相关吗?)

答案 2 :(得分:4)

我能想到的其他三种方法,其中没有一种方法与gettextf一样快

storage.mode(a) <- "character"
mode(a) <- "character"
as.vector(a, "character")

最后一个基本上是as.character.default,绕过了方法调度。所有这些的计时与paste(a)

大致相同