Как найти, заменить и умножить в таблице - PullRequest
1 голос
/ 15 мая 2019

У меня есть таблица данных из REGIS, которая включает в случайные столбцы числовые суммы, которые суммируются как «1,11 млн долл. США» (в качестве примера) вместо 1 110 000,00 в виде числа. В этих случайных столбцах он может отображаться как «М», «В» или «К» (для миллионов, миллиардов или тысяч).

Я пытаюсь выяснить код, который найдет и удалит «$» и «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 тыс. Долл. США» на 1 650,00 или «3,96 млн. Долл.» До 3 960 000,00

1 Ответ

0 голосов
/ 15 мая 2019

Мы можем использовать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...