Мы можем использовать gsubfn
, чтобы заменить значения 'M', 'K' на строку множителя, передав ключ / val list
, затем eval
введите строку и измените ее на пользовательский формат с dollar_format
от scales
library(gsubfn)
library(scales)
out <- sapply(gsubfn("[A-Z]", list(K = "*1000", M = "*1e6"),
sub("$", "", str1, fixed = TRUE)), function(x) eval(parse(text = x)))
dollar_format()(out)
#[1] "$1,650" "$3,960,000"
Если нам нужно изменить для всех столбцов
df1[] <-lapply(df1, function(x) dollar_format()(sapply(gsubfn("[A-Z]",
list(K = "*1000", M = "*1e6", B = "*1e9"),
sub("$", "", x, fixed = TRUE)), function(y) eval(parse(text = y)))))
Обновление
ОП придумал еще несколько шаблонов Для этого мы можем сделать
df2[] <- lapply(df2, function(x) {
i1 <- grepl("[KMB]", x) # create index to change only those have KMB
x[i1] <- dollar_format()(
sapply(gsubfn("[A-Z]", list(K = "*1000", M = "*1e6", B = "*1e9"),
sub("$", "", x[i1], fixed = TRUE)),
function(y) eval(parse(text = y))))
x
})
df2
# col1 col2
#1 $1,650 $1,650
#2 $3,960,000 $3,960,000
#3 $-1,650 $-1,650
#4 -950 -950
данные
str1 <- c("$1.65 K" , "3.96 M")
df1 <- data.frame(col1 = str1, col2 = str1, stringsAsFactors = FALSE)
str2 <- c("$1.65 K" , "3.96 M", "-$1.65 K", "-950")
df2 <- data.frame(col1 = str2, col2 = str2, stringsAsFactors = FALSE)