Importar – Exportar datos en R

Con el objetivo de hacer este post reproducible se ha hecho esta entrada. En el antiguo post están disponibles los ficheros utilizados en la presentación realizada por el RUG-BCN, sin embargo, ahora se ha intentado que esto sea más comprensible a partir de una breve explicación, antes sólo se habían proporcionado los scripts sin más, ahora se proporciona un ejemplo reproducible.

A continuación se explicará brevemente la manera de importar datos que tienen diferentes formatos a R. La importación es muy simple, por eso se hará con poco detalle. Los archivos de ayuda de R son muy completos y claros por si surge alguna duda que vaya más allá de este post.

Para reproducir los ejemplos se pueden descargar los ficheros aquí

Importación de datos

Importando archivos CSV

datos.csv <- read.csv("datos.csv", header = T)
head(datos.csv)  # así es como deben lucir los datos

##   country country.isocode year   POP    ppp  cgnp
## 1  France             FRA 2000 61137 0.9140 101.4
## 2  France             FRA 2001 61479 0.9104 101.2
## 3  France             FRA 2002 61829 0.9106 100.3
## 4  France             FRA 2003 62171 0.9080 100.6
## 5  France             FRA 2004 62534 0.8972 100.8
## 6  France             FRA 2005 62912 0.8858 100.6

sapply(datos.csv, class)  # esto es para conocer la clase de cada variable

##         country country.isocode            year             POP 
##        "factor"        "factor"       "integer"       "numeric" 
##             ppp            cgnp 
##       "numeric"       "numeric"

summary(datos.csv)  # este es un breve resumen estadístico las variables

##    country   country.isocode      year           POP       
##  France:10   ESP:10          Min.   :2000   Min.   :10559  
##  Greece:10   FRA:10          1st Qu.:2002   1st Qu.:10710  
##  Spain :10   GRC:10          Median :2004   Median :43352  
##                              Mean   :2004   Mean   :38940  
##                              3rd Qu.:2007   3rd Qu.:61742  
##                              Max.   :2009   Max.   :64420  
##       ppp             cgnp      
##  Min.   :0.697   Min.   : 96.7  
##  1st Qu.:0.709   1st Qu.: 98.3  
##  Median :0.737   Median : 99.2  
##  Mean   :0.776   Mean   : 99.3  
##  3rd Qu.:0.869   3rd Qu.:100.6  
##  Max.   :0.914   Max.   :101.4

La instrucción View(datos.csv) muestra la base de datos completa, la visualización es muy parecida a una hoja de cálculo de excel.

txt separados por tabulaciones, coma (,) y punto y coma (;)

Para importar datos cuyo formato sea .txt separados por tabulaciones se puede usar tanto la función read.delim o read.table lo importante es utilizar el argumento sep que indica la forma en como se ha separado las columnas en el archivo, las alternativas son sep=',' para aquellos que son separados por coma, sep=';' para los que son separados por punto y coma (;) y sep='\t' para los que han sido separados con tabulaciones, este es el caso de nuestros datos del ejemplo. Nótese que sep='\t' es equivalente a sep="\t" no hay distinción entre usar comillas simples o dobles.

datos.txt <- read.delim("datos.txt", header = TRUE, sep = "\t")
head(datos.txt)

##   country country.isocode year   POP    ppp  cgnp
## 1  France             FRA 2000 61137 0.9140 101.4
## 2  France             FRA 2001 61479 0.9104 101.2
## 3  France             FRA 2002 61829 0.9106 100.3
## 4  France             FRA 2003 62171 0.9080 100.6
## 5  France             FRA 2004 62534 0.8972 100.8
## 6  France             FRA 2005 62912 0.8858 100.6


# alternativa
datos.txt2 <- read.table("datos.txt", header = TRUE, sep = "\t")
head(datos.txt2)

