Lea el archivo csv en R con la columna de moneda como numérico

Intento leer el archivo R a csv que contiene información sobre contribuciones políticas. Por lo que entiendo, las columnas predeterminadas se importan como factores, pero necesito la columna de cantidad (‘CTRIB_AMT’ en el conjunto de datos) para importarla como una columna numérica para poder ejecutar una variedad de funciones que no funcionarían para factores. La columna está formateada como una moneda con un “$” como prefijo.

Usé un comando de lectura simple para importar el archivo inicialmente:

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

Y luego intenté convertir el CTRIB_AMT de moneda a numérico:

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

Pero eso no funcionó. Las funciones que bash usar para las columnas CTRIB_AMT son:

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

Vea la pregunta relacionada aquí .

¿Alguna idea sobre cómo importar el archivo inicialmente para que la columna sea numérica o cómo convertirla después de importarla?

No estoy seguro de cómo leerlo directamente, pero puedes modificarlo una vez que esté en:

 > 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 

Creo que podría haber sido un escape perdido en tu submarino. $ indica el final de una línea en expresiones regulares. \ $ es un signo de dólar. Pero luego tienes que escapar de la fuga …

Otra forma podría ser configurar la conversión usando setAs .
Fue utilizado en dos preguntas (similares):

  • Procesamiento de número negativo en formato “contabilidad”.
  • ¿Cómo leer un archivo csv donde algunos números contienen comas?

Para sus necesidades:

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

Otra solución para un problema resuelto hace mucho tiempo:

 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) 

O use algo como as.numeric(substr(as.character(contribs$CTRIB_AMT),2,20)) sabemos que ciertamente no habrá más de 20 caracteres.

Otra cosa a tener en cuenta es que puede eliminar la necesidad de convertir de un factor alltogether si establece stringsAsFactors=F en su llamada a read.csv()

Aprovechando los potentes analizadores que ofrece el paquete readr de la caja:

 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