2011-09-24 8 views
9

Come si poteva leggere questo set di dati nel R, il problema è che i numeri sono galleggia e sono come 4,000000059604644E+16 e sono separati da un ,Leggi set di dati in R in cui virgola viene utilizzato per il separatore di campo e punto decimale

4,000000059604644E-16 , 7,999997138977056E-16, 9,000002145767216E-16 
4,999999403953552E-16 , 6,99999988079071E-16 , 0,099999904632568E-16 
9,999997615814208E-16 , 4,30000066757202E-16 , 3,630000114440918E-16 
0,69999933242798E-16 , 0,099999904632568E-16, 55,657576767799999E-16 
3,999999761581424E-16, 1,9900000095367432E-16, 0,199999809265136E-16 

Come caricheresti questo file di set di dati in R quindi ha 3 colonne.

Se faccio

dataset <- read.csv("C:\\data.txt",header=T,row.names=NULL) 

sarebbe tornare 6 colonne invece 3 ...

+3

Non dimenticare di dire alla scimmia di Excel che ti ha inviato questo di non usare lo stesso separatore del loro indicatore di punto decimale quando salva un file CSV. – Spacedman

+0

Sì. Ti dirò – cMinor

risposta

4

potrebbe essere meglio per trasformare che inserire i dati per utilizzare i punti decimali, piuttosto che le virgole, nei numeri in virgola mobile. Un modo che si possa fare è usare sed (sembra che si utilizza Windows, in modo che avrebbe probabilmente bisogno di sed di utilizzare questo approccio):

sed 's/\([0-9]\),\([0-9]\)/\1.\2/g' data.txt > data2.txt 

File data2 assomiglia a questo:

4.000000059604644E-16 , 7.999997138977056E-16, 9.000002145767216E-16 
4.999999403953552E-16 , 6.99999988079071E-16 , 0.099999904632568E-16 
9.999997615814208E-16 , 4.30000066757202E-16 , 3.630000114440918E-16 
0.69999933242798E-16 , 0.099999904632568E-16, 55.657576767799999E-16 
3.999999761581424E-16, 1.9900000095367432E-16, 0.199999809265136E-16 

Poi in R:

dataset <- read.csv("data2.txt",row.names=NULL) 
+0

Potresti, ovviamente, utilizzare uno strumento di ricerca e sostituzione sufficientemente potente per eseguire la trasformazione dei dati. –

0

Non è bello, ma dovrebbe funzionare:

x <- matrix(scan("c:/data.txt", what=character(), sep=","), byrow=TRUE, ncol=6) 
y <- t(apply(x, 1, function(a) { left <- seq(1, length(a), by=2) 
           as.numeric(paste(a[left], a[left+1], sep=".")) 
          })) 
4

Qui è una soluzione tutto R che utilizza tre read.table chiamate. La prima istruzione read.table legge ciascuna riga di dati come 6 campi; la seconda istruzione read.table rimette i campi correttamente insieme e li legge e il terzo afferra i nomi dall'intestazione.

fn <- "data.txt" 

# create a test file 

Lines <- "A , B , C 
4,000000059604644E-16 , 7,999997138977056E-16, 9,000002145767216E-16 
4,999999403953552E-16 , 6,99999988079071E-16 , 0,099999904632568E-16 
9,999997615814208E-16 , 4,30000066757202E-16 , 3,630000114440918E-16 
0,69999933242798E-16 , 0,099999904632568E-16, 55,657576767799999E-16 
3,999999761581424E-16, 1,9900000095367432E-16, 0,199999809265136E-16" 
cat(Lines, "\n", file = fn) 

# now read it back in 

DF0 <- read.table(fn, skip = 1, sep = ",", colClasses = "character") 
DF <- read.table(
    file = textConnection(do.call("sprintf", c("%s.%s %s.%s %s.%s", DF0))), 
    col.names = names(read.csv(fn, nrow = 0)) 
) 

che dà:

> DF 
      A   B   C 
1 4.000000e-16 7.999997e-16 9.000002e-16 
2 4.999999e-16 7.000000e-16 9.999990e-18 
3 9.999998e-16 4.300001e-16 3.630000e-16 
4 6.999993e-17 9.999990e-18 5.565758e-15 
5 4.000000e-16 1.990000e-16 1.999998e-17 

Nota: Il read.csv dichiarazione nella questione implica che ci sia un colpo di testa, ma i dati di esempio non mostra uno. Supponevo che fosse presente un'intestazione, ma in caso contrario rimuovere gli argomenti skip= e col.names=.

Problemi correlati