2011-09-07 12 views
8

Sto provando a leggere in un file csv che contiene informazioni sui contributi politici. Da quanto ho capito, le colonne per impostazione predefinita vengono importate come fattori, ma ho bisogno della colonna quantità ('CTRIB_AMT' nel set di dati) da importare come una colonna numerica in modo da poter eseguire una varietà di funzioni che non funzionerebbero per fattori. La colonna è formattata come valuta con un "$" come prefisso.Leggere il file csv in R con la colonna della valuta come numerico

ho usato un semplice comando di lettura per importare il file inizialmente:

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

E poi ha cercato di convertire la CTRIB_AMT da valuta a numerico:

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

Ma che non ha funzionato. Le funzioni che sto cercando di utilizzare per le colonne CTRIB_AMT sono:

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

Vedi domanda relativa here.

Qualche idea su come importare il file inizialmente in modo che la colonna sia numerica o come convertirla dopo l'importazione?

+1

Un piccolo esempio del contenuto del file sarebbe utile. –

+0

La conversione 'sub' ->' as.character' -> 'as.numeric' dovrebbe fare il trucco. Cosa intendi con "non ha funzionato"? –

+1

Funziona per me. 'CTRIB_AMT <- factor (c (" $ 5000 "," $ 2500 "," $ 100 ")); as.numeric (as.character (sub ("$", "", CTRIB_AMT, fixed = TRUE))) ' –

risposta

14

Non sono sicuro di come leggerlo direttamente, ma è possibile modificare una volta che è in:

> 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 

Penso che potrebbe solo essere una fuga mancante nel vostro sub. $ indica la fine di una riga nelle espressioni regolari. \ $ è un segno di dollaro. Ma poi devi sfuggire alla fuga ...

+0

Inizialmente pensavo che ci fosse un'uscita mancante, ma' fixed = TRUE' si occupa di questo .. –

+0

Forse tchaymore ha dimenticato di fare il compito? – Zach

+8

+1 Ho anche trovato 'gsub (" [$,] "," ",'... Utile per figure come '" $ 1,234 "'. –

2

Oppure utilizzare qualcosa come as.numeric(substr(as.character(contribs$CTRIB_AMT),2,20)) sappiamo che non ci saranno sicuramente più di 20 caratteri.

Un'altra cosa da notare è che è possibile rimuovere la necessità di convertire da un fattore alltogether se si imposta stringsAsFactors=F nella chiamata a read.csv()

4

Ancora un'altra soluzione per un problema risolto molto tempo fa :

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