我有一个来自REGIS的数据表,该数据表在随机列中包括用“ $ 1.11 M”(例如)汇总的数值,而不是数字1,110,000.00。在这些随机列中,它可能显示为“ M”或“ B”或“ K”(代表百万,十亿或千)。
我正在尝试找出一个代码,该代码将查找并删除“ $”和“ M”,然后将数字乘以1,000,000(或任何美元金额)。
我尝试使用lapply
,if_else
,Gsub
...,但是我不知道如何只对字符“ $”的单元格进行这些更改和“ M”(或“ B”,“ K”)
到目前为止,我有:
df1$1<-sapply(gsubfn("[A-Z]", list(K = "*1000", M = "*1e6", B = "*1e9"),
sub("$", "",df1$1, fixed = TRUE)), function(x) eval(parse(text = x)))
问题是我正在寻找一种方法来使此代码一次覆盖我的所有列。.而不是特定列。
我希望将“ $ 1.65 K”更改为1,650.00或“ 3.96 M”更改为3,960,000.00
答案 0 :(得分:0)
我们可以使用gsubfn
来通过传递键/值list
来用乘数字符串替换'M','K'值,然后eval
对字符串进行u化并进行更改从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)))))
OP提出了更多的模式。为此,我们可以做到
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)