##   country country.isocode year   POP    ppp  cgnp
## 1  France             FRA 2000 61137 0.9140 101.4
## 2  France             FRA 2001 61479 0.9104 101.2
## 3  France             FRA 2002 61829 0.9106 100.3
## 4  France             FRA 2003 62171 0.9080 100.6
## 5  France             FRA 2004 62534 0.8972 100.8
## 6  France             FRA 2005 62912 0.8858 100.6

El argumeto header=T es equivalente a header=TRUE.

Importar datos txt desde una web

La función read.table también permite importar datos txt desde una web lo cual es muy útil si no queremos descargar los datos y almencenarlos en el disco duro, aunque siempre es recomendable descargarlos, los administradores de las webs podrían eliminar los datos y con ello perderíamos la infomación, así que no cuesta nada guardarlos en nuestro PC, pero igualmente se mostrará como importar archivos txt desde una web. La instrucción es muy simple, sólo hasta escribir read.table('dirección web') y listo.

Web <- "http://people.cst.cmich.edu/lee1c/spss/V16_materials/DataSets_v16/Diseaseoutbreak.txt"
datosWeb1 <- read.table(Web)  # o puede escribirse la dirección directamente dentro
head(datosWeb1)  # un vistazo para ver cómo son los datos

##   V1 V2 V3 V4 V5 V6
## 1  1 33  1  1  0  1
## 2  2 35  1  1  0  1
## 3  3  6  1  1  0  0
## 4  4 60  1  1  0  1
## 5  5 18  3  1  1  0
## 6  6 26  3  1  0  0

Si se va a la web donde están los datos que se acaban de importar, se observará que tales datos no tienen encabezado (las columnas no tienen nombres) con lo cual se ha omitido el argumento header, al ser omitido este toma el valor FALSE que es su valor por defecto. Como las columnas no tienen nombres, entonces R ha creado nombres: V1, V2, ..., V6, para cambiar los nombres que ha sido asignados por defecto puede usarse la función colnames o se pueden asignar directamente cuando se importan usando el argumento col.names de la función read.table.

Web <- "http://people.cst.cmich.edu/lee1c/spss/V16_materials/DataSets_v16/Diseaseoutbreak.txt"
nombres <- c("ID", "edad", "hijos", "coches", "yates", "motos")
datosWeb2 <- read.table(Web, col.names = nombres)
head(datosWeb2)  # un vistazo para ver cómo resulta

##   ID edad hijos coches yates motos
## 1  1   33     1      1     0     1
## 2  2   35     1      1     0     1
## 3  3    6     1      1     0     0
## 4  4   60     1      1     0     1
## 5  5   18     3      1     1     0
## 6  6   26     3      1     0     0

En el ejemplo anterior, tanto la dirección web como los nombres de las columnas se pudieron haber escrito dentro de la función read.table pero por fines expositivos se han preasignado a los objetos Web y nombres, respectivamente, para luego introducirlos en sus respectivos lugares dentro de read.table.

El legendario Copy/Paste

Para no perder la costumbre y para darle su respectivo homenaje al legendario Copy/Paste se tiene su equivalente en R y se usa tal y cual se explica claramente en este post.

Para usar el copiar y pegar en R basta con seleccinar los datos a ser importados (preferiblemente de Excel) y copiar (Ctrl + C) y en R Ctrl + V no funciona, su equivalente es read.delim('clipboard'). A manera de ejemplo se importarán los datos de esta web que la se ha usado para los ejemplos anteriores, para hacerlo sólo basta con seleccionar todos los datos hacer Ctrl + C y luego ejecutar lo siguiente:

datosWeb3 <- read.delim('clipboard')

Excel

Para importar directamente desde excel o exportar a excel en su respectivo formato .xls se deben cargar paquetes adicionales, lo cual no me parece nada atractivo, porque los archivos .txt o .csv funcionan muy bien en todos los softwares estadísticos y también en excel mismo, sin embargo, para aquellos que les gusta mantener sus datos en archivos .xls pueden estar tranquilos porque incluso en ese formato se importa a R.

Para importar archivos desde ficheros de excel a R se debe instalar el paquete XLConnect disponible en CRAN.

