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)))