1.1 Carga de datos en R
Los datos en R se almacenan en objetos de clase data.frame, que son una especie de matriz, con las observaciones por filas y las variables en columna. Los tipos de las variables pueden ser diferentes (continuas, discretas, texto, cualitativas, …), esa es la diferencia formal con una matriz en R, ésta última debe contener el mismo tipo de componentes elementales.
Los datos que manejamos suelen estar en archivos con dos formatos .csv y .xls. Los archivos .csv son texto, con las observaciones por filas y las variables de cada observación separadas por comas. La primera fila del archivo suele contener los nombres de las variables. Este formato es preferible, porque no requiere un software específico para su edición.
En la siguiente línea se lee el archivo bwght.csv y los datos se almacenan en un data.frame llamado bwd (al final del artículo se describen las variables cargadas):
> bwd <- read.csv('bwght.csv')
El archivo puede estar en cualquier directorio del ordenador, al que podemos acceder usando la función setwd() o indicándolo como parte del nombre del archivo. También podemos cargar los datos desde una dirección de internet (una URL):
> bwd <- read.csv('http://www.grserrano.es/datos/bwght.csv')
En ocasiones, el separador de campos es el ; y los decimales se separan con una coma en vez de un punto. Se puede usar la misma instrucción que antes, pero con argumentos adicionales como en: bwd <- read.csv("bwght.csv", sep=";", dec=",").
Si los datos se encuentran, por ejemplo, en el archivo bwght.xls, en una hoja llamada “peso”, se pueden leer con:
> library(XLConnect)
XLConnect 0.1-7 by Mirai Solutions GmbH <xlconnect@mirai-solutions.com>
http://www.mirai-solutions.com , http://miraisolutions.wordpress.com
> wb <- loadWorkbook("bwght.xls", create=FALSE)
> bwd <- readWorksheet(wb, "peso")
En todo caso, conviene comprobar la lectura con head(bwd) y tail(bwd) que muestran, respectivamente, las primeras y últimas filas de un data.frame:
> head(bwd)
faminc cigtax cigprice bwght fatheduc motheduc parity male white cigs
1 13.5 16.5 122.3 109 12 12 1 1 1 0
2 7.5 16.5 122.3 133 6 12 2 1 0 0
3 0.5 16.5 122.3 129 0 12 2 0 0 0
4 15.5 16.5 122.3 126 12 12 2 1 0 0
5 27.5 16.5 122.3 134 14 12 2 1 1 0
6 7.5 16.5 122.3 118 12 14 6 1 0 0
Utilizando el paquete de funciones foreign se pueden leer archivos creados por programas estadísticos y matemáticos como Stata (read.dta()), SAS (read.xport()), SPSS (read.spss()) y Octave (read.octave()). R también dispone de funciones para acceder directamente a bases de datos locales o en servidores remotos.
1.2 Creación de variables
Se puede acceder a las variables de un data.frame usando el nombre del data.frame un símbolo $ y el nombre de la variable, como en:
> head(bwd$bwght)
[1] 109 133 129 126 134 118
o de forma equivalente con:
> head(bwd[, "bwght"])
[1] 109 133 129 126 134 118
La ventaja de este segundo método es que podemos seleccionar un subconjunto de columnas head(bwd[, c("bwght", "cigs", "faminc")]). Nótese como los nombres de las variables se han agrupado con c(). También es posible acceder por el número de columna, de esa forma, número negativos excluyen las columnas.
Para crear una variable o sobreescribir una ya existente, usamos la asignación, que en R se hace con <- (como al cargar datos desde archivos). Para crear una nueva variable con el peso en kg. (que originalmente venía en onzas) se haría:
> bwd$bwghtkg <- bwd$bwght*2.83495231/100
Si, por el contrario, queremos almacenar el peso en kg. en una variable ya existente, el procedimiento es idéntico, pero asignamos a una variable que ya estaba en el data.frame:
> bwd$bwght <- bwd$bwght*2.83495231/100
Las variables cualitativas conviene etiquetarlas porque las salidas serán más descriptivas. Antes se cargaron las variables white (que toma valor 1 si el bebé es blanco y 0 en otros casos) y male (1 si el bebé es varón y 0 en otros casos). A partir de ellas creamos etnic, con valores “Blanco” y “No blanco”, y sexo con valores “Hombre” y “Mujer” (para hacer una comparación de igualdad en R se usa ==):
> ## Variables cualitativas con etiquetas
> bwd$etnic <- factor(ifelse(bwd$white==1, "Blanco", "No blanco"))
> bwd$sexo <- factor(ifelse(bwd$male==1, "Hombre", "Mujer"))
La función ifelse() realiza la comparación que aparece en primer lugar y devuelve el segundo argumento si es cierta o el tercero si es falsa. Dicha comparación se hace elemento a elemento si se trata de una variable o un vector. Por otra parte, la función factor() toma una variable de cadena y la convierte en variable cualitativa (que en R se denomina factor).
Para eliminar una variable de un data.frame, se le asigna el valor especial NULL como en la siguiente línea:
> bwd$bwghtkg <- NULL
Los nombres de las variables (columnas) de un data.frame se pueden ver y modificar con:
> colnames(bwd)
[1] "faminc" "cigtax" "cigprice" "bwght" "fatheduc" "motheduc"
[7] "parity" "male" "white" "cigs" "etnic" "sexo"
Para seleccionar un subconjunto de las filas de un data.frame se usa la función subset(). El primer argumento es el data.frame y el segundo una condición lógica basada en las columnas. A continuación seleccionamos las observaciones en las que la madre es fumadora y las guardamos en un nuevo data.frame:
> bwd.fuma <- subset(bwd, subset=(cigs>0))
Los operadores de comparación son <, <=, ==, !=, => y >. Las comparaciones se pueden concatenar con & (y lógica) y | (o lógica). La función subset() admite un argumento select para escoger un subconjunto de columnas del data.frame inicial bwd.fuma <- subset(bwd, subset=(cigs>0), select=c("bwght", "cigs", "faminc")).
Datos del peso de recién nacidos
Datos de ejemplo para la especificación de un modelo de regresión que trata de caracterizar factores que pueden afectar al peso de recién nacidos. La base de datos (bwght.csv) procede de Wooldridge (2006) y contiene información recogida en 1388 partos sobre:
- El peso de los bebés: bwght (en onzas, 100 onzas=2.83495231 kg),
- la renta de la familia en 1988 en miles de dólares (faminc),
- el número medio de cigarrillos fumados diariamente por la madre durante el embarazo (cigs),
- el número de orden que ocupa el recién nacido dentro de los hijos de la mujer (parity),
- los años de educación del padre (fatheduc) y de la madre (motheduc), en ambas variables, 0 indica dato no disponible,
- precio de los cigarrillos en el estado de residencia (cigprice) e impuestos sobre el tabaco (cigtax)
- ficticia de sexo del bebé (male, 1=varón y 0=mujer) y
- ficticia de grupo étnico (white, 1=blanco y 0=otros).