# install.packages('XLConnect')

# library(XLConnect)

# vignette('XLConnect') # Manual (viñeta) es muy útil

# wb <- loadWorkbook('Libro1.xls', create = TRUE) excel1 <-
# readWorksheet(wb, sheet = 'Hoja1')

Otra manera de hacerlo, un poco mejor que usando XLConnectes con la función read.xls del paquete gdata.

# install.packages('gdata') library(gdata) excel2 <-
# read.xls('Libro1.xls', sheet=1) # Mucho más fácil que el anterior.

La función read.xls permite importar archivos xls desde la web. Por ejemplo, vamos a esta web e importaremos el fichero llamado 'Cancer.xls'

# WebCancer <-
# 'http://people.cst.cmich.edu/lee1c/spss/V16_materials/DataSets_v16/Cancer.xls'
# cancerXLS <- read.xls(WebCancer)

Desde SPSS

Para importar ficheros sav se puede usar el paquete foreign o el paquete Hmisc. Se ilustrará el uso de ambos.

A continuación se importarán los datos correspondientes a una base de datos disponible en el libro de Mark Berenson que consiste en una encuesta aplicada a 400 empleados de una compañía. Páginas 33-40.

library(foreign)
empleados1 <- read.spss("Empleados_400.sav", to.data.frame = TRUE)
dim(empleados1)

## [1] 400  30

empleados1[1:5, 1:7]

##   Codigo Horas      Ocupacion Edad Educacion      Sexo cempea
## 1      1    50      Gerencial   35        20 Masculino      2
## 2      2    30         Obrero   64        14  Femenino      2
## 3      3    40      Gerencial   33        15 Masculino      2
## 4      4    40 Tecnico/ventas   23        14 Masculino      1
## 5      5    50   Apoyo admin.   33        12  Femenino      1

Se han mostrado los primeros 5 casos de las primeras 7 variables. Es importante señalar que al momento de usar read.spss se tiene que usar to.data.frame=TRUE si no se hace así entonces el resultado será una lista en lugar de data.frame.

Otra forma de importar datos de SPSS es usando la función spss.get del paquete Hmisc, con spss.get el resultado por defecto es un data.frame.

# library(Hmisc)

# empleados2 <- spss.get('Empleados_400.sav')

Un ejemplo con fechas

Para el siguiente ejemplo se usará una base de datos ficticia empleada en las clases de SAS y R en el Máster en Estadística de la Universidad Politècnica de Catalunya.

Una de las ventajas que tiene la función spss.get sobre read.spss es la capacidad de lidiar con fechas. En el siguiente ejemplo se pone de relive tal diferencia y la ventaja misma de spss.get.

Se importará una pequeña base de datos llamada DatosSPSS.sav compuesta por 8 observaciones sobre 6 variables: nom, eda, alt, pes, sex, bday que corresponde a nombre, edad, altura, peso, sexo y fecha de nacimiento, como ha de esperarse cada variable debe tener formato diferente y específicamente la variable bday debe teber formato de fecha, sin embargo, como se ve a continuación, la función read.spss no la importa como tal, el resto de variables son importadas perfectamente.

library(foreign)
dspss <- read.spss("DatosSPSS.sav", to.data.frame = T)
dspss  # problema: variable dbay es una fecha y no sale como formato fecha :(

##      nom eda alt pes    sex      bday
## 1 Laura   25 167  65  Mujer 1.285e+10
## 2 Maria   21 160  57  Mujer 1.285e+10
## 3 Pedro   23 178  83 Hombre 1.304e+10
## 4 Josep   29 170  69 Hombre 1.257e+10
## 5 Martha  23 163  65  Mujer 1.269e+10
## 6 Jordi   19 185  90 Hombre 1.213e+10
## 7 Erik    31 176  77 Hombre 1.246e+10
## 8 Marion  NA 159  62  Mujer 1.231e+10

