Estructuras de datos (continuación)

data.frame es la pieza fundamental de todo lo que queremos hacer cuando hacemos análisis de datos. Es útil pensarla como una matrix que puede mantener columnas de diferentes tipos y que además contiene nombres para cada columna.

states <- data.frame("code"       = c("CA", "NY", "NE", "AZ"), 
                     "population" = c(38.8, 19.7, 2.1, 6.8), 
                     "region"     = c("West", "Northeast", "Midwest", "West"), 
                     "landlock"   = c(FALSE, FALSE, TRUE, TRUE))

Podemos acceder los elementos a través de índices del mismo modo que haríamos con una matrix o podemos acceder a través de nombre:

states[, 3] 
states[, "region"]
states$region

También podemos añadir variables:

states$spanish <- c(28.5, 15.7, NA, 19.5)

O podemos editar valores usando algunas de las herramientas que hemos visto hasta ahora:

states$population[states$code == "NE"] <- 1.8

Examinemos con un poco de detalle qué es lo que ha ocurrido en la linea anterior. states$code extrae la columna code de nuestros datos. states$code == "NE" devuelve un vector lógico en el que solo la tercer observación tiene valor TRUE. states$population[states$code == "NE"] accede al valor del vector population para Nebraska. Ahí asignaremos el valor 1.8.

La misma aproximación puede usarse para hacer selecciones de la base de datos:

states[states$population > 10,] # Precaución con la coma
subset(states, population > 10)

La transformación de variables es sencilla

states$spanish <- states$spanish * states$population/100 # Aunque podríamos haber usado una nueva variable

La base de datos también es útil para pensar acerca de ciertos tipos de variables. Pensad en la variable region: es un vector de caracteres, pero querríamos considerarlo como una variable discreta en la que cada valor (un número) tendría asociada una etiqueta (el nombre de la región). Esta estructura se llama factor en R.

states$region <- factor(states$region)
states$region
levels(states$region)

Dependiendo de con quién habléis, pueden amarlos u odiarlos.

Input/Output

Podemos escribir en el disco con valores separados por comas usando la función write.csv.

write.csv(states, file="states.csv")

El argumento file nos permite especificar el nombre el archivo en el que guardaremos el data.frame states. El archivo se guarda en el directorio en el que estemos trabajando, pero podríamos haber especificado cualquier otro directorio si hubiésemos pasado la ruta completa. Para comprobar cuál es el directorio de trabajo podemos usar:

getwd()

y podemos cambiar el valor usando setwd().

Para leer datos a R podemos usar la función read.csv.

states <- read.csv("states.csv")
states

El formato más común para R de todos modos es su formato binario nativo, que usa la extensión .RData y que se genera y lee usando las funciones save y load.

save(states, file="states.RData")
load("states.RData")
states

Pero R puede leer (y a veces escribir) datos en otros formatos binarios como Stata, SAS, SPSS, o incluso Excel. Las funciones para gestionar estos formatos vienen en el paquete foreign que se instala con R. Echad un vistazo a la documentación. En breve veremos cómo usar paquetes adicionales enseguida.

