2011-09-24 11 views
9

¿Cómo puedes leer este conjunto de datos en R, el problema es que los números son flota y son como 4,000000059604644E+16 y están separados por una ,Leer conjunto de datos en I en el que se utiliza una coma para separador de campo y punto decimal

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 

¿Cómo cargaría este kinf de conjunto de datos en R por lo que tiene 3 columnas.

Si hago

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

sería retorno 6 columnas en lugar de 3 ...

+3

No olvide indicarle al mono de Excel que le envió esto que no use el mismo separador que su marcador de punto decimal al guardar un archivo CSV. – Spacedman

+0

Sí. Voy a telll – cMinor

Respuesta

4

podría ser mejor para transformar que ingresen datos para usar puntos decimales, en lugar de comas, en los números de coma flotante. Una forma en que podría hacerlo es usar sed (parece que está utilizando Windows, por lo que es probable que tenga que sed para utilizar este enfoque):

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

Archivo data2 se parece a esto:

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 

Luego, en R:

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

Por supuesto, puede utilizar cualquier herramienta de búsqueda y reemplazo suficientemente potente para hacer la transformación a los datos. –

0

No es bonito, pero debería funcionar:

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

Aquí es una solución todo R que utiliza tres read.table llamadas. La primera instrucción read.table lee cada fila de datos como 6 campos; la segunda declaración read.table vuelve a unir los campos y los lee y el tercero toma los nombres del encabezado.

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

que da:

> 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: La declaración read.csv en la pregunta implica que hay una cabecera, pero los datos de ejemplo no muestra uno. Supuse que hay un encabezado, pero si no, elimine los argumentos skip= y col.names=.

Cuestiones relacionadas