Como se aprecia, la base fue correctamente importada excepto por la variable bday que no tiene formato fecha, para ver qué clase de variable es cada usa de ellas se puede hacer lo siguiente:

sapply(dspss, class)

##       nom       eda       alt       pes       sex      bday 
##  "factor" "numeric" "numeric" "numeric"  "factor" "numeric"

Como era de esperarse, todas tienen el formato correcto, excecto bday, pero esto se arregla fácilmente haciendo:

dspss <- transform(dspss, bday = as.Date(ISOdate(1582, 10, 14) + dspss$bday))
dspss

##      nom eda alt pes    sex       bday
## 1 Laura   25 167  65  Mujer 1989-11-12
## 2 Maria   21 160  57  Mujer 1990-01-01
## 3 Pedro   23 178  83 Hombre 1996-02-29
## 4 Josep   29 170  69 Hombre 1981-03-02
## 5 Martha  23 163  65  Mujer 1984-12-31
## 6 Jordi   19 185  90 Hombre 1967-02-22
## 7 Erik    31 176  77 Hombre 1977-09-23
## 8 Marion  NA 159  62  Mujer 1972-12-31

Con esto se resuelve el problema de las fechas, para saber qué hace la función ISOdate pude ejecutarse en R lo siguiente: ?ISOdate o ver aquí.

Todo lo anterior se puede hacer en un sólo paso usando la función spss.get de la siguiente manera:

# library(Hmisc)

# spss.get('DatosSPSS.sav') # problemas con las fechas

# spss <- spss.get('DatosSPSS.sav', datevars='bday') # problema resuelto

Basta con usar el argumento datevars y proporcionarle el nombre de la variable que es tipo fecha para que la interprete e importe como tal.

spss.get también permite importar desde la web.

#
# spss.get('http://people.cst.cmich.edu/lee1c/spss/V16_materials/DataSets_v16/supermarket.sav')

STATA

Se debe usar la función read.dta del paquete foreign.

stata <- read.dta("datosStata.dta")
head(stata)

##   pers postrem treat gender  priori
## 1    1  2492.2     0      0 0.19020
## 2    2  2871.2     0      0 0.16711
## 3    3  2370.7     0      0 0.15092
## 4    4  3726.6     0      0 0.09395
## 5    5   859.6     0      0 0.05056
## 6    6  3705.3     0      0 0.06708

stata$treat <- as.factor(stata$treat)
# stata <- transform(stata, treat=as.factor(treat)) alternativa para
# convertir en factores
stata$gender <- as.factor(stata$gender)

## Extras, si queremos a los factores con etiquetas, entonces...
stata$gender <- factor(stata$gender, labels = c("Mujer", "Hombre"))
stata$treat <- factor(stata$treat, labels = c("Control", "Tratado"))
head(stata)

##   pers postrem   treat gender  priori
## 1    1  2492.2 Control  Mujer 0.19020
## 2    2  2871.2 Control  Mujer 0.16711
## 3    3  2370.7 Control  Mujer 0.15092
## 4    4  3726.6 Control  Mujer 0.09395
## 5    5   859.6 Control  Mujer 0.05056
## 6    6  3705.3 Control  Mujer 0.06708

Exportación de datos

Para la exportación de datos usaremos el conjunto de datos ‘Cars.sav’ cuya descripción se puede ver en esta página.

Primero hemos de importar los datos:

# cars <-
# spss.get('http://people.cst.cmich.edu/lee1c/spss/V16_materials/DataSets_v16/Cars.sav')

Una vez que te se tiene el data.frame pude exportar a distintos formatos.

CSV

# write.csv(cars, 'cars.csv')

txt separado por tabulaciones

# write.table(cars, 'cars.txt', sep='\t')

Importante!!! R usa por defecto el '.' como separador de decimales, en España se usa ',' como separador de decimales y '.' como separador de miles ¿Cómo arreglarlo? En excel, ir a Herramientas, Internacional….., ¿Otra forma? ¿Es posible hacerlo directamente desde R? Sí, lo es! sólo basta con indicarlo cuando se está exportando:

# write.csv(cars, 'cars.csv', dec=',')

# write.table(cars, 'cars.txt', sep='\t', dec=',') # Muy fácil, ¿No?

Excel

No recomandable porque hay que cargar un paquete (OTRO!!) adicional.Se hace con la función WriteXLS del paquete WriteXLS

# install.packages('WriteXLS')

# library(WriteXLS)

# ?WriteXLS # para ver la ayuda.

SPSS

Con el paquete foreign

# write.foreign(cars, 'File_spss.txt', 'Code_spss.sps', package='SPSS')

Esto muestra qué ha generado R para que sea leído por SPSS

# file.show('File_spss.txt') file.show('Code_spss.sps')

STATA

# write.dta(cars, 'cars.dta')

MÁS INFORMACIÓN SOBRE IMPORTAR/EXPORTAR DATOS:

http://cran.r-project.org/doc/manuals/R-data.html

8 responses to “Importar – Exportar datos en R”

  1. Andreu says :

    Muy útil. Después de haber intentado leer primero el manual de R Data llegué a este blog y la información me ha parecido muy detallada y fácil de entender. Muchas gracias.

  2. Bruno says :

    Buenos dias amigo he intentado instalar install.packages(“XLConnect”) en linux pero siempre me tira un error:

    install.packages(“XLConnect”)
    also installing the dependency ‘rJava’

    probando la URL ‘http://cran.rstudio.com/src/contrib/rJava_0.9-6.tar.gz’
    Content type ‘application/x-gzip’ length 567515 bytes (554 Kb)
    URL abierta
    ==================================================
    downloaded 554 Kb

    probando la URL ‘http://cran.rstudio.com/src/contrib/XLConnect_0.2-7.tar.gz’
    Content type ‘application/x-gzip’ length 18302979 bytes (17.5 Mb)
    URL abierta
    ==========================================
    downloaded 14.7 Mb

    Warning in install.packages :
    longitud bajada 15403760 != longitud informada 18302979
    * installing *source* package ‘rJava’ …
    ** package ‘rJava’ successfully unpacked and MD5 sums checked
    ERROR: ‘configure’ exists but is not executable — see the ‘R Installation and Administration Manual’
    * removing ‘/usr/lib64/R/library/rJava’
    Warning in install.packages :
    installation of package ‘rJava’ had non-zero exit status
    Error en untar2(tarfile, files, list, exdir, restore_times) :
    incomplete block on file
    Warning in install.packages :
    installation of package ‘XLConnect’ had non-zero exit status

    podrias ayudarme?

  3. userR says :

    Gracias por la info, fue muy util. Tambien tuve problemas con XLConnect pero en su lugar utilice la libreria ‘gdata’ y con este ultimo fue muy facil y perfecto todo.

  4. Ingrid Fabiola says :

    TEngo un problema cuando agrego el archivo .csv en el R, ya que no me sale en forma de tabla como se ve en las imagen, sino con ; entre las columnas

  5. Metzli says :

    En cualquier extension que quiera guardar (.txt, .xls, .xlsx, .csv) me aparece el siguiente mensaje,

    Aviso en file(file, ifelse(append, “a”, “w”)) :
    no fue posible abrir el archivo ‘cars.txt’: Permission denied
    Error en file(file, ifelse(append, “a”, “w”)) :
    no se puede abrir la conexión

    sabes a que se deba?..

  6. azumarina says :

    Reblogged this on orgcompetet and commented:
    Analizando datos…

  7. Pedro says :

    Estimados:

    buenos dias. Requiero exportar el archivo de salida del Kriging obtenido desde el paquete geoR con krige.conv. al tratar de exportar directamente obtengo el siguiente error:

    Error in as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) : cannot coerce class “”kriging”” to a data.frame

    alguien me puede decir cual es mi error????

    de antemano muchas gracias a todos

Trackbacks / Pingbacks

  1. Un any de la primera reunió « RUG Barcelona - 04/11/2012

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: