2014-11-26 28 views
5

Se ho un frame di dati:Conversione dot a virgola numerico

a b 
2.4 4.6 
3.6 66.7 
5.8 44.6 

Sia a che b sono numerici.

Voglio convertire "." a "" con

df$a <- as.numeric(gsub(".", ",", df$a)) 

ma ottengo sempre

Warning message:NAs introduced by coercion 

e tutti i valori sono convertiti in NA. Perché?

+0

Vuoi dire che vuoi ancora valori numerici, ma vuoi che il '.' sia', '? –

+0

Esattamente. È possibile? –

+0

Finlandese (Finlandia). E il separatore decimale è una virgola. –

risposta

14

L'idea iniziale era quasi corretta, solo l'espressione regolare era sbagliata, perché . corrisponde a qualsiasi simbolo. Hai bisogno di qualcosa di simile (questo convertirà vettore numerico a un vettore di carattere)

df$a <- gsub("\\.", ",", df$a) 

Inoltre è possibile cambiare l'output di stampa R, tracciando e le azioni della funzione as.character. Si cambia dalla sua default con:

options(OutDec= ",")

E un'altra opzione è utilizzata format funzione.

format(df, decimal.mark=",") 

presumo che si cura di come i numeri sono stampati (output), in quanto internamente numerico viene memorizzato come un numero in virgola mobile a doppia precisione (Aggiornamento grazie al commento di @digemall). Inoltre, a meno che per alcune funzioni come read.table sia specificatamente specificato che il separatore decimale sia ,, non è possibile fare diversamente, poiché per impostazione predefinita , viene utilizzato per separare gli argomenti della funzione.

E NA vengono introdotti esattamente per tale motivo (oltre alla regex errata).

df$a <- as.numeric(gsub("\\.", ",", df$a)) 

Per impostazione predefinita parser non sa che , è usato come separatore decimale.

+1

Sembra che la parte 'options' sia sicuramente ciò di cui l'OP ha bisogno. –

+0

Converte "." a ",". Buona! Il fatto è che quello che sto cercando di ottenere è esportare un grande file di coordinate geografiche. Il programma che gestisce le coordinate non li riconosce come tali se sono in formato carattere. Controllerò in seguito se il programma accetta questa soluzione. –

+0

Se esportate dati con qualcosa come 'write.csv', dovete usarlo con un ulteriore parametro * dec * in questo modo:' write.csv (data, file = file, dec = ",") ' –

2

Se si desidera solo le virgole per la stampa, è possibile utilizzare il formato:

data <- data.frame(a=rnorm(5), b=rnorm(5)) 
format(data, decimal.mark=",") 
       a   b 
1 1,058878354 0,1812629 
2 1,026163906 -0,6666500 
3 1,538423889 -1,4206752 
4 -0,561585916 -0,4729558 
5 -0,004685406 1,0744514 

Tuttavia questo cambierà solo il loro aspetto. Dovrai comunque utilizzare i punti negli assegnamenti.

+1

Se si desidera impostare l'output in modo permanente in questo modo, [guarda questa risposta] (http://stackoverflow.com/questions/16384836/how-to-set-as-decimal-separator-with-r-rstudio). Puoi usare le opzioni '(OutDec =", ")'. – nograpes

+0

Ma questo converte quelli numerici in caratteri, giusto? Avrei bisogno che i valori fossero numerici e con "," –

+1

Ecco la cosa: i computer memorizza i numeri in modi molto diversi da come li sembri. Con questo puoi cambiare il modo in cui R ti presenta i numeri. Saranno numerici, ma una volta stampati sullo schermo avranno quella virgola anziché un punto. Per input sospetto che non sia possibile cambiare punto in virgola. Considera questo 'c (1,2,3,4)'. Ora, come interpreterà se è 1 2 3 e 4 o 1.2 e 3.4? –

1

Sei su OSX o Windows o ...?

Per cambiare la rappresentazione, si vuole guardare al parametro LC_NUMERIC, anche se la documentazione R avverte che la modifica di questa può causare R per operare stranamente (difficile da usare , come decimale quando viene utilizzato anche per definire le liste ...)

> Sys.getlocale("LC_NUMERIC") 
[1] "C" 
> a=c(1.01,2.01) 
> a 
[1] 1.01 2.01 
> Sys.setlocale("LC_NUMERIC", "de_DE") # this is OSX syntax 
> a 
[1] 1,01 2,01 

Potrebbe essere più sicuro solo per vivere con esso!