Pregunta

Estoy tratando de leer en un archivo CSV que contiene información sobre contribuciones políticas. Por lo que entiendo, las columnas de forma predeterminada se importan como factores, pero necesito la columna de cantidad ('ctrib_amt' en el conjunto de datos) para importarse 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.

Utilicé 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érica:

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

Pero eso no funcionó. Las funciones que estoy tratando de 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)

Ver pregunta relacionada aquí.

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

¿Fue útil?

Solución

No estoy seguro de cómo leerlo directamente, pero puede 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 sub. $ indica el final de una línea en expresiones regulares. $ es un signo de dólar. Pero entonces tienes que escapar del escape ...

Otros consejos

Otra forma podría ser establecer la conversión usando setAs.
Se usó en dos (similar) pregunta:

Para tus 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 más 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)

Aprovechando los poderosos analizadores el readr ofertas de paquete fuera 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

O usar 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 de todo si se establece stringsAsFactors=F en tu llamada a read.csv()

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top