Cuáles son las características biológicas que están marcadas en tu individual...
Data frame
1. Manejo de un marco de datos en R
Diego Torres
Estudiante de econom´ıa aplicada
COLEF
4 de julio de 2016
Resumen
Este trabajo tiene como objetivo explicar el manejo b´asico de un marco
de datos o data frame dentro del entorno R. A trav´es de ejemplos sim-
ples se pretende ense˜nar el manejo del objeto m´as com´un del lenguaje
R. Dado que, tener una base de datos sobre la cual actuar, es el primer
paso para cualquier an´alisis estad´ıstico y/o econom´etrico, se ofrece el
siguiente documento como referencia para los que se inician en el uso
de este programa estad´ıstico.
Palabras clave: Lenguaje R, data frame, LATEX, Sweave
Introducci´on
Este trabajo fue elaborado con R, utilizando la herramienta Sweave que per-
mite combinar codigo escrito en R con texto compilado en LATEX. El objetivo
es presentar un manejo simple del principal objeto utilizado en R: marco
de datos o data frame. Una vez realizadas estas primeras acciones se puede
avanzar en el an´alisis propio de los datos.
El trabajo est´a orientado para quienes se inician en el uso de R, utilizando
ejemplos muy sencillos se presenta y explica la manera de realizar tareas
sencillas, pero importantes para el an´alisis de datos.
La raz´on de escribir este trabajo se debe a los problemas que enfrent´e al
trabajar con la encuesta de ocupaci´on y empleo de M´exico, la cual ofrece una
1
2. gran cantidad de informaci´on en microdatos; son tantos datos que la encuesta
est´a dividida en dos partes y aunque hay herramientas m´as intuitivas para
trabajar con ´estos como Excel de Microsoft Office, ´este no puede cargar tanta
cantidad de informaci´on.
La estructura del informe se divide en tres apartados, en el primero se
aborda el tema de importaci´on de datos, posteriormente la manipulaci´on
inical de los mismos, en particular tareas como agregar o eliminar variables;
ordenar y filtrar variables; combinar marcos de datos. El tercer apartado trata
sobre la exportaci´on de un marco de datos, lo cual es ´util cuando se quiere
compartir la informaci´on con la que se trabajo o se quiere su portabilidad
para seguir trabajando en otra computadora. Tambi´en se ofrece una breve
conclusi´on sobre el trabajo.
1. Importar datos
Para tener un trabajo ordenado, recomiendo crear un proyecto y establecer
un directorio de trabajo para cada proyecto, lo anterior consiste en definir una
carpeta en la que se guardar´a toda la informaci´on de las sesiones. La creaci´on
de un nuevo proyecto se hace desde la barra de menus, dentro de la pesta˜na
file. Al hacerlo R pedir´a seleccionar un directorio de trabajo, se puede ele-
gir entre uno ya existente o nuevo, basta seguir las instrucciones para definirlo.
Uno vez hecho lo anterior, el siguiente paso es introducir los datos, para
ello se puede introducirlos a mano o importarlos desde una fuente externa,
veamos como hacerlo.
1.1. Introducir datos desde R
Los siguientes ejemplos muestran diferentes maneras de introducir los datos.
Ejemplo 1:
Se puede introducir cada vector o lista de manera individual y posteriormente
juntarlos dentro de un marco de datos.
> Precio<-c(20,21,22,24)
> Cantidad<-c(17000,16400,16000,14000)
2
3. > Exporta<-c(0,0,0,1)
> Empresa<-c("Hern´andez", "L´opes", "Torres", "Gonz´alez")
Se le ha indicado a R lo siguiente, la primera linea le informa que de-
be crear un vector llamado Precio, compuesto de cuatro valores num´ericos:
20, 21, 22 y 24; de manera similar para las siguientes dos l´ıneas, cambian-
do el nombre de la variable y sus valores, sin embargo, la cuarta l´ınea le
indica a R que cre´e una lista de caracteres, los argumentos est´an entre comillas.
Se puede utilizar la funci´on ls para conocer cu´antos y cu´ales objetos tene-
mos cargados en el entorno R, al utilizarlo se tiene lo siguiente:
> ls()
[1] "Cantidad" "Empresa" "Exporta" "Precio"
Ahora se requiere unir los objetos dentro de un marco de datos, se logra
usando la funci´on data.frame, abajo se ve la estructura, primero se escribe
el nombre con el que se guarda el marco de datos, le sigue el comando para
nombrar <-, la funci´on y entre parentesis los objetos que lo componen; con
print se visualiza el resultado.
> marco.datos<-data.frame(Cantidad, Empresa, Exporta, Precio)
> print(marco.datos)
Cantidad Empresa Exporta Precio
1 17000 Hern´andez 0 20
2 16400 L´opes 0 21
3 16000 Torres 0 22
4 14000 Gonz´alez 1 24
Otra forma de introducir los datos es directamente al data frame, sobre
todo si se trata de una peque˜na cantidad de datos, la forma ser´ıa la siguiente:
> marco.datos<-data.frame(Precio=c(20,21,22,24),
+ Cantidad=c(17000,16400,16000,14000), Exporta=c(0,0,0,1),
+ Empresa=c("Hern´andez", "L´opez", "Torres", "Gonz´alez"))
> print(marco.datos)
3
4. Precio Cantidad Exporta Empresa
1 20 17000 0 Hern´andez
2 21 16400 0 L´opez
3 22 16000 0 Torres
4 24 14000 1 Gonz´alez
1.2. Importar datos, archivo .csv
Si ya se cuenta con una base de datos creada en una fuente externa, s´olo
basta con importar los datos y darle una estructura en forma de data frame.
La forma de hacerlo ser´a:
Ejemplo 2:
Supongase que se tiene un documento ya creado con los datos, el cual
tiene una extensi´on .csv, adem´as de que est´a guardado dentro de nuestro
espacio de trabajo. Para importar se procede de la forma siguiente:
> datos<-read.csv("datos.csv", header= T, sep=",")
> print(datos)
> datos==marco.datos
La primera l´ınea se lee, de afuera para dentro, se guardar´a en datos el
data frame, la funci´on read.csv sirve para importar los datos de un archivo
con esa extensi´on, dentro del par´entesis se tiene primeramente el nombre
del documento a importar —si no se tuviera guardado dentro del espacio de
trabajo se deber´a escribir la ruta exacta donde se encuentra, como puede ser
”C : /Usuarios/Diego/Documentos/datos.csv”. El argumento header = T
indica que la primera l´ınea del documento contiene el t´ıtulo de las variables,
sep = ”, ” informa que se utiliza a la coma como factor de separaci´on, aunque
algunos documentos utilizan el tabulador, espacio en blanco, etc.
La segunda l´ınea imprime el marco de datos, en este caso omitimos los
resultados por cuesti´on de espacio. La tercera l´ınea compara los valores entre
los dos marcos de datos, dado que son los mismos R regresa solamente TRUE.
1.3. Importar datos, archivo .xls ´o .xlsx
Si los datos a importar provienen de un documento con la extensi´on de una
hoja de calculo, las utilizadas en Excel, la forma de importar los datos cambia.
4
5. Se requiere la instalaci´on de paquetes especiales para esta tarea.
Ejemplo 3
> install.packages("XLConnect", dependencies = T)
> library("XLConnect")
> datos2<-readWorksheetFromFile("datos.xlsx", sheet=1)
La primera l´ınea se escribe para instalar el paquete necesario para realizar
la importaci´on de los datos, la segunda carga el paquete para ser usado,
finalmente se tiene la instrucci´on para importar los datos, se lee: crea un
nuevo marco de datos y ll´amalo datos 2, utiliza la funci´on readWorksheet-
FromFile para obtener los datos, los argumentos de la funci´on indican donde
est´a el archivo a importar —”datos.xlsx”, sheet=1 le indica a R que se en-
cuentran en la primera hoja. Esta funci´on, como la mayor´ıa, permite realizar
m´as cosas agregando m´as argumentos, como puede ser indicar desde y has-
ta donde importar datos dentro de la hoja de calculo o definir un rango A1:D4.
El paquete XLConnect no es compatible con la versi´on 3.3.0, para saber
qu´e versi´on se tiene instalada se puede utilizar el comando R.version.string y
para saber la versi´on m´as reciente se debe visitar la p´agina oficial R project.
Ejemplo 4
> install.packages("xlsx", dependencies = T)
> library("xlsx")
> datos3<-read.xlsx("datos.xlsx", 1)
Este nuevo paquete permite hacer muchas m´as cosas que s´olo importar
datos, igual que los otros, la tercera l´ınea primeramente indica el nombre
del marco de datos —datos3—, luego est´a la funci´on read.xlsx, cuyo primer
argumento es el nombre del archivo a importar junto con su extensi´on, nueva-
mente si el archivo no est´a guardado dentro de nuestro espacio de trabajo se
debe especificar la ruta completa del archivo. El segundo argumento le dice a
R que ser´a la primera hoja del libro la que se desea importar.
2. Manipular un marco de datos
En esta secci´on se trabaja con la manipulaci´on de un marco de datos, espec´ı-
ficamente con agregar, ordenar, filtrar y eliminar las variables que integran al
5
6. data frame.
2.1. Agregar y eliminar variables
Un marco de datos se puede entender como un conjunto de vectores o listas
que se agrupan en una estructura similar a una matriz; por variable se deber´a
entender cada uno de los vectores o listas que componen el marco de datos, o
dicho en otras palabras se trata de las columnas. Para agregar una variable
o columna dentro del marco de datos existen diferentes m´etodos, los cuales
resuelven diferentes casos espec´ıficos aqu´ı vamos a presentar una manera muy
simple de hacerlo.
Siguiendo con los mismos datos de los ejemplos anteriores, se tiene un
marco de datos creado, llamado datos que contiene los valores de precio
y cantidad de cinco diferentes empresas, y un par de vectores o listas ya
generados y guardados dentro del espacio de trabajo, los cuales contienen
informaci´on sobre la condici´on de exportaci´on y el nombre de las empresas.
Precio Cantidad
1 20 17000
2 21 16400
3 22 16000
4 24 14000
[,1]
[1,] 0
[2,] 0
[3,] 0
[4,] 1
[,1]
[1,] "Hern´andez"
[2,] "L´opez"
[3,] "Torres"
[4,] "Gonz´alez"
Para agregar los dos vectores dentro de un marco de datos se presenta
una forma muy sencilla de hacerlo, esto es as´ı porque ya se tiene guardada
la informaci´on y su orden se corresponde con la estructura de los diferentes
objetos que se van a unir. En este caso utilizamos la ya conocida funci´on
6
7. data.frame, la indicaci´on del comando se lee: reescribe en el objeto datos
un marco de datos compuesto del antiguo m´as el vector Exporta y la lista
Empresa; adem´as imprime el resultado para verlo.
> datos<-data.frame(datos, Exporta, Empresa); print(datos)
Precio Cantidad Exporta Empresa
1 20 17000 0 Hern´andez
2 21 16400 0 L´opez
3 22 16000 0 Torres
4 24 14000 1 Gonz´alez
La eliminaci´on de un vector o lista de un marco de datos puede hacerse
de la siguiente forma:
> datos<-datos[-3]
> datos
Precio Cantidad Empresa
1 20 17000 Hern´andez
2 21 16400 L´opez
3 22 16000 Torres
4 24 14000 Gonz´alez
Se ha eliminado la tercera columna del marco de datos, otra manera de
hacerlo es:
> datos[2]<-NULL
> datos
Precio Empresa
1 20 Hern´andez
2 21 L´opez
3 22 Torres
4 24 Gonz´alez
Ahora se ha eliminado la segunda columna del marco de datos, tambi´en
se puede hacer la eliminaci´on atendiendo al nombre de la variable y no a su
posici´on:
7
8. > datos$Precio<-NULL
> datos
Empresa
1 Hern´andez
2 L´opez
3 Torres
4 Gonz´alez
La eliminaci´on de columnas puede ser simultanea, es decir, eliminar m´as
de una a la vez, siempre y cuando est´en ordenadas se puede usar el m´etodo:
Precio Cantidad Exporta Empresa
1 20 17000 0 Hern´andez
2 21 16400 0 L´opez
3 22 16000 0 Torres
4 24 14000 1 Gonz´alez
> datos[2:4]<-NULL
> datos
Precio
1 20
2 21
3 22
4 24
La salida que se arroja muestra que se han eliminado desde la columna dos
hasta la cuatro —2:4—; si las columnas a eliminar no estuvieran ordenadas,
a´un se puden eliminar en un s´olo paso, aunque se debe cambiar la estructura
de la orden:
> datos[c(1,3:4)]<-NULL
> datos
Cantidad
1 17000
2 16400
3 16000
4 14000
8
9. El resultado es la eliminaci´on en conjunto de las columnas 1, 3 y 4, dejando
unicamente la informaci´on sobre la cantidad. Si se desea eliminar una o m´as
filas se puede seguir la siguiente estructura [- ’filas a quitar’, - ’columnas a
quitar’].
La orden que se indica abajo elimina desde la fila tres hasta la cuatro,
utilizando -c(3:4), junto con la columna cuatro (-4); por tanto cuando se
utiliza el operados corchete, [filas,columnas], con una coma adentro se indica
tanto las filas como las columnas de un objeto en forma matricial.
> datos[-c(3:4),-4]
Precio Cantidad Exporta
1 20 17000 0
2 21 16400 0
2.2. Ordenar y filtrar variables
La ordenaci´on de las variables, dentro de un marco de datos, es sumamente
sencillo y puede hacerse atendiendo a la posici´on que ocupan o al nombre
asignado, utilizando el comando names() se obtienen los t´ıtulos de las varia-
bles guardadas dentro de un objeto y se puede ver el orden, para ordenar las
variables se utiliza el operador chochete [ ], igual que al eliminar columnas.
> names(datos)
[1] "Precio" "Cantidad" "Exporta" "Empresa"
> datos<-datos[c(4,2,3,1)]#atendiendo a la posici´on
> datos<-datos[c("Empresa", "Cantidad", "Exporta",
+ "Precio")]#utilizando sus nombres
> print(datos)
Empresa Cantidad Exporta Precio
1 Hern´andez 17000 0 20
2 L´opez 16400 0 21
3 Torres 16000 0 22
4 Gonz´alez 14000 1 24
9
10. Cuadro 1: Algunos operadores usados en R
Aritm´eticos Comparativos L´ogicos
+ suma < menor que ! Negaci´on l´ogica
- resta > mayor que & Y l´ogico
* producto <= menor o igual que | ´O l´ogico
/ divisi´on >= mayor o igual que
ˆ potencia == igual
% % m´odulo != diferente
Fuente: Tomado de Ahumada (2003)
Filtrar valores es m´as complicado ya que se requiere escribir una orden
l´ogica que sea entendida por el programa. Es necesario saber previamente
los operadores l´ogicos que permiten hacer el filtrado de los datos, el cuadro 1
presenta algunos operadores.
La funci´on subset() sirve para filtrar datos, la ventaja que tiene es su
simplicidad, ya que s´olo exige indicar el objeto de donde se objetienen los
datos y un criterio de selecci´on. Supongamos que se quiere conocer el nombre
de las empresas que realizan exportaciones junto con la empresa que ofrece
su producto a menor precio.
> subset(datos, Exporta==1 | Precio==min(Precio),
+ select = "Empresa")
Empresa
1 Hern´andez
4 Gonz´alez
La indicaci´on fue, del objeto datos extrae los elementos que cumplen
con dos requisitos, primero empresas que exportan (Exporta==1) adem´as,
tambi´en queremos (se utiliza el operador |), la empresa que ofrece el menor
precio (Precio==min(Precio)) lo cual se obtiene con ayuda de la funci´on
min(). Como s´olo queremos los nombres de las empresas que cumplen con
los dos requisitos, agregamos el argumento select que es igual a Empresa
porque ese es el t´ıtulo de la columna o variable que contiene los nombres de
las empresas, de no haber seleccionado una columna habr´ıa devuelto toda la
estructura del marco de datos.
10
11. Cuadro 2: Marcos de datos
Tabla A Tabla B Tabla C Tabla D
id age height gender id id math science id eyes
A 24 1.80 M A A 6.5 7.2 A blue
B 25 1.90 M B B 8.9 8.4 B brown
C 17 1.75 F C C 7.4 6.5 C green
D 19 1.65 F D D 9.2 8.7 D black
Fuente: tomado de R-econometr´ıa (2003)
2.3. Combinar marcos de datos
Suponga que se tienen diferentes marcos de datos y se desea unirlos res-
petando un orden definido por una variable clave, contenida en cada uno de
los data frame a unir. Para realizar esta tarea la funci´on merge() ofrece un
resultado satisfactorio, con el inconveniente de que la uni´on se hace una a la
vez, para simplificar la tarea se puede combinar con el comando Reduce();
para ejemplificar su utilizaci´on replicaremos un ejercicio que se encuentra en
la web, dentro del blog R-econometr´ıa.
> A <- data.frame(id = c("A", "B", "C", "D"), age = c(24, 25,
+ 17, 19), height = c(1.8, 1.9, 1.75, 1.65))
> B <- data.frame(gender = c("M", "M", "F", "F"), id = c("A",
+ "B", "C", "D"))
> C <- data.frame(id = c("A", "B", "C", "D"), math = c(6.5,
+ 8.9, 7.4, 9.2), science = c(7.2, 8.4, 6.5, 8.7))
> D <- data.frame(id = c("A", "B", "C", "D"), eyes = c("blue",
+ "brown", "green", "black"))
Con el c´odigo anterior se introducen cuatro diferentes marcos de datos,
cada uno de ellos comparte una misma variable (id), el cuadro 2 muestra
todos los marcos de datos, una carcateristica es que la variable id se encuentra
siempre ordenada en forma descendente, sin embargo para combinar los datos
ne se requiere tener los datos ordenados.
> nuevo.df<-Reduce(merge, list(A,B,C,D))
El c´odigo arroja un nuevo marco de datos de nombre: nuevo.df que contiene
siete variables: id, age, height, gender, math, science y eyes, todas las variables
se ordenaron en funci´on a la variable id. La combinaci´on de funciones permite
agilizar la combinaci´on, ya que permite combinar un gran n´umero de marcos
a la vez.
11
12. 3. Exportar un marco de datos
Una vez que se ha terminado de trabajar, total o parcialmente, con el marco
de datos, es conveniente conocer la forma de exportar la informaci´on, ya
sea para compartirla o trabajar en otro lugar y con otro equipo. La funci´on
apropiada para esa tarea es write(), aunque existen variaciones de la misma
como write.csv() y write.table(). La primera funci´on es la m´as sencilla usual-
mente utilizada para los objetos que son matrices, no propiamente un data
frame. La segunda funci´on exporta el data frame reconomiendo al punto (.)
como separador de decimales y a la coma (,) como separador de datos; la
versi´on write.csv2() se recomienda para los usuarios europeos, ya que cambia
la configuraci´on de los separadores. Con la ´utlima funci´on se puede modificar
todos los par´ametros.
> write.csv(nuevo.df, file="df.csv")
Conclusi´on
Este no es un trabajo exahustivo ni avanzado sobre el manejo de un marco
de datos, est´a orientado a quienes se inician en el uso de R. Los ejemplos son
ilustrativos y s´olo indican una manera de utilizar las funciones, ya que los
argumentos de las mismas permiten elaborar configuraciones m´as diversas,
atendiendo a las necesidades espec´ıficas de cada tarea. Para la elaboraci´on del
trabajo se consultaron diferentes fuentes, quedan enlistadas a continuaci´on.
Referencias
Unir varios data.frames en un s´olo paso: ’merge’ y ’re-
duce’. URL http://r-econ.blogspot.mx/2012/07/
unir-varios-dataframes-en-un-solo-paso.html.
R tutorial on reading and importing excel files into r.
URL https://www.datacamp.com/community/tutorials/
r-tutorial-read-excel-into-r.
Jorge A Ahumada. R para principiantes. University of Hawaii, 2003.
MA Morales. Generaci´on autom´atica de reportes con r y latex. Technical
report, Technical report, http://cran. r-project. org/doc/contrib/Rivera-
Tutorial Sweave. pdf, 2006.
12