I have a data frame storing the dollar amount, it looks like this
> a
cost
1 1e+05
2 2e+05
I would like it can be shown as this
> a
cost
1 $100,000
2 $200,000
How to do that in R?
I have a data frame storing the dollar amount, it looks like this
> a
cost
1 1e+05
2 2e+05
I would like it can be shown as this
> a
cost
1 $100,000
2 $200,000
How to do that in R?
DF <- data.frame(cost=c(1e4, 2e5))
#assign a class
oldClass(DF$cost) <- c("money", oldClass(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
This will get you everything except the commas:
> 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"
Getting those is pretty complicated, as shown in these questions:
Luckily, this is implemented in the 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"
You can use the currency()
function from the formattable
package. With OP's example
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
By default, 2 digits after the decimal point are shown. This has been overruled using the digits
parameter to meet OP's expectations.
The benfit of formattable
is that numbers are still numbers even with a format attached, e.g.,
a$cost2 <- 2 * a$cost
a
cost cost2 1 $100,000 $200,000 2 $200,000 $400,000
A very simple way is
library(priceR)
values <- c(1e5, 2e5)
format_dollars(values)
# [1] "$100,000" "$200,000"
format_dollars(values, 2)
i.e.
"$100,000.00" "$200,000.00"
format_currency(values, "€")
which gives "€100,000" "€200,000"
etc