如何在表中查找,替换和相乘

时间:2019-05-15 14:50:17

标签: r

我有一个来自REGIS的数据表,该数据表在随机列中包括用“ $ 1.11 M”(例如)汇总的数值,而不是数字1,110,000.00。在这些随机列中,它可能显示为“ M”或“ B”或“ K”(代表百万,十亿或千)。

我正在尝试找出一个代码,该代码将查找并删除“ $”和“ M”,然后将数字乘以1,000,000(或任何美元金额)。

我尝试使用lapplyif_elseGsub ...,但是我不知道如何只对字符“ $”的单元格进行这些更改和“ 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

1 个答案:

答案 0 :(得分:0)

我们可以使用gsubfn来通过传递键/值list来用乘数字符串替换'M','K'值,然后eval对字符串进行u化并进行更改从dollar_formatscales自定义格式

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)