Преобразование строки валюты в число в R - PullRequest
0 голосов
/ 01 ноября 2018

Уважаемое сообщество StackOverflow, Сейчас я работаю над тем, как преобразовать вектор данных валюты, хранящихся в виде символа, в числовой вектор с возможностью преобразования валюты в другую валюту.

Итак, представьте, что мой вектор:

x <- c("$5M", "€10B", "CHF5K")

и я хотел бы перевести его в миллиард долларов США, поэтому результат должен быть (с учетом случайных курсов валют):

x <- c(5,11000,0.4)

Я разработал решение для этого с созданием двух функций, моя первая функция удаляет тысячи, миллиарды и миллионы символов и преобразует его:

convMK <- function(cats){
for(i in 1:length(cats)){
  if(grepl("M",cats[i])==TRUE){
    cats[i] <- gsub("M","",cats[i])
  } else if(grepl("K",cats[i])==TRUE){
    temp <- "0."
    cats[i] <- gsub("K","",cats[i])
    cats[i] <-paste0(temp,cats[i])
  } else if(grepl("B",cats[i])==TRUE){
    temp <- "00"
    cats[i] <- gsub("B","",cats[i])
    cats[i] <-paste0(cats[i],temp)
    cats[i] <- gsub("\\.","",cats[i])
  } else{}
}
  return(cats)
}

Второй преобразует его в числовое с учетом обменных курсов:

convCurr2 <- function(cats) {
  catsNum <- c(0)
  for (i in 1:length(cats)) {
    if (grepl("\\$", cats[i]) == TRUE) {
      cats[i] <- gsub("\\$", "", cats[i])
      catsNum[i] <- as.numeric(cats[i])
      catsNum[i] <- catsNum[i] * exUSD
    } else if (grepl("\\€", cats[i]) == TRUE) {
      cats[i] <- gsub("\\€", "", cats[i])
      catsNum[i] <- as.numeric(cats[i])
      catsNum[i] <- catsNum[i] * exEUR
    } else if (grepl("CA", cats[i]) == TRUE) {
      cats[i] <- gsub("CA", "", cats[i])
      catsNum[i] <- as.numeric(cats[i])
      catsNum[i] <- catsNum[i] * exCA
    } else if (grepl("\\£", cats[i]) == TRUE) {
      cats[i] <- gsub("£", "", cats[i])
      catsNum[i] <- as.numeric(cats[i])
      catsNum[i] <- catsNum[i] * exGBP
    } else if (grepl("\\CHF", cats[i]) == TRUE) {
      cats[i] <- gsub("CHF", "", cats[i])
      catsNum[i] <- as.numeric(cats[i])
      catsNum[i] <- catsNum[i] * exCHF
    }
  }
  return(catsNum)
}

И тогда я запускаю функции в следующем порядке:

cats<-convMK(cats)
cats <- convCurr2(cats)

Мой вопрос сейчас таков: не существует ли более простого и короткого пути? Потому что это кажется слишком сложным! Тем более, что я до сих пор не реализовал решение проблемы, эта функция также должна искать правильный обменный курс к определенной дате.

Мне очень любопытны ваши ответы, я начал изучать R только неделю назад, и, будучи студентом по маркетингу, у меня не так много опыта программирования (имеется в виду: нет). Таким образом, я стремлюсь научиться писать более элегантный код:)

1 Ответ

0 голосов
/ 02 ноября 2018

Просто векторизовать его, я думаю, петли не нужны.

multiplier <- recode(gsub('.*([[:alpha:]]+)$', '\\1', x),
                     K = 1e3,
                     M = 1e6,
                     B = 1e9,
                     .default = NA_real_)
multiplier
# [1] 1e+06 1e+09 1e+03

Это БМК-подобные юниты. По умолчанию NA, так как все остальное говорит о том, что у вас нет того, что вы должны иметь.

currency <- gsub('^([^-0-9.]*)[-0-9.].*', '\\1', x)
currency
# [1] "$"   " "   "CHF"

Пробел в том, как он представлен ... может потребоваться больше работы для работы с юникодом.

xnum <- as.numeric(gsub('[^-0-9.]', '', x))
xnum
# [1]  5 10  5

Это дает вам «1с», а не миллионы:

xnum * multiplier # all in "1" units
# [1] 5e+06 1e+10 5e+03

, что достаточно легко исправить в зависимости от того, что вы хотите, когда вычисляете / распечатываете вывод:

xnum * multiplier / 1e6
# [1] 5e+00 1e+04 5e-03

На данный момент все, что вам нужно, это конвертация в доллары США. Вы должны быть в состоянии сделать что-то вроде recode(currency, ...), как я сделал с multiplier, а затем просто умножить xnum на этот коэффициент преобразования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...