Прочтите файл csv в R со столбцом валюты как числовой

Я пытаюсь прочитать R-файл csv, содержащий информацию о политических взносах. Из того, что я понимаю, столбцы по умолчанию импортируются как факторы, но мне нужно, чтобы столбец количества (‘CTRIB_AMT’ в наборе данных) был импортирован как числовой столбец, поэтому я могу выполнять различные функции, которые не будут работать факторы. Столбец форматируется как валюта с префиксом «$».

Я использовал простую команду чтения для первоначального импорта файла:

contribs <- read.csv('path/to/file') 

И затем попытался преобразовать CTRIB_AMT из валюты в числовой:

 as.numeric(as.character(sub("$","",contribs$CTRIB_AMT, fixed=TRUE))) 

Но это не сработало. Функции, которые я пытаюсь использовать для столбцов CTRIB_AMT:

 vals<-sort(unique(dfr$CTRIB_AMT)) sums<-tapply( dfr$CTRIB_AMT, dfr$CTRIB_AMT, sum) counts<-tapply( dfr$CTRIB_AMT, dfr$CTRIB_AMT, length) 

См. Соответствующий вопрос здесь .

Любые мысли о том, как импортировать файл изначально, чтобы столбец был числовым или как его преобразовать после импорта?

Я не уверен, как читать его напрямую, но вы можете изменить его, когда он находится:

 > A <- read.csv("~/Desktop/data.csv") > A id desc price 1 0 apple $1.00 2 1 banana $2.25 3 2 grapes $1.97 > A$price <- as.numeric(sub("\\$","", A$price)) > A id desc price 1 0 apple 1.00 2 1 banana 2.25 3 2 grapes 1.97 > str(A) 'data.frame': 3 obs. of 3 variables: $ id : int 0 1 2 $ desc : Factor w/ 3 levels "apple","banana",..: 1 2 3 $ price: num 1 2.25 1.97 

Я думаю, что это может быть просто пропавший побег в вашем подразделении. $ указывает конец строки в регулярных выражениях. \ $ – знак доллара. Но тогда вам нужно избежать побега …

Другой способ – установить преобразование с помощью setAs .
Он использовался в двух (похожих) вопросах:

  • Обработка отрицательного числа в формате «учета»
  • Как читать файл csv, где некоторые номера содержат запятые?

Для ваших нужд:

 setClass("Currency") setAs("character", "Currency", function(from) as.numeric(sub("$","",from, fixed=TRUE))) contribs <- read.csv("path/to/file", colClasses=c(CTRIB_AMT="Currency")) 

Еще одно решение проблемы, решенное давно:

 convertCurrency <- function(currency) { currency1 <- sub('$','',as.character(currency),fixed=TRUE) currency2 <- as.numeric(gsub('\\,','',as.character(currency1))) currency2 } contribs$CTRIB_AMT_NUM <- convertCurrency(contribs$CTRIB_AMT) 

Или используйте что-то вроде as.numeric(substr(as.character(contribs$CTRIB_AMT),2,20)) мы знаем, что не должно быть больше 20 символов.

Еще одна вещь, которую следует отметить, заключается в том, что вы можете удалить необходимость конвертировать из фактора alltogether, если вы установили stringsAsFactors=F в свой вызов read.csv()

Воспользовавшись мощными анализаторами, пакет 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) name <- c('john','carl', 'hank') salary <- c('$23,456.33','$45,677.43','$76,234.88') emp_data <- data.frame(name,salary) 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 
  • multithreading с R?
  • Евклидово расстояние двух векторов
  • R: Маскированные функции
  • Как определить, есть ли у вас интернет-соединение в R
  • Как передать аргументы командной строки, когда source () R-файл
  • Возвращаемый индекс наименьшего значения в векторе?
  • Заменить значения NA по строкам
  • Разница между `% in%` и `==`
  • Добавление текста в таблицу grid.table
  • Добавить переменную в кадр данных, содержащий максимальное значение каждой строки
  • Манекены переменных из строковой переменной
  • Давайте будем гением компьютера.