2011-09-07 28 views
8

Estoy tratando de leer en 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.Leer el archivo csv en R con la columna de moneda como numérico

he usado un simple comando de lectura para importar el archivo inicialmente:

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

y luego trató de convertir el CTRIB_AMT de la moneda a numérico:

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

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

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

+1

Un pequeño ejemplo del contenido del archivo sería útil. –

+0

La conversión 'sub' ->' as.character' -> 'as.numeric' debería ser la solución. ¿A qué te refieres con "no funcionó"? –

+1

Funciona para mí. 'CTRIB_AMT <- factor (c (" $ 5000 "," $ 2500 "," $ 100 ")); as.numeric (como.caracter (sub ("$", "", CTRIB_AMT, fixed = TRUE))) ' –

Respuesta

14

No estoy seguro de cómo leerlo en forma directa, pero puede modificar 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 faltante en su submarino. $ indica el final de una línea en expresiones regulares. \ $ es un signo de dólar. Pero luego tienes que escapar del escape ...

+0

Inicialmente pensé que también faltaba un escape, pero' fixed = TRUE' se encarga de eso ... –

+0

¿Quizás Tchaymore olvidó hacer la tarea? – Zach

+8

+1 También encontré 'gsub (" [$,] "," ",' ... Útil para figuras como '" $ 1,234 "'. –

2

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

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

4

Sin embargo, 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) 
Cuestiones relacionadas