我需要将数字向量转换为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中的字符吗?感谢您的任何建议。
答案 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)