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 el header = 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 que as.is = TRUE o stringsAsFactors = FALSE .
  • La variante read.csv2 defecto es sep = ";" y dec = "," 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 que read.table . Un argumento faltante es na.comment , que puede llevar a comportamientos no deseados si el archivo fuente contiene # .
  • fread usa solo " para el parámetro de quote .
  • 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 la fwf_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


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow