Puedo usar read.csv o read.csv2 para leer datos en R. Pero el problema que encontré es que mi separador es una cadena de múltiples bytes en lugar de un solo carácter. ¿Cómo puedo lidiar con esto?¿Cómo leer un archivo de texto en GNU R con un separador de múltiples bytes?
Respuesta
Proporcionar datos de ejemplo ayudaría. Sin embargo, es posible que pueda adaptar lo siguiente a sus necesidades.
creé un ejemplo de archivo de datos, que es un simplemente un archivo de texto que contiene lo siguiente:
1sep2sep3
1sep2sep3
1sep2sep3
1sep2sep3
1sep2sep3
1sep2sep3
1sep2sep3
Me guardé como 'test.csv'. El carácter de separación es la cadena 'sep'. Creo que read.csv()
usa scan()
, que solo acepta un solo carácter para sep
. Para conseguir alrededor de él, tenga en cuenta lo siguiente:
dat <- readLines('test.csv')
dat <- gsub("sep", " ", dat)
dat <- textConnection(dat)
dat <- read.table(dat)
readLines()
simplemente lee las líneas de gsub
sustituye la cadena de separación de múltiples caracteres para un único ' '
, o lo que es conveniente para sus datos.. Luego, textConnection()
y read.data()
lo lee todo cómodamente. Para conjuntos de datos más pequeños, esto debería estar bien. Si tiene datos muy grandes, considere preprocesar con algo como AWK para sustituir la cadena de separación de caracteres múltiples. Lo anterior es de http://tolstoy.newcastle.edu.au/R/e4/help/08/04/9296.html.
actualización En cuanto a su comentario, si tiene espacios en sus datos, utilizar un separador de sustitución diferente. Considere cambiar a test.csv
:
1sep2 2sep3
1sep2 2sep3
1sep2 2sep3
1sep2 2sep3
1sep2 2sep3
1sep2 2sep3
1sep2 2sep3
Entonces, con la siguiente función:
readMulti <- function(x, sep, replace, as.is = T)
{
dat <- readLines(x)
dat <- gsub(sep, replace, dat)
dat <- textConnection(dat)
dat <- read.table(dat, sep = replace, as.is = as.is)
return(dat)
}
Probar:
readMulti('test.csv', sep = "sep", replace = "\t", as.is = T)
Aquí, vuelva a colocar el separador original con pestañas (\t
). El as.is
se pasa al read.table()
para evitar que las cadenas que se leen sean factores, pero esa es su decisión. Si usted tiene un espacio en blanco más complicado dentro de sus datos, es posible encontrar el argumento quote
en read.table()
útiles, o pre-proceso con AWK, Perl, etc.
Algo similar con crippledlambda de strsplit()
más probable es equivalente para los datos de tamaño moderado. Si el rendimiento se convierte en un problema, pruebe ambos y vea cuál funciona para usted.
read.table recibirá el mismo mensaje de error.La sugerencia de jthetzel suena como buena. En realidad, aprovecho awk para procesar los datos en bruto antes de leerlos en R. Pero la pregunta aquí es cómo podemos tratar con el personaje en el nuevo carácter de separación después de gsub (Digamos que tenemos un ' 'dentro del valor en su código de muestra). – RobinMin
@RobinMin Pruebe con un separador de repuesto diferente por actualización anterior. – jthetzel
En este caso puede reemplazar textConnection(txt)
con su nombre de archivo, pero esencialmente puede construir un código o función alrededor de strsplit
. Aquí estoy suponiendo que tiene una línea de cabecera, pero se puede dar por supuesto definir un argumento header
y generalizar la creación de su trama de datos en base a la siguiente función:
> read.multisep <- function(File,sep) {
+ Lines <- readLines(File)
+ Matrix <- do.call(rbind,strsplit(Lines,sep,fixed=TRUE))
+ DataFrame <- structure(data.frame(Matrix[-1,]),names=Matrix[1,]) ## assuming header is present
+ DataFrame[] <- lapply(DataFrame,type.convert) ## automatically convert modes
+ DataFrame
+ }
>
> example <- "a#*&b#*&c
+ 1#*&2#*&3
+ 4#*&5#*&6"
>
> read.multisep(textConnection(example),sep="#*&")
a b c
1 1 2 3
2 4 5 6
read.multisep funciona bien para mí ~! Gracias @jthetzel – RobinMin
- 1. ¿Cómo leer todo el texto de un archivo de bytes []?
- 2. Leer un archivo de texto con php
- 3. C# - Leer bytes específicos de un archivo
- 4. jquery - ¿Leer un archivo de texto?
- 5. ¿Cómo leer un archivo de texto en crecimiento en C++?
- 6. VB.NET Leer Cierto texto en un archivo de texto
- 7. ¿Cómo leer el archivo .arff con R?
- 8. cómo leer un archivo de texto en ios
- 9. leyendo un archivo de texto en R línea por línea
- 10. ¿Cómo puedo leer un archivo de texto sin bloquearlo?
- 11. Python: Cómo leer un gran archivo de texto en la memoria
- 12. Cómo leer un archivo dentro de un Jar con JRuby
- 13. C# - Leer en un archivo de texto grande (150 MB) en un cuadro de texto enriquecido
- 14. ¿Cómo leer bits de un archivo?
- 15. leer un archivo binario (pitón)
- 16. Leer y escribir bytes desde un archivo (C++)
- 17. ¿Cómo leer un archivo y escribir en un archivo de texto?
- 18. Leer un archivo de texto línea por línea en Qt
- 19. ¿Puede Fortran leer los bytes directamente desde un archivo binario?
- 20. GNU Make: cómo unir la lista y separarla con separador?
- 21. Cómo leer los bytes de un socket en Haskell
- 22. procesamiento de un archivo CSV con headen con gnu paralelo
- 23. py3k: ¿Cómo se lee un archivo dentro de un archivo zip como texto, no como bytes?
- 24. Escribir lista en un archivo de texto, conservar nombres, R
- 25. ¿Cómo puedo leer un archivo con Ruby?
- 26. Leer valores int desde un archivo de texto en C
- 27. ¿Cómo leer un archivo XML con Java?
- 28. Leer en filas específicas, coincidentes con patrones de un archivo
- 29. Leer archivo de texto en Delphi 2009
- 30. Cómo leer un archivo abierto en Ruby
¿Cuál es su cadena de bytes múltiples? – jthetzel
Creo que si nos fijamos en los argumentos read.table() y sep más generales, puede usar una cadena de múltiples bytes. – mweylandt
@mweylandt Creo que 'read.table()' 's' sep' solo acepta bytes individuales (lo mismo para 'scan()'). – jthetzel