Anda di halaman 1dari 40

Programacin en R

Minera de Datos I
Dr. Oldemar Rodrguez R.
En este documento se presenta una introduccin al
Paquete R, especialmente orientado a su lenguaje de
programacin, con nfasis en aplicaciones a la Minera
de Datos.
Escuela de Informtica Universidad Nacional
09/03/2013

La consola y el editor de R
Lo primero que nos aparece es una ventana, tambin llamada consola,
donde podemos manejar R mediante la introduccin de cdigo. Por
ejemplo, podemos escribir 2+2 en ella, pulsando Intro, lo que nos
devolver en la misma consola el valor 4.
Sin embargo, esta no es la manera ms eficiente de trabajar en R. A
poco que estemos realizando un trabajo de mediana complejidad, ser
muy til manejar todas las entradas que solicitemos a R en un entorno
donde podamos corregirlas, retocarlas, repetirlas, guardarlas para
continuar el trabajo en otro momento, etc. Esta es la funcin del editor
de R.

Es posible incluir comentarios que R no leer si utilizamos lneas que


comiencen con el carcter #. Por el contrario, si escribimos cualquier
orden no antecedida de # y queremos solicitar la respuesta a R,
podemos hacerlo mediante la tecla F5 situndonos en cualquier
posicin de lnea. Asimismo, si seleccionamos con el ratn ms de
una lnea, stas pueden ser ejecutadas simultneamente tambin con
F5 o Control+R. La utilidad de un script o guin de trabajo radica en
que podemos modificar nuestras lneas de cdigo con comodidad y
guardarlas para el futuro.

Instalacin e introduccin a R Commander


R Commander es una interfaz tipo ventana que cubre la mayor parte
de los anlisis estadsticos ms habituales en unos mens
desplegables a los que estamos bastante acostumbrados, ya que la
mayora de los programas que utilizamos en cualquier sistema
operativo son de este tipo. Podemos decir que es una manera de
manejar R sin necesidad de aprender su cdigo o casi nada de l, lo
cual lo hace bastante prctico cuando se est aprendiendo a usarlo.
Adems, una de las funcionalidades que podramos destacar como
ms afortunadas de R Commander es que, a pesar de que permite
estos atajos mediante sus mens para no utilizar el cdigo de R,
escribe el cdigo de las operaciones realizadas en una ventana de
sintaxis o ventana de instrucciones.
R Commander se puede instalar con la instruccin:
> install.packages("Rcmdr", dependencies=TRUE)
O bien, la instalacin de R Commander se puede realizar en 4
sencillos pasos:
En la consola de R seleccionamos Paquetes Instalar paquete(s).
Nos saldr una ventana solicitando un mirror desde el que descargar
los paquetes, de entre los cuales elegimos. Se abrir una ventana en
la que aparecen todos los paquetes disponibles para R.
Seleccionaramos en principio, el paquete Rcmdr
aunque
necesitaremos tambin los plugins adicionales llamados RcmdrPlugin.
Cargamos R Commander, introduciendo el siguiente cdigo en la
consola de R:
library(Rcmdr)

Instalacin de paquetes desde archivos zip


locales.
En ocasiones necesitamos instalar libreras de R sin estar conectados
a internet. En tal caso, si disponemos del paquete que contiene la
librera en formato comprimido zip (lo que presupone que nosotros
mismos hemos descargado dicho paquete previamente de internet, o
que nos ha sido facilitado de alguna otra manera, por ejemplo en un
CD), podemos proceder muy sencillamente a su instalacin
simplemente eligiendo la opcin:
Paquetes Instalar paquete(s) a partir de archivos zip locales...
del men principal de R. En la ventana que nos muestra slo
tendremos que elegir el directorio y el paquete que deseamos instalar.
Si deseamos instalar varios podemos seleccionarlos todos a la vez.

Preliminares sobre el lenguaje de R


Algunos tipos de objetos de R
En el lenguaje de R, los elementos u objetos que se vayan defiendo,
bien por nosotros mismos, bien como resultado del programa, pueden
y deben ser distinguidos para su uso correcto. Concretamente, vamos
a hablar de:

Vectores
Matrices
Factores
Hojas de datos (data frames)
Listas

Vectores
Un vector en R puede contener una coleccin de nmeros o de
caracteres no numricos. Para definir un vector, por ejemplo, el vector
x = (1, 3, 5), usaramos la orden:
> x<-c(1,3,5)
As podremos llamar al vector x en el futuro. Observemos que se
utiliza el operador asignacin <- y no el operador = que se reserva
para otro tipo de definiciones. Observemos tambin que es la funcin
de concatenacin c() la que construye el vector.
Tambin es posible definir un vector de nmeros consecutivos, por
ejemplo, el vector (1, 2, 3, 4, 5) mediante 1:5. De forma ms general, la
funcin seq() permite definir secuencias desde un inicio hasta un n con
una determinada separacin entre ellos. Por ejemplo,
> y<-seq(-3,3,0.5)
> y
retorna:

[1] -3.0 -2.5 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0
1.5 2.0 2.5 3.0
Es til la funcin rep() para definir vectores como repeticin de otros
vectores. Por ejemplo, rep(0,100) devolvera un vector de 100 ceros. O
tambin, rep(1:3,3) devolvera [1] 1 2 3 1 2 3 1 2 3.
Si queremos saber la longitud de un vector, usaremos length(). Por
ejemplo, length(y) nos devolvera el valor 13.
Decir, por ltimo, que no hay problema en que un vector, en vez de
incluir nmeros, incluya caracteres, siempre que stos estn entre
comillas. Por ejemplo, podramos definir el vector:
> genero<-c("Mujer","Hombre")

Factores
Los factores son un tipo especial de vectores que permiten analizar
variables Estadstica y la Minera de Datos nominales o cualitativas
(como veremos ms adelante en el curso). Por ejemplo, la variable
Provincia cuyas modalidades o posibles valores son: "San
Jos","Alajuela","Heredia","Cartago","Puntarenas","Limn","Guanacast
e". En R se podra tener:
> provincia<factor(c("Alajuela","Heredia","Alajuela","Cartag
o","Heredia"))
> provincia
Visto como una tabla Estadstica o de Minera de Datos sera:
Individuo
1
2
3
4
5

Provincia
Alajuela
Heredia
Alajuela
Cartago
Heredia

O bien, an mejor le podramos estableces las modalidades de la


variable con el comando levels:
> provincia2<factor(c("Alajuela","Heredia","Alajuela","Cartag
o","Heredia"), levels=c("San
Jos","Alajuela","Heredia","Cartago","Puntarenas
", "Limn","Guanacaste"))
> provincia2

Matrices
Una matriz se define mediante la funcin matrix() a la que hay que
especificarle los elementos y la dimensin. Por ejemplo, para definir la
matriz:

Se hace usando:
> matriz<-matrix(c(1,2,3,4,5,6,7,8,9),3,3)
Las dimensiones (n de filas y columnas) de la matriz pueden
obtenerse mediante la funcin dim(). Por ejemplo, dim(matriz)
proporcionara el valor 3 3. Si queremos llegar a elementos concretos
de una matriz lo haremos utilizando corchetes para indicar las y
columnas. Por ejemplo, matriz[2,3] devolvera el valor 8, matriz[1:2,2:3]
devolvera

Y la instruccin matriz[,c(1,3)] devuelve una matriz con las columnas 1


y 3, como sigue:

Por otra parte, tanto para vectores como para matrices, funcionan las
operaciones suma y diferencia sin ms complicaciones. En el caso del
producto, sin embargo, hay que clarificar que, por ejemplo,
matriz*matriz devuelve la multiplicacin elemento a elemento, es
decir:

Mientras que matriz%*%matriz s devuelve el producto matricial, esto


es,

Hojas de datos (Data Frame)


Las hojas de datos constituyen la manera ms eficiente mediante la
cual R puede analizar un conjunto de datos estadsticos.
Habitualmente se configuran de tal manera que cada fila se refiere a
un individuo o unidad estadstica, mientras que cada columna hace
referencia a una variable analizada.

Matemticas

Ciencias Espaol

Historia

Educacin
Fsica

Luca

7.0

6.5

9.2

8.6

8.0

Pedro

7.5

9.4

7.3

7.0

7.0

Ins

7.6

9.2

8.0

8.0

7.5

Luis

5.0

6.5

6.5

7.0

9.0

Andrs

6.0

6.0

7.8

8.9

7.3

Ana

7.8

9.6

7.7

8.0

6.5

Carlos

6.3

6.4

8.2

9.0

7.2

Jos

7.9

9.7

7.5

8.0

6.0

Sonia

6.0

6.0

6.5

5.5

8.7

Mara

6.8

7.2

8.7

9.0

7.0

Esa configuracin hace que visualmente una hoja de datos parezca


una matriz. Sin embargo, como objetos de R, son cosas distintas.
Vamos a ver cmo se construye una hoja de datos con los datos de 3
personas, que incluye el color de sus ojos, su peso y su altura como
factores (variables estadsticas). Empezaramos definiendo el color de
los ojos:
> ojos<factor(c("Azules","Marrones","Marrones"),
levels=c("Azules","Marrones","Verdes","Negros"))
Supongamos que los pesos y las alturas son, respectivamente, 68, 75,
88 y 1.65, 1.79, 1.85. Entonces, definiramos la hoja de datos
mediante:
> datos<data.frame(Color.ojos=ojos,Peso=c(68,75,88),Altu
ra=c(1.65,1.79,1.85))

Color.ojos
1
Azules
2
Marrones
3
Marrones

Peso
68
75
88

Altura
1.65
1.79
1.85

As, tendremos tres variables, llamadas Color.ojos, Peso y Altura.


Podemos forzar a que una matriz se convierta en una hoja de datos
mediante la funcin as.matrix. Por ejemplo:
> datos2<-as.data.frame(matriz)
Convertira matriz en una hoja de datos.
V1 V2 V3
1 1 4 7
2 2 5 8
3 3 6 9

Si ponemos names(datos2) veremos los nombres que para las


variables ha elegido por defecto R:
[1] "V1" "V2" "V3"
Si queremos modificar esos nombres de las variables, podemos usar
de nuevo la funcin names(), forzando la asignacin:
> names(datos2)<-c("Variable 1","Variable
2","Variable 3")
La manera en que podemos acceder a los elementos de una hoja de
datos es doble:
Podemos usar el mismo mtodo que para las matrices.
Podemos usar el operador $, de la siguiente manera. Para
obtener los datos de la variable Color.ojos, por ejemplo,
escribiramos datos$Color.ojos.

Para saber el nmero de filas y de columnas de una hoja de datos


utilizaremos las funciones nrow() y ncol(). Por ejemplo, ncol(datos) es
3.
Qu ocurre si no estamos seguros de si un objeto de R es una hoja
de datos o una matriz?
Existen funciones que nos informan sobre el tipo de los objetos. En el
caso que nos ocupa, is.vector(), is.matrix() e is.data.frame(). As, por
ejemplo, is.data.frame(matriz) devolver FALSE, mientras que
is.data.frame(datos2) devolver TRUE. O bien se puede utilizar el
operador class que devuelve directamente la clase a la que pertenece
el objeto o instancia. Por ejemplo:
> class(matriz)
[1] "matrix"
> class(datos2)
[1] "data.frame"
Ms adelante estudiaremos con ms detalle la Programacin
Orientada a Objetos en R.

Listas
Como ejemplo, considere una base de datos de empleados.
Supongamos que por cada empleado se almacena el nombre, salario
y un booleano que indica pertenencia o no al grupo (unin) de
empleados. Podramos iniciar nuestra base de datos en vaco como
sigue:
> j <- list()
Para insertar el primer empleado se puede hacer como sigue:
> j <- list(nombre="Luis", salario=55000,
union=T)
> j
$nombre
[1] "Luis"

$salario
[1] 55000
$union
[1] TRUE
En realidad, los nombres de los elementos, por ejemplo, "sueldo", son
opcionales. Uno tambin podra hacerlo:
> j2 <- list("Luis",
> j2

55000, T)

[[1]]
[1] "Luis"
[[2]]
[1] 55000
[[3]]
[1] TRUE
Los nombres de los elementos en una lista se llaman tags. Estos se
pueden obtener con el operador names():
> names(j)
[1] "nombre"

"salario" "union"

Para obtener los valores se usa unlist():


> ulj
> ulj

<- unlist(j)

nombre salario
"Luis" "55000"

union
"TRUE"

El retorno de unlist() es un vector modo carcter, o sea, un vector de


strings.

Las listas de R tienen cierta semejanza a los struct del lenguaje C,


definamos, por ejemplo, una lista x con dos elementos
> x <- list(abc="Luis",
> x

de=5)

As la lista x tiene dos elementes, con x$abc = Luis y x$de = 5. O sea


el operador $ en R funciona como el operador . en C.
> names(x)
[1] "abc" "de"
> ulx <- unlist(x)
> x
$abc
[1] "Luis"
$de
[1] 5
> class(ulx)
[1] "character"
El smbolo $ se utiliza para designar elementos con nombre de una
lista, pero tambin [[ ]] trabaja para hacer referencia a un solo
elemento.
Recordemos que j est definido por j <- list(nombre="Luis",
salario=55000, union=T), entonces:
> j
$nombre
[1] "Luis"
$salario
[1] 55000
$union
[1] TRUE

> j$salario
[1] 55000
> j[["salario"]]
[1] 55000
> j[[2]]
[1] 55000
El operador [ ] se utiliza para extraer sub-listas que son retornadas
como listas, por ejemplo:
> j[1]
$nombre
[1] "Luis"
> j[1:2]
$nombre
[1] "Luis"
$salario
[1] 55000
Otro ejemplo:
> car<-j[[1]]
> cdr<-j[2:length(j)]
> car
[1] "Luis"
> cdr
$salario
[1] 55000
$union
[1] TRUE
> class(car)
[1] "character"
> class(cdr)
[1] "list"

Uno puede agregar y eliminar elementos dinmicamente:


> z <- list(a="abc",b=12)
> z
$a
[1] "abc"
$b
[1] 12
> z$c =
> z

$a
[1] "abc"
$b
[1] 12
$c
[1] 1
Tambin se puede agregar elementos usando los ndices del vector:
> z[[4]]<-28
> z
$a
[1] "abc"
$b
[1] 12
$c
[1] 1
[[4]]
[1] 28
> z[5:7]<-c(FALSE,TRUE,FALSE)
> z
$a

[1] "abc"
$b
[1] 12
$c
[1] 1
[[4]]
[1] 28
[[5]]
[1] FALSE
[[6]]
[1] TRUE
[[7]]
[1] FALSE
Los elementos de un vector pueden ser eliminados usando NULL, por
ejemplo:
> z$b <- NULL
> z
$a
[1] "abc"
$c
[1] 1
[[3]]
[1] 28
[[4]]
[1] FALSE
[[5]]
[1] TRUE
[[6]]
[1] FALSE

Funciones ms comunes en R
En este apartado se destacan algunas funciones de R que se usan en
el resto de este documento. Por ejemplo:
sum() proporciona la suma de los elementos del argumento. As,
teniendo en cuenta que x = (1, 3, 5), sum(x) dara el valor 9.

cumsum() proporciona un vector con la suma acumulada del vector


argumento, por ejemplo, cumsum(x) dara [1] 1 4 9
rowSums() y colSums() suman, por filas y por columnas,
respectivamente, los datos de una hoja de datos.
prod() y cumprod() son el equivalente a sum() y cumsum() para el
producto.
sqrt() es la funcin raz cuadrada.
log() es la funcin logaritmo natural o neperiano.
log10() es el logaritmo en base 10.
exp() es la funcin exponencial.
max() y min() proporcionan el mximo y el mnimo del argumento
(habitualmente, un vector).
sort() proporciona la ordenacin de un vector de menor a mayor.

Operaciones lgicas
A continuacin se enumeran los operadores lgicos ms utilizados: <,
>, <= y >= son los operadores menor, mayor, menor que y mayor que,
respectivamente, == es el operador de comparacin, & y | son los
operadores y y o, respectivamente. Por ejemplo;
> vec <- c(1, 3, 5)
> vec
[1] 1 3 5
> vec>=1.5
[1] FALSE TRUE TRUE

Manejo de Datos
Introduccin de datos nuevos
En una situacin general en la que se tiene informacin sobre n
individuos y que se refiere a k variables. En ese caso, la forma en que
la Estadstica y la Minera de Datos usa para organizar toda esta
informacin es una matriz de dimensiones n k en la que en cada fila

se representa un individuo o unidad estadstica y en cada columna se


representa una variable, como se muestra a continuacin:

Matemticas

Ciencias Espaol

Historia

Educacin
Fsica

Luca

7.0

6.5

9.2

8.6

8.0

Pedro

7.5

9.4

7.3

7.0

7.0

Ins

7.6

9.2

8.0

8.0

7.5

Luis

5.0

6.5

6.5

7.0

9.0

Andrs

6.0

6.0

7.8

8.9

7.3

Ana

7.8

9.6

7.7

8.0

6.5

Carlos

6.3

6.4

8.2

9.0

7.2

Jos

7.9

9.7

7.5

8.0

6.0

Sonia

6.0

6.0

6.5

5.5

8.7

Mara

6.8

7.2

8.7

9.0

7.0

Otro ejemplo sera, consideremos que tenemos la puntuacin en una


prueba escrita X y en una prueba oral Y, de una muestra de 10
personas. Su matriz de datos es la siguiente:
161
203
235
176
201
188
228
211
191
178

159
206
241
163
197
193
209
189
169
201

En esta matriz la primera columna corresponde a la variable X y la


segunda a la variable Y, mientras que, por ejemplo, la fila 4
corresponde a la persona N4 de la muestra. En resumen, los
individuos estn en las filas y las variables en las columnas.

Introduccin de la hoja de datos mediante cdigo


Empezaremos introduciendo los datos de las variables X e Y en forma
de vector. Adems, incluimos una tercera variable que es el gnero de
cada persona que hizo la prueba:
x<-c(161,203,235,176,201,188,228,211,191,178)
y<-c(159,206,241,163,197,193,209,189,169,201)
genero<factor(c("Hombre","Mujer","Hombre","Hombre","Hom
bre","Mujer","Mujer","Mujer","Hombre","Hombre"))
Ahora se define la hoja de datos:
Datos.Pruebas<data.frame(Prueba.escrita=x,Prueba.oral=y,Genero=gen
ero)
As, hemos llamado a la hoja de datos Datos.Pruebas. Por su parte, a
la primera variable la hemos llamado Prueba.escrita, la segunda
Prueba.oral y la tercera variable Genero. Tenemos, por tanto, la hoja
de datos que se llama Datos.Pruebas, que, a su vez, contiene dos
variables, Prueba.escrita, Prueba.oral y Genero. Recordemos que
si queremos ahora trabajar con alguna de esas tres variables tenemos
dos opciones:
1. Podemos referirnos a cualquiera de ellas poniendo el nombre de
la hoja seguido del smbolo $ y del nombre de la variable. Es
decir:
Datos.Pruebas$Prueba.escrita
Datos.Pruebas$Prueba.oral
Datos.Pruebas$Genero

2. Adicionalmente, si no queremos escribir en demasiadas


ocasiones Datos.Pruebas$, podemos hacer que la hoja de datos
se convierta en la hoja de datos activa mediante la funcin
attach:
attach(Datos.Pruebas)
Prueba.escrita
Prueba.oral
Genero
detach(Datos.Pruebas)
Si queremos referirnos a un elemento concreto de una hoja de datos,
ya sabemos que tambin podemos identificarlo por su posicin dentro
de la matriz que constituye la hoja de datos. Por ejemplo, supongamos
que queremos saber el resultado de la prueba escrita (1 variable) del
5 individuo de la muestra. En ese caso pondramos en la consola:
Datos.Pruebas$Prueba.escrita[5]
O tambin,
Datos.Pruebas[5,1]

Introduccin de una hoja de datos desde un archivo


*.CSV
Supongamos que tenemos los datos en una hoja Excel en un archivo
*.xls o *. xlsx, tal y como se muestra a continuacin:

Lo primero que se debe hacer es convertir el archivo en un archivo


*.csv separado por punto y como ; como se muestra a continuacin:

Mediante Cdigo R el archivo se puede leer como sigue, en la variable


Datos quedar almacenada la tabla de datos como un Data Frame:
setwd("C:/Users/Oldemar/Google Drive/Curso Mineria Datos II Optativo/Datos")
dir("C:/Users/Oldemar/Google Drive/Curso Mineria Datos II Optativo/Datos")
Datos<read.table("EjemploEstudiantes.csv",header=TRUE,sep=";",na.
strings="NA",dec=".",row.names=1,strip.white=TRUE)
Datos

Introduccin de una hoja de datos en R Commander


Recuerde que para cargar R Commander se ejecuta library(Rcmdr).
Para introducir los datos en R Commander elegimos Nuevo conjunto
de datos del men Datos. Eso abre el editor de datos que, en primer
lugar, nos pedir un nombre para la matriz de datos (ahora hemos
elegido Pruebas) y a continuacin abrir una ventana con casillas
parecida a una hoja de clculo de Excel. En esta hoja debemos
introducir los datos con la misma estructura que tiene la matriz de
datos que acabamos de escribir, con los individuos en las filas y las
dos variables en dos columnas.
Una vez introducidos los datos, debemos nombrar las variables, es
decir, las columnas, con nombres sencillos que nos recuerden a qu
variable corresponde cada columna. Para ello clicamos con el ratn

sobre la parte superior de cada columna, donde R Commander


nombra por defecto las variables como var1, var2, etc. y escribimos
otros nombres ms acordes con nuestros datos.
Por ltimo, fijmonos que en la ventana donde R Commander nos
permite cambiar el nombre de la variable aparece sealada la opcin
numeric. Eso es porque al haber introducido datos numricos (No
deben introducirse nombres que incluyan espacios, ni caracteres
extraos, ni muy largos) programa ya ha asimilado que es una variable
numrica. Si hubiramos introducido datos cualitativos mediante
caracteres no numricos, aparecera activada la opcin character. En
ese caso, adems, R Commander considerar que una variable tipo
character es un factor. Para terminar, cerramos la ventana del editor
de datos. En ese momento, R habr almacenado los datos
introducidos convirtindolos en lo que R Commander llama el conjunto
de datos activo y que antes, con el cdigo, hemos logrado con la
funcin attach(). Obsrvese que justo encima de la ventana de
instrucciones aparece ahora una pestaa informativa que pone
Conjunto de datos: Pruebas.
Esta ventana especifica que, en efecto, el conjunto de datos activo en
este momento es el que nosotros hemos llamado Pruebas.
Finalmente, podemos retocar estos datos pulsando la pestaa Editar
conjunto de datos que hay justo sobre la ventana de instrucciones o
simplemente visualizarlos pulsando la pestaa Visualizar conjunto de
datos.

Almacenamiento de un conjunto de datos mediante


cdigo
Debemos tener presente que el conjunto de datos que hemos
introducido est slo almacenado temporalmente, y que si cerramos R
sern eliminados. Para que esto no ocurra podemos guardarlos y
cargarlos con posterioridad. En este sentido, la funcin save() nos
permite almacenar varios objetos, por ejemplo, una o varias hojas de
datos, en archivos para poder utilizarlos con posterioridad. Su uso es
muy sencillo. Basta con indicarle qu objetos queremos guardar y el
nombre del archivo con el que lo queremos guardar.

Aunque no es imprescindible, es recomendable que este fichero tenga


las extensiones propias de los ficheros de datos de R, que son .RData
o .rda. Vamos a aplicarlo a la hoja de datos con los resultados de las
dos pruebas:
setwd("F:/Olde/Curso Mineria Datos I Optativo/Datos")
save(Datos.Pruebas,file="Pruebas.RData")
1. La funcin setwd() permite cambiar el directorio donde estamos
trabajando (working direc tory). Hay que tener en cuenta que los
datos se guardarn en ese directorio.
2. Despus hemos ejecutado la funcin save() para guardar
Datos.Pruebas en el fichero Pruebas.RData.
Si reiniciamos el programa o borramos todos los objetos mediante
rm(list=ls(all=TRUE)), al poner Datos.Pruebas dara error, porque tal
objeto ya no existe. Sin embargo, al cargar el archivo Pruebas.RData
mediante la funcin load(), recuperamos la hoja de datos:
load("Pruebas.RData")
Sobre el directorio de trabajo En todo el manejo de archivos,
habitualmente de datos, el usuario que comienza con R debe tener en
cuenta con atencin cul es el directorio de trabajo (o working
directory). Suelen ser muchos los problemas que se encuentran
cuando no se tiene este concepto claro, as que vamos a centrarnos
un poco en l. En primer lugar, como hemos dicho, lo ms importante
es situar a R en el directorio de trabajo de nuestro ordenador, es decir,
el sitio donde localizaremos todos los datos, los resultados, los
grficos, etc., de nuestro anlisis. Cada trabajo distinto se site en un
directorio distinto. Podemos situarnos en un directorio concreto de dos
formas:
1. Mediante la funcin setwd(). Como argumento de esta funcin
debemos escribir la ruta que conduce en nuestro ordenador al
directorio de trabajo, entre comillas. Por ejemplo,
setwd("F:/Olde/Curso Mineria Datos I - Optativo/Datos")
2. Utilizando la opcin Cambiar dir... del men Archivo de la
consola de R.

Y cmo podemos saber en un momento dado si estamos en el


directorio correcto? Mediante la funcin getwd().

Almacenamiento de un conjunto de datos en R


Commander
Para guardar una hoja de datos en R Commander, seleccionamos en
el men Datos la opcin Conjunto de datos activos y, dentro de sta,
Guardar el conjunto de datos activo.

Si posteriormente queremos cargar estos datos, no tenemos ms que


usar la opcin del men Datos Cargar conjunto de datos y buscar el
archivo correspondiente mediante la ventana del explorador que se
abre.

Datos faltantes
Qu ocurre si, por alguna razn, nos falta el dato de una variable
referida a un individuo concreto? Eso se conoce en Minera de Datos
como dato faltante o missing data. Para R es muy fcil identificar
esos datos cuando los introducimos a mano: basta con dejar esa
casilla vaca, en cuyo caso el editor de datos escribir en ella NA,
acrnimo de Not Available.

Si estamos trabajando con cdigo, el carcter para un dato faltante es


tambin NA. Por ejemplo, si tengo un vector de 5 datos y el 3 de ellos
es un dato faltante, debera escribir, por ejemplo:
c(3,2,NA,2,8)

Importar datos
Hay que decir que introducir datos a mano puede convertirse en una
tarea muy pesada a poco que el nmero de casos o de variables sea
medianamente alto. Hoy en da, por otra parte, es bastante comn
tener los datos almacenados en algn tipo de formato electrnico y la
clave del xito para aprovechar estos recursos y no tener que
introducir los datos manualmente radica en hacer que nuestro
programa de Minera de Datos, en este caso R, lea estos datos.
Los formatos de archivo ms habituales en los que nos podemos
encontrar unos datos son, en primer lugar, los archivos tipo texto (con
extensin .txt) y, en segundo lugar, los archivos de Microsoft Excel(con
extensin .xls). La extensin que por defecto asigna R a sus archivos
de datos es RData, mientras que R Commander utiliza por defecto rda.
Sin embargo, no hay ningn problema con que desde R se guarden o
se lean archivos con extensin rda ni para que R Commander guarde
o lea archivos con extensin RData.

Importar datos de tipo texto


Los archivos de tipo texto que contienen datos suelen tener una
estructura en la que los individuos estn en las filas y las variables
estn separadas por algn tipo de carcter, tales como comas,
tabulaciones, espacios u otros. Adems, es posible que la primera fila
contenga los nombres de las variables. Y, por ltimo, tambin es
necesario fijarse en cmo estn especificados los decimales, si los
hay.
Conocer a priori estas tres cuestiones, el hecho de que el archivo
incluya los nombres de las variables, el carcter que separa las
variables y el carcter que distingue los decimales son las necesarias
para importar los datos.

La funcin que R utiliza para importar archivos de tipo texto es


read.table. Esta funcin tiene multitud de opciones, pero nosotros
vamos a destacar slo las que creemos que son ms importantes.
Concretamente, la sintaxis de dicha funcin, en general, sera la
siguiente:
read.table(archivo,header=FALSE,sep="",dec=".",na.st
rings="NA")
En esta lnea:
archivo sera el nombre del archivo que queremos importar.
Opcionalmente, se puede importar desde el portapapeles, en
ese caso, el valor debe ser "Clipboard".
header puede tomar el valor TRUE, si sabemos que la primera
lnea del archivo (cabecera) contiene los nombres de las
variables, o el valor FALSE, si no lo hace.
sep se reere al carcter que separa los datos. En nuestro
ejemplo son tabulaciones, luego deberemos poner \t. El valor por
defecto es vaco, que corresponde a uno o ms espacios en
blanco o a tabulaciones.
dec se refiere al carcter que separa los nmeros decimales.
Hay que tener cuidado con l porque en espaol lo correcto es
separar con comas, pero en el mundo anglosajn lo es hacerlo
con puntos. De hecho, el punto es la opcin por defecto.
na.strings se refiere al carcter que en el archivo original
identifica a los datos faltantes. Por defecto, se supone que un
dato faltante aparecer como NA, pero podemos poner cualquier
otro. Si el dato faltante simplemente no aparece en el archivo
original, ser entendido como tal dato faltante sin necesidad de
especificar nada ms.
Por ejemplo:
setwd("F:/Olde/Curso Mineria Datos I Optativo/Datos")
Datos<read.table("NotasEscolares.txt",header=TRUE,sep="
",dec=".")

Datos
Podemos hacer lo mismo si abrimos con el bloc de notas el archivo
NotasEscolares.txt, seleccionamos y copiamos todos los datos
(seleccionamos con el ratn y pulsamos Control+C) y, una vez que
estos datos estn en el portapapeles, ejecutamos.
Datos<read.table("Clipboard",header=TRUE,sep="",dec=".")

Mediante R Commander
Nos vamos a la opcin del men Datos Importar datos desde
archivo de texto o portapapeles...

Importar archivos de tipo Excel


Para importar archivos de tipo Excel5, debemos previamente instalar
el paquete RODBC6, mediante el men de instalacin de paquetes de
R. Vamos a ilustrar el procedimiento de instalacin de un archivo
llamado Concentraciones.xls.
setwd("F:/Olde/Curso Mineria Datos I
Optativo/Datos")
library(RODBC)
conexion<-odbcConnectExcel("NotasEscolares.xls")
Datos<-sqlQuery(channel=conexion,"select * from
[TablaNE$]")
close(conexion)
Datos
Observemos lnea a lnea:

La primera instruccin define el directorio de trabajo


La segunda instruccin carga el paquete RODBC para que la
funcin odbcConnectExcel() est disponible.
La tercera instruccin establece una conexin con el archivo
NotasEscolares.xls.
La cuarta instruccin selecciona la Hoja llamada TablaNE de ese
archivo de Excel.
La quinta instruccin cierra la conexin, que ya no es necesaria.
Datos pasa a ser una hoja de datos manejable por R.

Mediante R Commander
En el caso de los archivos tipo Excel, R Commander no necesita que
le digamos nada, ya que detecta automticamente los nombres de las
variables si estn presentes. No obstante, stos no deben incluir
caracteres extraos, y deben estar todos los nombres de todas las
variables o ninguno; en cualquier otro caso, la importacin podra ser
invlida. Tan slo tenemos que utilizar la opcin del men:
Datos Importar datos desde conjunto de datos
Excel

Exportar datos
Existe la posibilidad de exportar el conjunto de datos activo para que
pueda ser ledo por cualquier otro programa. El formato ms sencillo
en que podemos hacerlo mediante R es el formato de texto .txt.
La funcin write.table permite crear archivos de texto que contienen
hojas de datos de R. La sintaxis de dicha funcin, con las opciones
ms habituales, es la siguiente:
write.table(hoja,file="fichero.txt",sep="\t",na="NA"
,dec=".",row.names=TRUE, col.names=TRUE)
Vamos a comentar los detalles de cada argumento:

hoja se reere al nombre de la hoja de datos que queremos


exportar.
fichero.txt ser el nombre del chero donde queremos exportar los
datos.
sep="\t" quiere decir que los datos estarn separados por una
tabulacin. Tambin podemos poner una coma, un espacio, ...
na="NA" se refiere a la forma en que se guardarn los dato
faltantes. Si queremos que los deje en blanco, pondremos na="".
dec="." indica el carcter con el que se separan los decimales.
row.names indicar si queremos que incluya en el chero los
nombres de las filas.
col.names indicar si queremos que se incluyan los nombres de
las variables.
Por ejemplo para guardar la tabla Datos en el archivo Pruebas.txt
ejecute:
write.table(Datos,file="Pruebas.txt",sep="\t",row.na
mes=FALSE,col.names=TRUE)

Mediante R Commander
Utilizaremos la opcin del men:
Datos Conjunto de datos activo Exportar el
conjunto de datos activo.

Programacin en R
Ejemplo 1: Este es un ejemplo de un programa para calcular las
races reales de una ecuacin cuadrtica. Note el uso de # para
comentar el cdigo.
# limpia workspace
rm(list=ls())
# entrada
a2 <- 2
a1 <- 1
a0 <- -3
# clculos
raiz1 <- (-a1 + sqrt(a1^2 - 4*a2*a0))/(2*a2)
raiz2 <- (-a1 - sqrt(a1^2 - 4*a2*a0))/(2*a2)
# salida
show(c(raiz1, raiz2))
Salida:
[1]

1.0 -1.5

Programando con funciones


Una funcin tiene la siguiente sintaxis:
name <- function(argument_1, argument_2, ...) {
expression_1
expression_2
...
return(output)
}

Ejemplo 2: Calculando
factorial <- function(n) {
fact <- prod(1:n)
return(fact)
}
combinaciones <- function(n, r) {
comb <- factorial(n)/factorial(r)*factorial(n-r)
return(comb)
}
Salida:
> factorial(9)
[1] 362880
> combinaciones(9,3)
[1] 43545600

Ciclos IF-ELSE
if (logical_expression)
expression_1
...
}

if (logical_expression)
expression_1
...
} else {
expression_2
...
}

Ejemplo 3:
Cuadratica2 <- function(a0, a1, a2) {
# encuentra los ceros de a2*x^2 + a1*x + a0 = 0
if (a2 == 0 && a1 == 0 && a0 == 0) {
raices <- NA
} else if (a2 == 0 && a1 == 0) {
raices <- NULL
} else if (a2 == 0) {
raices <- -a0/a1
} else {
# calcula el discriminante
discrim <- a1^2 - 4*a2*a0
if (discrim > 0) {
raices <- c((-a1+sqrt(a1^24*a2*a0))/(2*a2),(-a1-sqrt(a1^2-4*a2*a0))/(2*a2))
} else if (discrim == 0) {
raices <- -a1/(2*a2)
} else {
raices <- NULL
}
}
return(raices)
}
Salida:
> Cuadratica2(-3,1,2)
[1] 1.0 -1.5
> Cuadratica2(1,1,1)
NULL
> Cuadratica2(1,3,0)
[1] -0.3333333

Ciclos FOR
for (x in vector) {
expression_1
...
}
Ejemplo 4:
x_lista
x_lista

<-

seq(1,

9,

by

2)

suma_x <- 0
for (x in x_lista) {
suma_x <- suma_x + x
cat("El valor de x es:", x, "\n")
cat("El total acumulado es:", suma_x,\n")
}
Salida:
El
El
El
El
El
El
El
El
El
El

valor
total
valor
total
valor
total
valor
total
valor
total

de x es: 1
acumulado es:
de x es: 3
acumulado es:
de x es: 5
acumulado es:
de x es: 7
acumulado es:
de x es: 9
acumulado es:

1
4
9
16
25

Ejemplo 5:
Suma <- function(x_lista) {
suma_x <- 0
for (x in x_lista) {
suma_x <- suma_x + x
cat("El valor de x es:", x, "\n")
cat("El total acumulado es:", suma_x,"\n")

}
}
x_lista <- seq(1,
Suma(x_lista)

9,

by

2)

Salida:
> Suma(x_lista)
El valor de x es: 1
El total acumulado es:
El valor de x es: 3
El total acumulado es:
El valor de x es: 5
El total acumulado es:
El valor de x es: 7
El total acumulado es:
El valor de x es: 9
El total acumulado es:

1
4
9
16
25

Ejemplo 6:
nfact1 <- function(n) {
n_factorial <- 1
for (i in 1:n) {
n_factorial <- n_factorial * i
}
return(n_factorial)
}
nfact1(6)
Ejemplo 7: (Recursivo)
nfact2 <- function(n) {
if (n == 1) {
return(1)
} else {
return(n*nfact2(n-1))
}
}

nfact2(6)

Recursin Lineal
Ejemplo:

+
# Recursin Normal
u<- function(n){
if(n == 0)
return(0)
else
if(n == 1)
return(2)
else
(2*u(n-1))-(3*u(n-2))
}
# Ejemplo Recursin Lineal
u2 <- function(n){
aux.u2(1, 0, 2, n)
}
aux.u2 <- function(i, ant, res, n){
if(n == 0)
return(ant)
else
if(n == 1)
return(res)
else
if(i==n)
return(res)
else

aux.u2(i+1, res, (2*res)-(3*ant),n)


}

Recursin en Listas Enlazada


# Ejemplo Listas Recursivo
suma.lista <- function(L){
if (length(L) == 1)
return(L[[1]])
else
L[[1]] + suma.lista(L[2:length(L)])
}
suma.lista(list(1,2,3,4,5))

Ciclos WHILE
while (logical_expression)
expression_1
...
}

Ejemplo 8:
Teniendo en cuenta los nmeros de Fibonacci de la F1, F2,. . ., que se
definen inductivamente por:
F1 = 1, F2 = 1,
Fn = Fn-1 + Fn-2 para n 2.

Supongamos que se desea conocer el primer nmero de Fibonacci


ms grande que un valor dado x. Por ejemplo si x=100 el nmero de
Fibonnacci ms grande que x=100 es F(12)=144.
# Limpia el workspace
rm(list=ls())
fibonacci_despues_x <- function(x) {
# inicializa variables
F <- c(1, 1)
n <- 2
while (F[n] <= x) {
n <- n + 1
F[n] <- F[n-1] + F[n-2]
}
return(F[n])
}

Salida:
> fibonacci_despues_x(100)
[1] 144
Ejemplo 9: Leyendo del teclado
cuadratica3 <- function() {
# Entrada
cat("Encuentra los ceros de a2*x^2 + a1*x + a0 =
0\n")
a2 <- as.numeric(readline("a2 = "))
a1 <- as.numeric(readline("a1 = "))
a0 <- as.numeric(readline("a0 = "))
# calcula el discriminante
discrim <- a1^2 - 4*a2*a0
if (discrim > 0) {
raices <- (-a1 + c(1,-1) * sqrt(a1^2 4*a2*a0))/(2*a2)
} else {
if (discrim == 0) {

raices <- -a1/(2*a2)


} else {2
raices <- c()
}
}
# Salida
if (length(raices) == 0) {
cat("no hay ceros\n")
} else if (length(roots) == 1) {
cat("Una nica raz", raices, "\n")
} else {
cat("La races son", raices[1], "and",
raices[2], "\n")
}
}