And*_*rie 11 r number-formatting
在上一个问题中,我询问基本R中是否存在方便的包装器以将数字格式化为百分比.
这引起了三个回应:
sprintf
,可以高度灵活地格式化数字.不过,在我看来,这个sprintf
函数对于R初学者来说只是有点过于模糊(除非它们来自C背景).也许更好的解决方案是修改format
或prettyNum
添加前缀和后缀的选项,这样您就可以轻松创建百分比,货币,度数等.
题:
您将如何设计一个函数,类或一组函数来优雅地处理格式数字作为百分比,货币,度数等?
Rei*_*son 10
我可能会把事情弄得很简单.format()
通常对大多数基本的格式化需求很有用.我会用一个允许任意prefix
和suffix
字符串的简单包装来扩展它.这是一个简单的版本:
formatVal <- function(x, prefix = "", suffix = "", sep = "", collapse = NULL,
...) {
x <- format(x, ...)
x <- paste(prefix, x, suffix, sep = sep, collapse = collapse)
x
}
Run Code Online (Sandbox Code Playgroud)
如果我真的这样做,我可能不会collapse
在定义中有这个参数formatVal()
,而是处理它...
,但为了说明我保持上述功能简单.
使用:
set.seed(1)
m <- runif(5)
Run Code Online (Sandbox Code Playgroud)
一些简单的用法示例
> formatVal(m*100, suffix = "%")
[1] "26.55087%" "37.21239%" "57.28534%" "90.82078%" "20.16819%"
> formatVal(m*100, suffix = "%", digits = 2)
[1] "27%" "37%" "57%" "91%" "20%"
> formatVal(m*100, suffix = "%", digits = 2, nsmall = 2)
[1] "26.55%" "37.21%" "57.29%" "90.82%" "20.17%"
> formatVal(m, prefix = "£")
[1] "£0.2655087" "£0.3721239" "£0.5728534" "£0.9082078" "£0.2016819"
> formatVal(m, prefix = "£", digits = 1)
[1] "£0.3" "£0.4" "£0.6" "£0.9" "£0.2"
> formatVal(m, prefix = "£", digits = 1, nsmall = 2)
[1] "£0.27" "£0.37" "£0.57" "£0.91" "£0.20"
Run Code Online (Sandbox Code Playgroud)
print.formatted <- function(x)
{
print(paste(attr(x,"prefix"), sprintf(x*attr(x,"scaleFactor"),fmt=paste("%.",attr(x,"precision"),"f",sep="")), attr(x,"suffix"), sep=""))
}
as.percent <- function(x,precision=3)
{
class(x) <- c(class(x),"formatted")
attr(x,"scaleFactor")<-100
attr(x,"prefix")<-""
attr(x,"suffix")<-"%"
attr(x,"precision")<-precision
return(x)
}
as.currency <- function(x,prefix="£")
{
class(x) <- c(class(x),"formatted")
attr(x,"scaleFactor")<-1
attr(x,"prefix")<-prefix
attr(x,"suffix")<-""
attr(x,"precision")<-2
return(x)
}
as.percent(runif(3))
[1] "21.585%" "12.396%" "37.744%"
x <- as.currency(rnorm(3,500,100))
x
[1] "£381.93" "£339.49" "£521.74"
2*x
[1] "£763.86" "£678.98" "£1043.48"
Run Code Online (Sandbox Code Playgroud)