R - определить, какие столбцы содержат данные валюты $

У меня есть очень большой набор данных с некоторыми столбцами, отформатированными как валюта, некоторые числовые, некоторые символы. При чтении данных все валютные столбцы определяются как фактор, и мне нужно преобразовать их в числовые. Набор данных слишком широкий, чтобы вручную определить столбцы. Я пытаюсь найти программный способ определить, содержит ли столбец валютные данные (например, начинается с '$'), а затем передать этот список столбцов, которые необходимо очистить.

name <- c('john','carl', 'hank')
salary <- c('$23,456.33','$45,677.43','$76,234.88')
emp_data <- data.frame(name,salary)

clean <- function(ttt){
as.numeric(gsub('[^a-zA-z0-9.]','', ttt))
}
sapply(emp_data, clean)

Проблема в этом примере заключается в том, что этот метод работает на всех столбцах, в результате чего столбец имени заменяется на NA. Мне нужен способ программно идентифицировать только столбцы, к которым должна применяться чистая функция.. в этом примере зарплата.

3 ответа

Решение

С помощью dplyr а также stringr пакеты, вы можете использовать mutate_if чтобы определить столбцы, которые имеют любую строку, начинающуюся с $ и затем измените соответственно.

library(dplyr)
library(stringr)

emp_data %>%
  mutate_if(~any(str_detect(., '^\\$'), na.rm = TRUE),
            ~as.numeric(str_replace_all(., '[$,]', '')))

Используя мощные парсеры readr Пакетные предложения из коробки:

my_parser <- function(col) {
  # Try first with parse_number that handles currencies automatically quite well
  res <- suppressWarnings(readr::parse_number(col))
  if (is.null(attr(res, "problems", exact = TRUE))) {
    res
  } else {
    # If parse_number fails, fall back on parse_guess
    readr::parse_guess(col)
    # Alternatively, we could simply return col without further parsing attempt
  }
}

library(dplyr)

emp_data %>% 
  mutate(foo = "USD13.4",
         bar = "£37") %>% 
  mutate_all(my_parser)

#   name   salary  foo bar
# 1 john 23456.33 13.4  37
# 2 carl 45677.43 13.4  37
# 3 hank 76234.88 13.4  37

Основной вариант R заключается в использовании startsWith обнаружить столбцы доллара, и gsub удалять "$" а также "," из колонн.

doll_cols <- sapply(emp_data, function(x) any(startsWith(as.character(x), '$')))
emp_data[doll_cols] <- lapply(emp_data[doll_cols], 
                              function(x) as.numeric(gsub('\\$|,', '', x)))
Другие вопросы по тегам