2011-09-07 10 views
8

Próbuję odczytać plik Rsv csv, który zawiera informacje na temat datków na cele polityczne. Z tego, co rozumiem, domyślnie kolumny są importowane jako czynniki, ale potrzebuję kolumny wartości ("CTRIB_AMT" w zestawie danych) do zaimportowania jako kolumny liczbowej, aby można było uruchomić wiele funkcji, które nie działałyby dla czynniki. Kolumna jest sformatowana jako waluta z prefiksem "$".Przeczytaj plik csv w R z kolumną waluty jako numeryczną

użyłem prostego polecenia odczytu, aby zaimportować plik początkowo:

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

A potem próbował przekształcić CTRIB_AMT od waluty numeryczna:

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

Ale to nie działa. Funkcje Próbuję użyć do kolumn CTRIB_AMT są:

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

Zobacz powiązane pytanie here.

Wszelkie uwagi na temat sposobu importowania pliku początkowo, aby kolumna była numeryczna, lub jak ją przekonwertować po zaimportowaniu?

+1

Pomocny może być mały przykład zawartości pliku. –

+0

Konwersja 'sub' ->' as.character' -> 'as.numeric' powinna wystarczyć. Co masz na myśli mówiąc "nie działa"? –

+1

Działa dla mnie. 'CTRIB_AMT <- współczynnik (c (" 5000 $ "," 2500 $ "," 100 $ ")); as.numeric (as.character (sub ("$", "", CTRIB_AMT, poprawiono = TRUE))) ' –

Odpowiedz

14

Nie jestem pewien, jak czytać go bezpośrednio, ale można modyfikować to raz w:

> 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 

Myślę, że to mogła być brakująca ucieczka w twoim podsieci. $ wskazuje koniec linii w wyrażeniach regularnych. \ $ to znak dolara. Ale musisz uciec przed ucieczką ...

+0

Początkowo myślałem, że również brakowało ucieczki, ale' fixed = TRUE' zajmuje się tym .. –

+0

Może zapomniał wykonać zadanie? – Zach

+8

+1 Znalazłem również 'gsub (" [$,] "," ",' ... przydatne dla danych takich jak '" 1.234 $ ". –

2

Lub użyj czegoś w rodzaju as.numeric(substr(as.character(contribs$CTRIB_AMT),2,20)) wiemy, że na pewno nie będzie więcej niż 20 znaków.

Inną rzeczą jest, aby pamiętać, że można usunąć konieczność przekształcenia z współczynniku alltogether jeśli ustawisz stringsAsFactors=F w wywołaniu do read.csv()

4

Jeszcze innym rozwiązaniem problemu rozwiązany dawno temu :

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)