2011-09-24 7 views
9

Jak można odczytać ten zestaw danych w R, problem jest że numery są pływa i są jak 4,000000059604644E+16 i są oddzielone ,Czytaj zestawu danych w R, w której przecinek służy do separatora pól i przecinkiem

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 

Jak załadować ten kinf z zestawu danych w R, więc ma 3 kolumny.

Jeśli robię

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

byłoby powrócić 6 kolumn zamiast 3 ...

+3

Nie zapomnij powiedzieć małpce programu Excel, która wysłała ci to, aby nie używać tego samego separatora co ich znacznik dziesiętny podczas zapisywania pliku CSV. – Spacedman

+0

Tak. Powiem – cMinor

Odpowiedz

4

To może być najlepszy do przekształcenia dane wejściowe do używania liczb dziesiętnych zamiast przecinków w liczbach zmiennoprzecinkowych. Jednym ze sposobów można to zrobić jest użycie sed (wygląda jak używasz systemu Windows, więc prawdopodobnie trzeba sed użyć tej metody):

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

Plik data2 wygląda tak:

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 

Następnie w R:

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

Można oczywiście użyć dowolnego wystarczająco potężnego narzędzia do wyszukiwania i zamiany, aby przeprowadzić transformację danych. –

0

To nie jest ładna, ale to powinno działać:

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

Oto rozwiązanie wszystkich R, które wykorzystuje trzy read.table połączeń. Pierwsza instrukcja read.table odczytuje każdy wiersz danych jako 6 pól; drugie zdanie read.table umieszcza pola poprawnie razem i odczytuje je, a trzeci pobiera nazwy z nagłówka.

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

co daje:

> 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 

Uwaga: Oświadczenie w pytaniu read.csv zakłada, że ​​istnieje nagłówek ale dane próbka nie wykazuje jeden. Zakładam, że istnieje nagłówek, ale jeśli nie, usuń argumenty skip= i col.names=.

Powiązane problemy