【发布时间】:2014-02-27 13:59:54
【问题描述】:
我有一个存储美元金额的数据框,看起来像这样
> a
cost
1 1e+05
2 2e+05
我希望它可以显示为这样
> a
cost
1 $100,000
2 $200,000
如何在 R 中做到这一点?
【问题讨论】:
-
到目前为止你尝试过什么?
-
创建一个类和一个
print方法。
标签: r
我有一个存储美元金额的数据框,看起来像这样
> a
cost
1 1e+05
2 2e+05
我希望它可以显示为这样
> a
cost
1 $100,000
2 $200,000
如何在 R 中做到这一点?
【问题讨论】:
print 方法。
标签: r
DF <- data.frame(cost=c(1e4, 2e5))
#assign a class
class(DF$cost) <- c("money", class(DF$cost))
#S3 print method for the class
print.money <- function(x, ...) {
print.default(paste0("$", formatC(as.numeric(x), format="f", digits=2, big.mark=",")))
}
#format method, which is necessary for formating in a data.frame
format.money <- function(x, ...) {
paste0("$", formatC(as.numeric(x), format="f", digits=2, big.mark=","))
}
DF
# cost
#1 $10,000.00
#2 $200,000.00
【讨论】:
这将为您提供除逗号之外的所有内容:
> sprintf("$%.2f", seq(100,100000,by=10000)/7)
[1] "$14.29" "$1442.86" "$2871.43" "$4300.00" "$5728.57" "$7157.14" "$8585.71" "$10014.29" "$11442.86" "$12871.43"
得到这些是相当复杂的,如这些问题所示:
幸运的是,这是在scales package 中实现的:
library('scales')
> dollar_format()(c(100, 0.23, 1.456565, 2e3))
## [1] "$100.00" "$0.23" "$1.46" "$2,000.00"
> dollar_format()(c(1:10 * 10))
## [1] "$10" "$20" "$30" "$40" "$50" "$60" "$70" "$80" "$90" "$100"
> dollar(c(100, 0.23, 1.456565, 2e3))
## [1] "$100.00" "$0.23" "$1.46" "$2,000.00"
> dollar(c(1:10 * 10))
## [1] "$10" "$20" "$30" "$40" "$50" "$60" "$70" "$80" "$90" "$100"
> dollar(10^(1:8))
## [1] "$10" "$100" "$1,000" "$10,000" "$100,000" "$1,000,000" "$10,000,000" "$100,000,000"
【讨论】:
您可以使用formattable 包中的currency() 函数。以OP为例
a <- data.frame(cost = c(1e+05, 2e+05))
a
cost 1 1e+05 2 2e+05
library(formattable)
a$cost <- currency(a$cost, digits = 0L)
a
cost 1 $100,000 2 $200,000
默认情况下,显示小数点后 2 位。已使用 digits 参数否决了这一点,以满足 OP 的期望。
formattable 的好处是即使附加格式,数字仍然是数字,例如,
a$cost2 <- 2 * a$cost
a
cost cost2 1 $100,000 $200,000 2 $200,000 $400,000
【讨论】:
一个很简单的方法是
library(priceR)
values <- c(1e5, 2e5)
format_dollars(values)
# [1] "$100,000" "$200,000"
format_dollars(values, 2) 添加小数位,即
"$100,000.00" "$200,000.00"
format_currency(values, "€"),它提供 "€100,000" "€200,000" 等【讨论】: