把数字转成字符串很简单,很多时候甚至不需要显式调用转换函数。但当你需要精细控制输出格式时,就会发现 as.character() 力不从心,而 sprintf() 才是正解。下面我用几个实际场景来演示。
场景一:始终显示两位小数
比如,一份报告里的投资收益率显示为 1%,人们自然会问:实际数字到底是 1.00% 还是 1.xx%?这时 sprintf("%0.2f", x) 就派上用场了。
as.character(c(0.1, 1.0))
# [1] "0.1" "1"
sprintf("%0.2f", c(0.1, 1.0))
# [1] "0.10" "1.00"
sprintf("%0.2f%%", c(0.001, 0.01) * 100) # 用双 `%` 来转义百分号,更实用
# [1] "0.10%" "1.00%"
场景二:将整数显示为 000000 的形式
比如,你需要把一些整数转成中国A股的股票代码。使用 sprintf("%06d", x) 即可。
as.character(0:3)
#> [1] "0" "1" "2" "3"
sprintf("%06d", 0:3)
#> [1] "000000" "000001" "000002" "000003"
场景三:不想让大数字显示为科学计数法
使用 sprintf("%d") 或 sprintf("%.0f")。
x <- c(1e+05, 1e+06, 1e+07)
as.character(x)
#> [1] "1e+05" "1e+06" "1e+07"
sprintf("%d", x)
#> [1] "100000" "1000000" "10000000"
sprintf("%.0f", x)
#> [1] "100000" "1000000" "10000000"
sprintf("%s", x) # 原因见下文解释
#> [1] "1e+05" "1e+06" "1e+07"
这里的字母 s 表示字符串类型。sprintf("%s", 1e5) 之所以能运行,是因为 R 会在将参数传给底层 C 函数 sprintf() 之前,先把数字 1e5 静默转换为字符串 "1e5"。所以 sprintf("%s", x) 本质上等同于 as.character(x)。
sprintf() 功能很强大,虽然学起来可能有点绕。更多信息请参见 help("sprintf")。
更新 如果你需要输出类似 1,900.00 这样带千分位的数字,可以试试 prettyNum() 或 format()。