R Language
Lectura y escritura de datos tabulares en archivos de texto plano (CSV, TSV, etc.)
Buscar..
Sintaxis
read.csv (file, header = TRUE, sep = ",", quote = "" ", dec =". ", fill = TRUE, comment.char =" ", ...)
read.csv2 (file, header = TRUE, sep = ";", quote = "" ", dec =", ", fill = TRUE, comment.char =" ", ...)
readr :: read_csv (file, col_names = TRUE, col_types = NULL, locale = default_locale (), na = c ("", "NA"), comment = "", trim_ws = TRUE, skip = 0, n_max = -1 , progreso = interactivo ())
data.table :: fread (input, sep = "auto", sep2 = "auto", nrows = -1L, header = "auto", na.strings = "NA", stringsAsFactors = FALSE, verbose = getOption ("datatable .verbose "), autostart = 1L, skip = 0L, select = NULL, drop = NULL, colClasses = NULL, integer64 = getOption (" datatable.integer64 "), # default:" integer64 "dec = if (sep! =" . ")". "else", ", col.names, check.names = FALSE, encoding =" unknown ", strip.white = TRUE, showProgress = getOption (" datatable.showProgress "), # default: TRUE data. table = getOption ("datatable.fread.datatable") # default: TRUE)
Parámetros
Parámetro | Detalles |
---|---|
expediente | nombre del archivo CSV para leer |
encabezamiento | lógico: ¿el archivo .csv contiene una fila de encabezado con nombres de columna? |
sep | carácter: símbolo que separa las celdas de cada fila |
citar | carácter: símbolo utilizado para citar cadenas de caracteres |
dic | carácter: símbolo utilizado como separador decimal |
llenar | lógico: cuando es VERDADERO, las filas con longitud desigual se rellenan con campos en blanco. |
comentar.char | carácter: carácter utilizado como comentario en el archivo csv. Las líneas precedidas por este carácter son ignoradas. |
... | Argumentos extra que se pasarán a read.table |
Observaciones
Tenga en cuenta que exportar a un formato de texto sin formato sacrifica gran parte de la información codificada en los datos como clases de variables en aras de una gran portabilidad. Para los casos que no requieren tal portabilidad, un formato como .RData o Feather puede ser más útil.
La entrada / salida para otros tipos de archivos se trata en varios otros temas, todos vinculados desde Entrada y salida .
Importando archivos .csv
Importando usando la base R
Los archivos de valores separados por comas (CSV) se pueden importar utilizando read.csv
, que envuelve read.table
, pero usa sep = ","
para establecer el delimitador en una coma.
# get the file path of a CSV included in R's utils package
csv_path <- system.file("misc", "exDIF.csv", package = "utils")
# path will vary based on installation location
csv_path
## [1] "/Library/Frameworks/R.framework/Resources/library/utils/misc/exDIF.csv"
df <- read.csv(csv_path)
df
## Var1 Var2
## 1 2.70 A
## 2 3.14 B
## 3 10.00 A
## 4 -7.00 A
Una opción fácil de usar, file.choose
, permite navegar a través de los directorios:
df <- read.csv(file.choose())
Notas
- A diferencia de
read.table
,read.csv
predeterminada elheader = TRUE
y utiliza la primera fila como nombres de columna. - Todas estas funciones convertirán las cadenas a la clase de
factor
de forma predeterminada a menos queas.is = TRUE
ostringsAsFactors = FALSE
. - La variante
read.csv2
defecto essep = ";"
ydec = ","
para usar en datos de países donde la coma se usa como punto decimal y el punto y coma como separador de campo.
Importando usando paquetes
La función readr
paquete read_csv
ofrece un rendimiento mucho más rápido, una barra de progreso para archivos grandes y opciones predeterminadas más populares que el estándar read.csv
, incluidas las stringsAsFactors = FALSE
.
library(readr)
df <- read_csv(csv_path)
df
## # A tibble: 4 x 2
## Var1 Var2
## <dbl> <chr>
## 1 2.70 A
## 2 3.14 B
## 3 10.00 A
## 4 -7.00 A
Importando con data.table
El paquete data.table
introduce la función fread
. Si bien es similar a read.table
, fread
suele ser más rápido y más flexible, adivinar el delimitador del archivo automáticamente.
# get the file path of a CSV included in R's utils package
csv_path <- system.file("misc", "exDIF.csv", package = "utils")
# path will vary based on R installation location
csv_path
## [1] "/Library/Frameworks/R.framework/Resources/library/utils/misc/exDIF.csv"
dt <- fread(csv_path)
dt
## Var1 Var2
## 1: 2.70 A
## 2: 3.14 B
## 3: 10.00 A
## 4: -7.00 A
Donde input
argumento es una cadena que representa:
- el nombre del archivo ( por ejemplo,
"filename.csv"
), - un comando de shell que actúa sobre un archivo ( por ejemplo,
"grep 'word' filename"
), o - la entrada en sí misma ( por ejemplo,
"input1, input2 \n A, B \n C, D"
).
fread
devuelve un objeto de la clase data.table
que hereda de la clase data.frame
, adecuado para usar con el uso de la data.table de []
. Para devolver un data.frame ordinario, establezca el parámetro data.table
en FALSE
:
df <- fread(csv_path, data.table = FALSE)
class(df)
## [1] "data.frame"
df
## Var1 Var2
## 1 2.70 A
## 2 3.14 B
## 3 10.00 A
## 4 -7.00 A
Notas
-
fread
no tiene todas las mismas opciones queread.table
. Un argumento faltante esna.comment
, que puede llevar a comportamientos no deseados si el archivo fuente contiene#
. -
fread
usa solo"
para el parámetro dequote
. -
fread
usa pocas (5) líneas para adivinar tipos de variables.
Importando archivos .tsv como matrices (R básico)
Muchas personas no usan file.path
cuando hacen una ruta a un archivo. Pero si está trabajando con máquinas Windows, Mac y Linux, generalmente es una buena práctica usarlo para hacer rutas en lugar de paste
.
FilePath <- file.path(AVariableWithFullProjectPath,"SomeSubfolder","SomeFileName.txt.gz")
Data <- as.matrix(read.table(FilePath, header=FALSE, sep ="\t"))
Generalmente esto es suficiente para la mayoría de las personas.
A veces sucede que las dimensiones de la matriz son tan grandes que el procedimiento de asignación de memoria debe tenerse en cuenta al leer en la matriz, lo que significa leer en la matriz línea por línea.
Tomemos el ejemplo anterior, en este caso FilePath
contiene un archivo de dimensión 8970 8970
con el 79% de las celdas que contienen valores distintos de cero.
system.time(expr=Data<-as.matrix(read.table(file=FilePath,header=FALSE,sep=" ") ))
system.time
dice que se tomaron 267 segundos para leer el archivo.
user system elapsed
265.563 1.949 267.563
Del mismo modo, este archivo se puede leer línea por línea,
FilePath <- "SomeFile"
connection<- gzfile(FilePath,open="r")
TableList <- list()
Counter <- 1
system.time(expr= while ( length( Vector<-as.matrix(scan(file=connection, sep=" ", nlines=1, quiet=TRUE)) ) > 0 ) {
TableList[[Counter]]<-Vector
Counter<-Counter+1
})
user system elapsed
165.976 0.060 165.941
close(connection)
system.time(expr=(Data <- do.call(rbind,TableList)))
user system elapsed
0.477 0.088 0.565
También está el paquete futile.matrix
que implementa un método read.matrix
, el código en sí mismo se mostrará como lo que se describe en el ejemplo 1.
Exportando archivos .csv
Exportando utilizando la base R
Los datos se pueden escribir en un archivo CSV usando write.csv()
:
write.csv(mtcars, "mtcars.csv")
Los parámetros especificados comúnmente incluyen row.names = FALSE
y na = ""
.
Exportando utilizando paquetes
readr::write_csv
es significativamente más rápido que write.csv
y no escribe nombres de fila.
library(readr)
write_csv(mtcars, "mtcars.csv")
Importar múltiples archivos csv
files = list.files(pattern="*.csv")
data_list = lapply(files, read.table, header = TRUE)
Esto lee cada archivo y lo agrega a una lista. Después, si todos los data.frame tienen la misma estructura, se pueden combinar en un big data.frame:
df <- do.call(rbind, data_list)
Importando archivos de ancho fijo
Los archivos de ancho fijo son archivos de texto en los que las columnas no están separadas por ningún delimitador de caracteres, como ,
o ;
, sino más bien tener una longitud de caracteres fija ( ancho ). Los datos se suelen rellenar con espacios en blanco.
Un ejemplo:
Column1 Column2 Column3 Column4Column5
1647 pi 'important' 3.141596.28318
1731 euler 'quite important' 2.718285.43656
1979 answer 'The Answer.' 42 42
Supongamos que esta tabla de datos existe en el archivo local constants.txt
en el directorio de trabajo.
Importando con base R
df <- read.fwf('constants.txt', widths = c(8,10,18,7,8), header = FALSE, skip = 1)
df
#> V1 V2 V3 V4 V5
#> 1 1647 pi 'important' 3.14159 6.28318
#> 2 1731 euler 'quite important' 2.71828 5.43656
#> 3 1979 answer 'The Answer.' 42 42.0000
Nota:
- Los títulos de las columnas no necesitan estar separados por un carácter (
Column4Column5
) - El parámetro
widths
define el ancho de cada columna. - Los encabezados no separados no se pueden leer con
read.fwf()
Importando con readr
library(readr)
df <- read_fwf('constants.txt',
fwf_cols(Year = 8, Name = 10, Importance = 18, Value = 7, Doubled = 8),
skip = 1)
df
#> # A tibble: 3 x 5
#> Year Name Importance Value Doubled
#> <int> <chr> <chr> <dbl> <dbl>
#> 1 1647 pi 'important' 3.14159 6.28318
#> 2 1731 euler 'quite important' 2.71828 5.43656
#> 3 1979 answer 'The Answer.' 42.00000 42.00000
Nota:
- Las funciones de ayuda
fwf_*
ofrecen formas alternativas de especificar la longitud de las columnas, incluida lafwf_empty
automática (fwf_empty
) - readr es más rápido que la base R
- Los títulos de las columnas no se pueden importar automáticamente desde el archivo de datos