LS0tIAp0aXRsZTogIk1hbmlwdWxhY2nDs24gZGUgZGF0b3MgeSBJL08iCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVCICVkLCAlWScpYCIKLS0tCgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0UsIGNhY2hlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZXZhbCA9IEZBTFNFKSAKYGBgCgojIyMgRXN0cnVjdHVyYXMgZGUgZGF0b3MgKGNvbnRpbnVhY2nDs24pCgpgZGF0YS5mcmFtZWAgZXMgbGEgcGllemEgZnVuZGFtZW50YWwgZGUgdG9kbyBsbyBxdWUgcXVlcmVtb3MgaGFjZXIgY3VhbmRvCmhhY2Vtb3MgYW7DoWxpc2lzIGRlIGRhdG9zLiBFcyDDunRpbCBwZW5zYXJsYSBjb21vIHVuYSBgbWF0cml4YCBxdWUgcHVlZGUgbWFudGVuZXIKY29sdW1uYXMgZGUgZGlmZXJlbnRlcyB0aXBvcyB5IHF1ZSBhZGVtw6FzIGNvbnRpZW5lIG5vbWJyZXMgcGFyYSBjYWRhIGNvbHVtbmEuCgpgYGB7ciBldmFsPUZBTFNFfQpzdGF0ZXMgPC0gZGF0YS5mcmFtZSgiY29kZSIgICAgICAgPSBjKCJDQSIsICJOWSIsICJORSIsICJBWiIpLCAKICAgICAgICAgICAgICAgICAgICAgInBvcHVsYXRpb24iID0gYygzOC44LCAxOS43LCAyLjEsIDYuOCksIAogICAgICAgICAgICAgICAgICAgICAicmVnaW9uIiAgICAgPSBjKCJXZXN0IiwgIk5vcnRoZWFzdCIsICJNaWR3ZXN0IiwgIldlc3QiKSwgCiAgICAgICAgICAgICAgICAgICAgICJsYW5kbG9jayIgICA9IGMoRkFMU0UsIEZBTFNFLCBUUlVFLCBUUlVFKSkKYGBgCgpQb2RlbW9zIGFjY2VkZXIgbG9zIGVsZW1lbnRvcyBhIHRyYXbDqXMgZGUgw61uZGljZXMgZGVsIG1pc21vIG1vZG8gcXVlIGhhcsOtYW1vcwpjb24gdW5hIGBtYXRyaXhgIG8gcG9kZW1vcyBhY2NlZGVyIGEgdHJhdsOpcyBkZSBub21icmU6CmBgYHtyIGV2YWw9RkFMU0V9CnN0YXRlc1ssIDNdIApzdGF0ZXNbLCAicmVnaW9uIl0Kc3RhdGVzJHJlZ2lvbgpgYGAKClRhbWJpw6luIHBvZGVtb3MgYcOxYWRpciB2YXJpYWJsZXM6CgpgYGB7ciBldmFsPUZBTFNFfQpzdGF0ZXMkc3BhbmlzaCA8LSBjKDI4LjUsIDE1LjcsIE5BLCAxOS41KQpgYGAKCk8gcG9kZW1vcyBlZGl0YXIgdmFsb3JlcyB1c2FuZG8gYWxndW5hcyBkZSBsYXMgaGVycmFtaWVudGFzIHF1ZSBoZW1vcyB2aXN0bwpoYXN0YSBhaG9yYToKCmBgYHtyIGV2YWw9RkFMU0V9CnN0YXRlcyRwb3B1bGF0aW9uW3N0YXRlcyRjb2RlID09ICJORSJdIDwtIDEuOApgYGAKCkV4YW1pbmVtb3MgY29uIHVuIHBvY28gZGUgZGV0YWxsZSBxdcOpIGVzIGxvIHF1ZSBoYSBvY3VycmlkbyBlbiBsYSBsaW5lYQphbnRlcmlvci4gYHN0YXRlcyRjb2RlYCBleHRyYWUgbGEgY29sdW1uYSBgY29kZWAgZGUgbnVlc3Ryb3MgZGF0b3MuIGBzdGF0ZXMkY29kZQo9PSAiTkUiYCBkZXZ1ZWx2ZSB1biB2ZWN0b3IgbMOzZ2ljbyBlbiBlbCBxdWUgc29sbyBsYSB0ZXJjZXIgb2JzZXJ2YWNpw7NuIHRpZW5lCnZhbG9yIGBUUlVFYC4gYHN0YXRlcyRwb3B1bGF0aW9uW3N0YXRlcyRjb2RlID09ICJORSJdYCBhY2NlZGUgYWwgdmFsb3IgZGVsCnZlY3RvciBgcG9wdWxhdGlvbmAgcGFyYSBOZWJyYXNrYS4gQWjDrSBhc2lnbmFyZW1vcyBlbCB2YWxvciAxLjguCgpMYSBtaXNtYSBhcHJveGltYWNpw7NuIHB1ZWRlIHVzYXJzZSBwYXJhIGhhY2VyIHNlbGVjY2lvbmVzIGRlIGxhIGJhc2UgZGUgZGF0b3M6CmBgYHtyIGV2YWw9RkFMU0V9CnN0YXRlc1tzdGF0ZXMkcG9wdWxhdGlvbiA+IDEwLF0gIyBQcmVjYXVjacOzbiBjb24gbGEgY29tYQpzdWJzZXQoc3RhdGVzLCBwb3B1bGF0aW9uID4gMTApCmBgYAoKTGEgdHJhbnNmb3JtYWNpw7NuIGRlIHZhcmlhYmxlcyBlcyBzZW5jaWxsYQpgYGB7ciBldmFsPUZBTFNFfQpzdGF0ZXMkc3BhbmlzaCA8LSBzdGF0ZXMkc3BhbmlzaCAqIHN0YXRlcyRwb3B1bGF0aW9uLzEwMCAjIEF1bnF1ZSBwb2Ryw61hbW9zIGhhYmVyIHVzYWRvIHVuYSBudWV2YSB2YXJpYWJsZQpgYGAKCkxhIGJhc2UgZGUgZGF0b3MgdGFtYmnDqW4gZXMgw7p0aWwgcGFyYSBwZW5zYXIgYWNlcmNhIGRlIGNpZXJ0b3MgdGlwb3MgZGUKdmFyaWFibGVzLiBQZW5zYWQgZW4gbGEgdmFyaWFibGUgYHJlZ2lvbmA6IGVzIHVuIHZlY3RvciBkZSBjYXJhY3RlcmVzLCBwZXJvCnF1ZXJyw61hbW9zIGNvbnNpZGVyYXJsbyBjb21vIHVuYSB2YXJpYWJsZSBkaXNjcmV0YSBlbiBsYSBxdWUgY2FkYSB2YWxvciAodW4KbsO6bWVybykgdGVuZHLDrWEgYXNvY2lhZGEgdW5hIGV0aXF1ZXRhIChlbCBub21icmUgZGUgbGEgcmVnacOzbikuIEVzdGEgZXN0cnVjdHVyYQpzZSBsbGFtYSBgZmFjdG9yYCBlbiBgUmAuCgpgYGB7ciBldmFsPUZBTFNFfQpzdGF0ZXMkcmVnaW9uIDwtIGZhY3RvcihzdGF0ZXMkcmVnaW9uKQpzdGF0ZXMkcmVnaW9uCmxldmVscyhzdGF0ZXMkcmVnaW9uKQpgYGAKCkRlcGVuZGllbmRvIGRlIGNvbiBxdWnDqW4gaGFibMOpaXMsIHB1ZWRlbiBhbWFybG9zIHUgb2RpYXJsb3MuCgojIyMgSW5wdXQvT3V0cHV0CgpQb2RlbW9zIGVzY3JpYmlyIGVuIGVsIGRpc2NvIGNvbiB2YWxvcmVzIHNlcGFyYWRvcyBwb3IgY29tYXMgdXNhbmRvIGxhIGZ1bmNpw7NuIGB3cml0ZS5jc3ZgLgoKYGBge3IgZXZhbD1GQUxTRX0Kd3JpdGUuY3N2KHN0YXRlcywgZmlsZT0ic3RhdGVzLmNzdiIpCmBgYAoKRWwgYXJndW1lbnRvIGBmaWxlYCBub3MgcGVybWl0ZSBlc3BlY2lmaWNhciBlbCBub21icmUgZWwgYXJjaGl2byBlbiBlbCBxdWUKZ3VhcmRhcmVtb3MgZWwgYGRhdGEuZnJhbWVgIGBzdGF0ZXNgLiBFbCBhcmNoaXZvIHNlIGd1YXJkYSBlbiBlbCBkaXJlY3RvcmlvIGVuCmVsIHF1ZSBlc3RlbW9zIHRyYWJhamFuZG8sIHBlcm8gcG9kcsOtYW1vcyBoYWJlciBlc3BlY2lmaWNhZG8gY3VhbHF1aWVyIG90cm8KZGlyZWN0b3JpbyBzaSBodWJpw6lzZW1vcyBwYXNhZG8gbGEgcnV0YSBjb21wbGV0YS4gUGFyYSBjb21wcm9iYXIgY3XDoWwgZXMgZWwKZGlyZWN0b3JpbyBkZSB0cmFiYWpvIHBvZGVtb3MgdXNhcjoKCmBgYHtyfQpnZXR3ZCgpCmBgYAp5IHBvZGVtb3MgY2FtYmlhciBlbCB2YWxvciB1c2FuZG8gYHNldHdkKClgLiAKClBhcmEgbGVlciBkYXRvcyBhIGBSYCBwb2RlbW9zIHVzYXIgbGEgZnVuY2nDs24gYHJlYWQuY3N2YC4KYGBge3IgZXZhbD1GQUxTRX0Kc3RhdGVzIDwtIHJlYWQuY3N2KCJzdGF0ZXMuY3N2IikKc3RhdGVzCmBgYAoKRWwgZm9ybWF0byBtw6FzIGNvbcO6biBwYXJhIGBSYCBkZSB0b2RvcyBtb2RvcyBlcyBzdSBmb3JtYXRvIGJpbmFyaW8gbmF0aXZvLCBxdWUKdXNhIGxhIGV4dGVuc2nDs24gYC5SRGF0YWAgeSBxdWUgc2UgZ2VuZXJhIHkgbGVlIHVzYW5kbyBsYXMgZnVuY2lvbmVzCmBzYXZlYCB5IGBsb2FkYC4KCmBgYHtyIGV2YWw9RkFMU0V9CnNhdmUoc3RhdGVzLCBmaWxlPSJzdGF0ZXMuUkRhdGEiKQpsb2FkKCJzdGF0ZXMuUkRhdGEiKQpzdGF0ZXMKYGBgCgpQZXJvIGBSYCBwdWVkZSBsZWVyICh5IGEgdmVjZXMgZXNjcmliaXIpIGRhdG9zIGVuIG90cm9zIGZvcm1hdG9zIGJpbmFyaW9zIGNvbW8KU3RhdGEsIFNBUywgU1BTUywgbyBpbmNsdXNvIEV4Y2VsLiBMYXMgZnVuY2lvbmVzIHBhcmEgZ2VzdGlvbmFyIGVzdG9zIGZvcm1hdG9zCnZpZW5lbiBlbiBlbCBwYXF1ZXRlIGBmb3JlaWduYCBxdWUgc2UgaW5zdGFsYSBjb24gYFJgLiBFY2hhZCB1biB2aXN0YXpvIGEgCltsYQpkb2N1bWVudGFjacOzbl0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL2ZvcmVpZ24vaW5kZXguaHRtbCkuIEVuCmJyZXZlIHZlcmVtb3MgY8OzbW8gdXNhciBwYXF1ZXRlcyBhZGljaW9uYWxlcyBlbnNlZ3VpZGEuCg==