Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Rstudio y Rstudio-server
Esta obra está licenciada bajo la Licencia Creative Commons Atribución –No Comercial- Compartir Igual 3.0
Unported. Para ver una copia de esta licencia, visita http://creativecommons.org/licenses/by-nc-sa/3.0/.
Librerías en R 68
a. Librerías precargadas 68
b. Librerías que no están cargadas ni instaladas 69
c. ¿Y si no tengo internet? 70
d. Repositorios de R 71
Bibliografia 89
Al respecto sobre el uso de Excel como base de datos, nos advierte el Dr Duncan Golicher 1
…”muchos estudiantes piensan que una hoja de cálculo como Excel es una base de datos. No lo es.
Manejar Excel como una base de datos relacionada es posible, pero no es nada fácil, ni para
usuarios expertos que saben programar en Visual Basic para aplicaciones. Para un usuario normal
sin experiencia con bases de datos sería imposible manejar datos con una estructura jerárquica
compleja en Excel. En cambio, muchas cosas que son difíciles en Excel son fáciles en una base de
datos1. Además la exportación de datos de una base de datos a Excel para su procesamiento
siempre es fácil. Hasta con ODBC se puede hacer una conexión directo para que Excel puede usar la
potencia del “structured query language” directamente.
Es común encontrar una resistencia a tomar el camino del uso de bases de datos entre usuarios con
algo de experiencia intermedia con Excel. Al tener contacto con una base de datos de verdad como
Access, MySQL o PostgreSQL usuarios quienes han encontrado sus propios métodos de lograr
resultados en Excel frecuentemente se quejan que el programa no les deja estructurar y capturar
1
“Como mantener tus datos de investigación ordenados” Duncan Golicher, February 13, 2008
Partimos del presupuesto básico que el usuario posee las nociones de estadística básicas,
distribuciones, etc., que incluso haya utilizado Infostat, este software es en realidad un frontend
de R. Es decir que el núcleo de Infostat es R. De hecho R es una consola de comandos, lo que
hacen programas como RComander, Rstudio e Infostat es presentar una interfaz amigable para
evitar pasos intermedios o el tipeo de una serie de parámetros que son quienes ejecutan las
No tema meter manos en Rstudio, siga las indicaciones de los ejemplos y profundice con sus
propias necesidades las lagunas que necesariamente contiene este documento.
4. Panel de Script
Este primer panel es donde
cargamos desde un archivo
con extension “.r”, por
ejemplo “script_algo.r” o
creamos el codigo que
deseamos que ejecute R (y
luego guardamos). Para
cargar un script ya existente
se hace desde el menu
File Open File o desde la carpeta debajo de iconos del menu. Tambien existe un atajo de
teclado CTRL+O que abre el menu de donde seleccionamos el script que necesitamos. Estos, como
mencionamos en un parrafo anterior, se distinguen por su extension es “.R” En el ejemplo de la
imagen el script guardado es “script_conexionDB.R”.
Los nombres de sus script los determina ud, debe tener en cuenta que tengan una nomenclatura
que le recuerde el objeto del mismo y su version. Es muy comun despues de un tiempo olvidarse
para que era tal o cual, o como se llamaba ese que esta buscando. Tambien a ese respécto es una
buena idea comentar el codigo que se escribe, con aclaraciones sobre el objeto de cada paso.
5. Abrir un script
Al seleccionarlo aparece el panel de script (si no estaba) y
Nota 3
el codigo. En este ejemplo es un conector a una base de
datos para obtener una variable llamada “bruto” desde ¿Qué es una base de datos relacional y
MySql? Una base de datos es una colección
una tabla “Datos”. Para simplificar hemos restringido los
de tablas que contienen registros y se
datos a solo 100, ya que la “Datos” posee mas de 15mil hallan relacionadas entre si por algún tipo
registros. de índice. A diferencia de una planilla de
calculo están diseñadas para contener
Mas adelante veremos como seleccionar datos desde registros y realizar operaciones ABM (Altas,
nuestras tablas, particularizando lo que se denomina bajas y modificaciones) o CRUD (en ingles).
“query”, consulta en lenguaje sql. MySql es una de las más populares en el
mundo web (la usa Google y Facebook por
No se preocupe si en este momento no comprende el ejemplo) y es libre y gratuita.
Al darle la opción de guardar a su script, le podrá colocar el nombre que desee al mismo. También
es relevante que configure un directorio en donde guardara sus scripts, archivos, proyectos y
salidas, tema que también trataremos mas adelante en el texto.
7. Panel de Consola
En este panel se obtienen las
salidas de los scripts, pero
también es el sitio en donde
se puede escribir código
directamente para ver
resultados. Lo que escriba
aquí no se guardara en el
script, es una salida de
prueba o transitoria.
Ha efectuado una simple suma. Si corremos el script de la primera pantalla nos saldrá el resultado
de la imagen. Si tenemos una variable llamada “P” y la llamamos nos dará una pantalla de
números, pero no así si llamamos a “p”. R es “case sensitive” o sea sensible a las mayúsculas. No
es lo mismo “p” que “P”
2
Suena igual a un ONG de alguna cosa ¿No?
Como colofón a este breve ejercicio de uso de consola, ayuda y graficas, comprobamos que la
sumatoria de las frecuencias sea correcta, con sum(prop.table(x)) y cuyo resultado 1 es el
100% de las muestras.
Con esto hemos llegado al resumen de los paneles de Rstudio, de los que en el menú podrá
también acceder y realizar operaciones desde los numerosos submenús.
2. Iniciando R
Cuando arranca RStudio aparece en la consola una leyenda explicativa:
R version 2.14.1 (2011-12-22)
Copyright (C) 2011 The R Foundation for Statistical Computing
ISBN 3-900051-07-0
Platform: x86_64-pc-mingw32/x64 (64-bit)
3
"por mí se va hasta la ciudad doliente, por mí se va al eterno sufrimiento, por mí se va a la gente condenada. La justicia
movió a mi alto arquitecto. Hízome la divina potestad, el saber sumo y el amor primero. Antes de mí no fue cosa creada sino
lo eterno y duro eternamente. Dejad, los que aquí entráis, toda esperanza." Dante Alighieri Divina Comedia, Canto III; aunque
se sospecha que lo plagio de la entrada a la catedra de Estadísticas de la Facultad de Ciencias Exactas de …
• Un detalle a tener en cuenta: cada línea termina en “;” cuando se desea finalizar la
instrucción. Si no lo hace la consola esperara a que termine en la próxima, el prompt
agregara un “+” indicando que son varias líneas a ejecutar. No se olvide de colocar “;” al
final de cada instrucción tanto en el script como en la consola.
• Para limpiar la consola pulse CTRL+L, despejara la misma.
• R es un lenguaje que trabaja en base a “objetos”, esto en programación significa que las
formulas, funciones, datos etc consisten en una entidad que poseen ciertas características,
por ejemplo un parámetro: sqrt(n) quiere decir que hay un objeto “raíz cuadrada” que
recibe un parámetro (un numero) “n” y nos da una salida x.
• Esta funcionalidad es muy potente, ya que usted no necesita saber como funciona sino
solo que parámetros requiere para obtener el resultado. Otro ejemplo, con dos
parámetros:
o > n<-c(1:10)
o > n
o [1] 1 2 3 4 5 6 7 8 9 10
Arroja un vector llamado “n” que concatena valores del 1 al 10. Como se puede apreciar
en esta breve formula hay varios conceptos juntos (la concatenación, el vector, la serie de
1 a 10) todas ellas funciones. Esto nos permite suponer que las funciones se pueden
agregar, y esta en lo correcto si piensa asi.
la sencillez del lenguaje y uso también es una ¿Cómo reconocer una función? Recuerde
gran ventaja. Finalmente para cerrar esta breve que las funciones poseen paréntesis ( ) en
explicación de objetos en R tenga en cuenta que cuyo interior los argumentos, si hay mas
de uno, van separados por comas. Se
las funciones siempre poseen un juego de
pueden anidar (meter adentro) funciones
parentesis“()”: sort(), sqrt(); rnorm(); quit() y sus en las funciones, por ejemplo
argumentos dentro de los paréntesis los
sort(sqrt(rnorm(10)))
parámetros van separados por “,”:
o > sort(alfa, decreasing=TRUE)
o [1] 1.12167243 0.88798608 0.81861407 0.23676978 0.09290526 -0.11830396
-0.17183908 -0.46704494 -2.12783387
o [10] -2.18540730
o > sort(alfa, decreasing=FALSE)
o [1] -2.18540730 -2.12783387 -0.46704494 -0.17183908 -0.11830396 0.09290526
0.23676978 0.81861407 0.88798608
o [10] 1.12167243
• mode(x) nos devolverá el tipo de objeto, por ejemplo “numeric”, “carácter”, “complejo” o
“lógico”.
• Length(x) su longitud, por ejemplo en alfa = 10 (elementos en el vector), o en el caso de
una cadena de caracteres: x<-"El tipo de la cosa" el resultado será 1 (cadena), una
expresión lógica será TRUE o FALSE.
• Si obtiene un resultado N/A el significado no es “nulo” sino “no disponible” es decir que no
se sabe que tipo de dato es. NaN por otra parte es cuando el resultado o el valor no es
numérico. Muchas veces las funciones fallan cuando toman datos N/A o NaN, hay que
tener en cuenta esto al procesarlos porque son fuente de error en muchos casos.
R trabaja los datos mediante un esquema o estructura de datos que es interesante conocer para
poder aplicar su potencia. En estructura de Datos, una materia de programación, se suelen dividir
estos en dos vertientes:
En estos últimos, los datos estructurados, para no extendernos, solo mencionaremos que cuando
los datos se agrupan en un tipo de estructura de un solo tipo, según sus “dimensiones” se llaman
vectores o matrices; si son de dos o mas tipos se denominan listas, registros, conjuntos. 4
En los próximos párrafos examinaremos estos conceptos desde el punto de vista operacional y
como utilizarlos, las definiciones académicas deberá profundizarlas en la medida que estime sean
de necesidad para su aplicación particular. Tenemos las siguientes estructuras de datos:
Como datos primitivos: números, caracteres, valores lógicos (de comparación y de evaluación)
• numeric: (numéricos) número real con doble precisión. Los podemos escribir como
enteros (3, -2), con fracción decimal (3.27) o con notación científica (3.12e-47).
• complex: números complejos de la forma a+bi.
• character: (Caracteres) Cadenas alfanuméricas de texto.
• logical: variables lógicas. Puede ser TRUE o FALSE, también
valores lógicos de comparación (mayor, menor igual etc) que establecen TRUE o FALSE
4
“Algoritmos + estructuras de datos = programas” Niklaus Wirth, ed. Del Castillo, 1984
5
Hipasos de Metaponto descubrió en el siglo V a.c (paradójicamente mediante el teorema de Pitágoras) que ningún número natural, ni
ninguna relación de otros números naturales podía explicar el resultado: la raíz cuadrada de 2, que es 1,4142135... seguido de infinitos
números sin ninguna regla o patrón. Esto convulsiono a los Pitagóricos, una sociedad de matemáticos y filósofos que fundaban todo en
la armonía de los números y la placidez espiritual. Hipasos exultante por su brillantez e inteligencia para meter en problemas a todos
corrió a mostrar su descubrimiento, que implicaba derrumbar los fundamentos de la Sociedad Pitagórica y demostraba que lo de
inteligente no lo hacia en las relaciones sociales. Porque en lugar de recibir la gloria y los halagos de todos sus pitagóricos colegas; por
alguna extraña razón estos se ofendieron y echaron espuma por la boca, al grito de “Nos arruinaste el estofado”. Fue desterrado de la
Sociedad, y el acto de destierro incluía una ceremonia de funeral, con entierro de cajón (sin el tipo adentro) y colocación de una lápida
que simbolizaba la muerte del hereje para la Sociedad. Otros aseguran que su muerte no fue tan metafórica sino a garrotazo limpio y
factiblemente orinando sobre su lapida, postmorten. ¿Quién dijo que las ciencias duras son solo para gente sin sangre en las venas?
Una colección finita y homogénea significa que posee un principio y un fin, con datos todos del
mismo tipo y ordenada debido a que los vectores se consideran como celdas cuyo contenido están
referenciados por un índice que inicia en 1 y termina –por ejemplo- en 10. Así la “celda” 1
contiene el valor n, la 2 otro… hasta el final del array.
Índice=17 Valor=1993 En esta representación vemos una celda que posee un índice llamado
17 con un valor 1993, El índice también puede ser nominal, por ejemplo
“bananas” y el valor numérico, caracteres o lógicos.
6
“Estructura de Datos” de Osvaldo Cairo y Silvia Guardati.
8 9 10 11 12
En la primera línea creamos un array llamado “a” que concatena 10 números enteros, valores del
1 al 10, de manera tal que el valor numérico de la celda 1 es 1, el de la 2 es 2 y así sucesivamente
coincidiendo con el índice, aunque no siempre es así. Comprobamos la longitud del vector con
lenght(a) que devuelve 10 elementos.
El cambio de índice a nombre es agregando un vector de nombres (función names() ), de uso
extendido y común en muchas otras funciones.
En la definición de arrays dijimos que eran una colección finita, sin embargo en R esta colección
no esta cerrada ya que es posible agregar más celdas con valores solo referenciando a que celda
pertenecen. Así cargamos el valor numérico entero 11 en la posición 11, comprobamos que hay 11
elementos ahora.
Hemos comprobado que si mezclamos tipos, cambia el tipo de datos del vector. Al
cargar en la posición 12 un carácter “A” y al comprobar que tipo de array es vemos
que ya no es numérico sino de caracteres. Esto es concordante con la definición del
vector, que no permite mezclar tipos distintos. Por ende al introducir un carácter
el vector cambia de numérico a caracteres. Los valores ya no referencian números
sino caracteres.
Esta operación se llama cast (moldeado) o conversión de tipos y es fuente de errores, ya que no
es posible hacer operaciones aritméticas o matemáticas con caracteres.
> a*5
Error en a * 5 : argumento no-numérico para operador binario
Una simple multiplicación lo demostrara. Para salvarnos el momento existe una función llamada
“as.numeric()” 7, no exenta de cierta consecuencia:
> a
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "A"
> a<-as.numeric(a)
Mensajes de aviso perdidos
NAs introducidos por coerción 8
> a
[1] 1 2 3 4 5 6 7 8 9 10 11 NA
> a*5
[1] 5 10 15 20 25 30 35 40 45 50 55 NA
7
También existen otras: as.nnnn que pueden consultar en la ayuda de RStudio
8
Valores por coerción: a la fuerza nomas…
¿Cómo se soluciona esto? Lo mas simple es cargar un valor 0 en dicha celda o utilizar funciones
na.omit() como en este ejemplo:
> a
[1] 1 2 3 4 5 6 7 8 9 10 11 NA
> na.omit(a) * 5
[1] 5 10 15 20 25 30 35 40 45 50 55
attr(,"na.action")
[1] 12
attr(,"class")
[1] "omit"
Al utilizar na.omit(a) en la multiplicación se omitió el valor NA y el vector resultante contiene solo
valores enteros correctos. La ayuda del Rstudio 9 es muy explicita:
Na.omit:
Trata sobre valores perdidos en objetos
Descripción
Estas funciones genéricas son útiles para trabajar con AN en, por ejemplo, marcos de datos. na.fail devuelve el
objeto si no contiene valores perdidos, y señala un error contrario. na.omit devuelve el objeto con casos
incompletos eliminados. na.pass devuelve el objeto sin cambios.
9
En ingles
> a # el vector”a”.
[1] 1 3 6 8 9 9 2 3 3 3 3 3 2 1 0
> min(a) # hallamos el minimo de “a”.
[1] 0
> max(a) # hallamos el maximo de “a”.
[1] 9
> sum(a) # hallamos la sumatoria de los terminos de “a”.
[1] 56
> length(a) # hallamos la cantidad de componentes de “a”.
[1] 15
> sum(a)/length(a) # hallamos la media aritmetica de “a”.
[1] 3.733333
> mean(a) # usamos la función media en “a”.
[1] 3.733333
> a # el vector”a”.
[1] 1 3 6 8 9 9 2 3 3 3 3 3 2 1 0
> a[15/2+0.5] # buscamos la mediana de ”a” mediante formula.
[1] 3
> median(a) # usamos la función mediana en ”a”.
[1] 3
>
El tema de operaciones entre vectores cobra mayor fuerza en el apartado sobre matrices, donde
las condiciones según el tipo de operación que se realice depende si estas son de formas
correctas, es decir si son matrices cuadradas, rectangulares, de igual cantidad de dimensiones. En
el próximo capitulo abordaremos esta cuestión que se inicia aquí, ya que los vectores son
esencialmente matrices de una sola dimensión.
Por supuesto que los nombres de índice del vector son solo un ejemplo y además en la graficación
hay otros métodos para poner labels (etiquetas) en los ejes. En realidad representan una
comodidad para el investigador para que no se pierda en el análisis de los datos.
Vectores de caracteres
Los vectores también pueden ser de
caracteres, estos se diferencian de los
anteriores porque el número de
operaciones es más reducido y además no
aplican las operaciones matemáticas.
Los términos de un vector de caracteres se
escriben entre comillas, sean caracteres,
palabras o frases.
En el ejemplo lateral creamos un vector “b” asignándole una palabra, luego asignamos a la
segunda posición de “b” otra palabra y finalmente a la tercera posición de “b” una frase completa.
Si deseamos unir dos vectores de caracteres en uno solo debemos utilizar la función paste() pero
si desean mantener esos dos vectores separados y solo unirlos para una salida que no desea
10
Ordinal porque no sigue un índice de cardinalidad sino algún tipo de organización de orden, en nuestro ejemplo tipos de cosas.
11
“Matemáticas Discretas y Combinatoria” Ralph P. Grimaldi ed. 2000 s/d. pag. 53, “Introducción a la Lógica” Irving Copi Eudeba
1969
La aplicación de vectores (o valores) lógicos a estos últimos operadores es automática. Hay aun
una serie de características que son de interés sobre el uso de vectores, para ello remitimos al
texto “Introduccion a R” del R Development Core Team; descargable gratuitamente del sitio de R
en el link http://cran.r-project.org/ en la sección “contributed documentation” entre otra
documentación en español e ingles.
Un factor es un vector utilizado para una clasificación discreta (donde el valor se cuenta no se
mide) en el cual a su vez puede ser nominal u ordinal. En la salida de pantalla creamos un ejemplo
de un Factor por categorías y posteriormente en ordinal:
En palabras mas simples, Una matriz es un conjunto rectangular de datos ordenados dispuestos en
una serie de filas y columnas, su “orden”. Decir que la matriz B33 significa que dicha matriz posee 3
filas de 3 columnas.
Se pueden sumar y restar las matrices si estas SON IGUALES. El concepto del orden de la matriz
cuadrada o rectangular es la igualdad entre las filas y columnas. Si ambas matrices no son iguales
12
Cortesía del autor, no agradezcan.
La regla de oro es C=F 13. Esto quiere decir que las Columnas de la matriz A deben ser iguales a las
de las Filas de la matriz B. Si no se da esta condición no se pueden multiplicar las matrices.
Por un escalar
13
C=F: columnas igual a filas (N del A)
Ambas matrices |m1| y |m2| son iguales en filas y columnas, pero tenemos el caso mas usual,
matrices diferentes en CyF:
+1 − 1
C22= (a21*b12) + (a22*b22)
c11 c12 c13
+2 − 2 C23= (a21*b13) + (a22*b23)
a11: 1+8+21=30
1 2 3
a.b = (1, 2,3) x 4 5 6 a12: 2+10+24=36
7 8 9
a13: 3+12+27=42
1 2 3
a.b 4 5 6
7 8 9
(1, 2,3) 30 36 42
Si usted ha seguido atentamente esta explicación y esta pensando seriamente en dedicarse a las
ciencias sociales (lo mas opuesto posible a esto); despreocúpese, en R todo es mas simple. El
algebra de matrices es tan simple como trabajar el concepto de vectores.
la cual posee cinco argumentos. El primero, data, es opcional y debe ser un vector que
corresponderá a los elementos de la matriz: x=vector, el segundo y tercero de los argumentos son
para declarar el número de filas y columnas de la matriz:
nrow=número de-filas y
ncol=número de columnas, el cuarto argumento sirve para definir cómo se
completará los elementos de la matriz, o por columnas, o si no se define
nada, se completa la matriz por filas:
byrow=True-False y por último,
dimnames=nombre columnas y filas.
Pero no es la única manera de crear matrices, también se pueden construir a través de la unión de
vectores con iguales números de componentes, sean filas o columnas :
La creación de una matriz mediante la función de concatenación empleando los parámetros de los
vectores a,b,c,d (que dan la matriz |w|):
> w<-matrix(c(a,b,c,d),ncol=6,nrow=6, byrow=TRUE, dimnames=list(c("fila
1","fila 2","fila 3","fila 4","fila 5","fila 6"), c("col 1","col 2","col
3","col 4","col 5","col 6")))
> w
col 1 col 2 col 3 col 4 col 5 col 6
fila 1 1 1 1 1 1 1
fila 2 2 2 2 2 2 2
fila 3 3 3 3 3 3 3
fila 4 4 4 4 4 4 4
fila 5 1 1 1 1 1 1
fila 6 2 2 2 2 2 2
Obsérvese que los vectores poseen 6 elementos, por lo que la matriz cuadrada es la repetición de
dos filas (5 y 6), para crear la matriz similar al ejercicio anterior solo hay que cambiar nrow=4 y
eliminar las etiquetas de filas 5 y 6. Si faltan elementos según la declaración, se completan
repitiendo los existentes en el orden secuencial de la expresión ‘a,b,c,d’
También hemos usado una función llamada list() –lista- que explicaremos en breve. Como siempre
la función “c()” es la que concatena miembros en la lista y vectores. Otro detalle: si el argumento
byrow=FALSE (para crear la matriz |x|) el resultado seria:
> x<-matrix(c(a,b,c,d),ncol=6,nrow=6, byrow=FALSE, dimnames=list(c("fila
1","fila 2","fila 3","fila 4","fila 5","fila 6"), c("col 1","col 2","col
3","col 4","col 5","col 6")))
> x
col 1 col 2 col 3 col 4 col 5 col 6
fila 1 1 2 3 4 1 2
fila 2 1 2 3 4 1 2
fila 3 1 2 3 4 1 2
fila 4 1 2 3 4 1 2
fila 5 1 2 3 4 1 2
fila 6 1 2 3 4 1 2
El parámetro Byrow establece como se ordena por filas o columnas o por filas según sea FALSE o
TRUE. Byrow es “por filas”
El acceso a los datos de una matriz es siguiendo la notación |matriz| [fila, columna]:
> w
col 1 col 2 col 3 col 4 col 5 col 6
fila 1 1 1 1 1 1 1
fila 2 2 2 2 2 2 2
fila 3 3 3 3 3 3 3
fila 4 4 4 4 4 4 4
fila 5 1 1 1 1 1 1
fila 6 2 2 2 2 2 2
> w[1,5]
[1] 1
> w[2,3]
[1] 2
Para acceder a todos los elementos de una fila:
X<-cbind(P1c,P2c,P3c,P4c,P5c,P6c,P7c,P8c,P9c,P10c,P11c,P12c,P13c);
Es posible que de entrada no comprenda demasiado de este código. No se preocupe, sin embargo
es fácil de interpretar si lo analiza desde una óptica guiada.
• Lo azul son comentarios que sirven para comprender lo que se ha programado, es una
buena practica hacerlo, ya que al tiempo es muy usual que se olvide que quiso hacer en
esa parte del script en su oportunidad, además al compartir sirve de guía a terceros. El
carácter # al inicio de la línea indica que eso es un comentario y no una instrucción al
programa.
• La primera parte es la carga de una librería para conectar a una base de datos MySql, ya
hablaremos de ello mas adelante.
• La segunda es la obtención de los datos de esa base de datos y la creación de varios
vectores P1a…P13c con datos específicos para el análisis
• Luego los vectores se van uniendo en matrices |Mn| y confluyen en una gran matriz |X|
El resultado es una matriz de 744 filas por 13 columnas que en parte reproducimos aquí:
Esto luego será ingresado para su análisis en una red neuronal. Es destacable que la mayoría del
trabajo de R es repetitivo. Si se observa con detenimiento el ejemplo se advertirá que es
simplemente la repetición de pocos pasos, trece veces, con una configuración específica a cada
situación, pero en definitiva si observamos el “alma” es un trabajo sencillo.
14
Extraídos de www.unbarquero.blogspot.com.ar/2009/03/r-matrices.html
Los elementos que integran la lista se denominan “componentes”, tal como se menciono arriba,
estos componentes pueden ser valores numéricos, cadenas de caracteres, valores lógicos e incluso
vectores o matrices. La función que crea y maneja las listas es list(). Su sintaxis en un ejemplo es:
> agenda<-list(nombre="Juan",apellido="Perez",codigo="101",categoria="a")
> agenda
$nombre
[1] "Juan"
$apellido
[1] "Perez"
$codigo
[1] "101"
$categoria
[1] "a"
Donde las etiquetas (nombre, apellido, código y categoría) poseen un valor asignado. Si por
ejemplo quisiéramos agregar un vector o matriz solo deberíamos incluirlo en uno de los campos, o
agregar esta lista a una lista que contenga dichos elementos.
> agenda$categoria
[1] "a"
> agenda$apellido
[1] "Rodriguez"
> agenda[1]
$nombre
[1] "Pedro"
> agenda[[1]]
[1] "Pedro"
> agenda[["nombre"]]
[1] "Pedro"
>
Supongamos que no le hemos puesto nombres a los componentes de la lista, en el ejemplo
siguiente vemos como hacerlo:
> agenda<-list(1, "ahora", T, c(23,34,45)) > names(agenda)<-c("estado", "cuando", "funciona", "variables")
> agenda > agenda
[[1]] $estado
[1] 1 [1] 1
[[2]] $cuando
[1] "ahora" [1] "ahora"
[[3]] $funciona
[1] TRUE [1] TRUE
[[4]] $variables
[1] 23 34 45 [1] 23 34 45
$cuando
[1] "ahora"
$funciona
[1] TRUE
$variables
[1] 23 34 45
$nombre_perro
[1] "Sultan"
$cuando
[1] "ahora"
$funciona
[1] TRUE
$variables
[1] 23 34 45
$Nombre_del_jefe
[1] "Sultan"
$matriz
[,1] [,2] [,3] [,4]
[1,] 12 15 18 21
[2,] 13 16 19 22
[3,] 14 17 20 23
Ahora que ya tenemos una lista podemos aplicar algunas de las funciones de R al conjunto de
datos. Por ejemplo una media, sumar un término, raíz cuadrada etc:
6. Series temporales
La función ts crea un objeto de clase "ts" (serie de tiempo) a partir de un vector (serie de tiempo
única) o una matriz (serie multivariada). Las opciones que caracterizan un objeto de este tipo son:
Donde:
data es un vector o una matriz
start el tiempo de la primera observación ya sea un número o un vector con dos enteros
end el tiempo de la ´ultima observación especificado de la misma manera que start
frequency el número de observaciones por unidad de tiempo
deltat la fracción del periodo de muestreo entre observaciones sucesivas (ej. 1/12 para
datos mensuales); únicamente se debe especificar o frequency o deltat, no ambos
ts.eps tolerancia para la comparación de series. Las frecuencias se consideran iguales si su
diferencia es menor que ts.eps
class clase que se debe asignar al objeto; por defecto es "ts" para una serie univariada, y
c("mts", "ts") para una serie multivariada.
Ejemplo simple:
Ejemplo de un objeto ts multivariado, creando los datos y asignándoles las fechas de inicio y
finalizacion:
Los 8 vectores de
200 elementos
conforman una
matriz generada por
la funcion de
densidad df, desde
enero de 1961 hasta
agosto de 1977 (200
meses), para llegar a
diciembre de 1977
hubieramos modificado el valor 200 por 204 en ambos parametros de la matriz, ya que esta (o el vector) da
el parametro end del objeto ts:
Aug 1977 0.344485638 0.10038734 0.4793899037 0.938980707 0.51215920 -0.652676989 -4.201032383 0.19732965
Sep 1977 -0.017276507 -0.58275948 1.2765019418 -0.587473105 -1.27479022 -0.735514614 -0.593461925 -1.20529338
Oct 1977 -0.400361565 -0.70152649 0.3270212261 0.846609274 -0.09344580 -0.073988515 -2.013691343 1.43581177
Nov 1977 -1.047250442 -3.63683123 -1.7609765624 -1.418322486 -0.30770078 -0.261224369 0.186109543 -0.22609936
Dec 1977 0.508033325 -0.22636919 -0.0945126165 -0.416216730 -1.58260960 -1.234875595 -0.065235039 -2.31813237
El código completo:
> ## Multivariate
> z <- ts(matrix(rt(204 * 8, df = 3), 204, 8),
+ start = c(1961, 1), frequency = 12)
> plot(z, yax.flip = TRUE)
> plot(z, axes = FALSE, ann = FALSE, frame.plot =
TRUE,mar.multi = c(0,0,0,0), oma.multi = c(1,1,5,1))
> title("plot(ts(..), axes=FALSE, ann=FALSE,
Los parámetros en rojo son los modificados para que la graficación llegue a diciembre de 1977.
7. Dataframes
El objeto data.frame, en español “hojas de datos”, es similar a una matriz pero con el concepto de
listas, ya que a diferencia de las primeras, admite datos de distinto tipo. Hay algunos que la
definen como una colección indexada de listas, otros como el objeto más eficiente para el análisis
de datos 15
15
“Métodos Estadísticos con R y RComander” (versión 2.1) Prof. Dr. Antonio José Sáez Castillo. Universidad de Jaén, 2010 (pg 22)
16
“Introducción a R”, Core Team, pg 35
La igualdad (comparación) es
“==”
Las funciones en general reciben uno o más parámetros de una o más variables. En la segunda
tabla observamos que sum(x) o prod(x) [sumatoria y productorio] reciben un vector, matriz o
variable unidimensional, en el ejemplo c=7 y d es un vector de 1 a 10:
> prod(c)
[1] 7
> d<-c(1:10)
> prod(d)
[1] 3628800
> sum(c)
[1] 7
> sum(d)
[1] 55
> factorial(d)
[1] 1 2 6 24 120 720 5040 40320 362880 3628800
En el ejemplo vemos también que el factorial “d” es igual al productorio “d”, dos formas de
realizar lo mismo. Por supuesto hay muchas mas funciones, y cada día se agregan mas en
numerosos paquetes que se van compartiendo en los repositorios. Estos sitios son de donde
descargamos paquetes específicos para ciertos tipos de cálculos o necesidades.
17
Es decir que no genera ejecutables o aplicaciones independientes de su propio entorno.
�(𝑥𝑖 )
𝑖=1
Si no disponemos de una pc o una calculadora científica puede ser engorroso sino imposible (las
calculadoras en general no poseen memoria suficiente para almacenar esta larga suma en una sola
operación). Si tenesmo una calculadora científica o un pc es mas sencillo.
En R la sumatoria es sum(), la maquina realiza las iteraciones (repeticiones) una y otra vez. La
joven de la noticia, lo resolvió con una simple formula que solo utiliza operadores comunes
matemáticos: n(n+1)/2
Nuestro ejercicio: Si quisiéramos saber cual es la sumatoria de los primeros mil números…. ¿Cual
es el resultado y como lo haría?
> sum(1:1000) # utilizando la función sumatoria de n
[1] 500500
> 1000*(1000+1)/2 # Haciendo el calculo de la joven española
[1] 500500
Otro ejemplo de calculo: El cologaritmo18 de un número es el logaritmo de su inverso, por tanto el
cologaritmo de un número es el opuesto de su logaritmo ¿Cómo lo haríamos en R?
> log(10)
[1] 2.302585
> log(1/10) # el inverso de n = 1/n
[1] -2.302585
El logaritmo es definido como “El logaritmo de un número, en una base dada, es el exponente al
cual se debe elevar la base para obtener el número” 19 Si tenemos un logaritmo de base 2 (binario):
> log2(3)
[1] 1.584963 # este es el logaritmo de 3
> 2^1.584963 # si potenciamos la base (2) por el logaritmo ¿Qué tendremos?
[1] 3.000001 # su antilogaritmo! (¿se anima a hacerlo con un logaritmo natural?)
> log(8)
[1] 2.079442
> 2.7182807066232140698591273860753^2.079442 # base de log naturales o neperianos
[1] 7.999997
En estos ejercicios lo que interesa es que comprenda como utilizar la consola, funciones y
parámetros. Pruebe realizar toda serie de cálculos, explorando las posibilidades de R y leyendo la
ayuda. Eso le dará ductilidad en el manejo de expresiones (así se llaman las líneas de programa)
para intentar cosas mas complejas o comprenderlas.
18
Se denomina cologaritmo de un número a su inverso 1/N, de manera tal que log(n) + log(1/n)=0
19
“Elementos de matemáticas” Kutuzov, ed Mir 1980
• Secuencias regulares
• Secuencias aleatorias
Las secuencias regulares como su nombre lo indican, consisten en aquellas que siguen un orden.
Hay varias maneras de crearlas:
La primer manera es
indicar el rango desde
hasta con 1:30, expresión
muy usada para crear
vectores: a<-c(1:30)
La segunda es la función
seq() (de sequence:
secuencia) que consta de un primer parámetro que es desde, el segundo hasta, el tercero el paso
(“by”) que indica la escala y un cuarto que establece una condición de conclusión. 21 En la captura
de pantalla se puede ver que incluso se pueden generar secuencias hacia atrás (recuerde que el
parámetro By debe tener signo negativo).
Lejos estamos de la época que para hacer un estudio estadístico o un análisis bastaba teclear una
docena o dos de datos.
Por esto es evidente que a la hora de procesar datos para obtener información relevante, no
vamos a entrar uno a uno cada dato; para eso tenemos algún tipo de repositorio 23 de datos que
accedemos para tomar selectivamente o a granel lo necesario y procesarlo. Lo mismo para la
salida, un repositorio que permita guardar esos datos elaborados (información) de manera tal que
podamos leerlos para extraer las conclusiones pertinentes.
Por ejemplo en algunas de nuestras bases de datos albergamos algunos datos “crudos”:
• Clima: 558.775
• Germoplasma 1: 11.900
• Telecomunicaciones: 159.140
¿No es una tentación para cualquier estadístico o explorador de datos? Aun así, no son grandes
bases, pero el potencial de análisis es grande.
a. Repositorios de datos
Para poder trabajar los datos se suelen importar a R mediante varios tipos de repositorios; a la
inversa, los resultados o pasos intermedios se suelen exportar también. Esencialmente pueden ser
repositorios: Nota 11
• Archivos de texto plano (CSV) delimitados por También puede ingresar desde el teclado
comas, punto y coma o tabulaciones “en vivo” valores mediante scan():
• Archivos de planillas de calculo Excell > scan()
• Bases de datos (MySql y otras) 1: 23
2: 33
• Direcciones de Internet. 3: 44
• Desde el teclado 24 4: 55
5:
Read 4 items
b. Para comenzar: iniciar sesión en Rstudio [1] 23 33 44 55
La primera operación que se debe realizar antes de Finaliza con una entrada de carácter nulo
cargar o guardar material desde R es determinar el (enter)
directorio por defecto. La manera de hacerlo en Rstudio
es por consola de comandos, por script o por la interfaz grafica.
23
Repositorio es un archivo o sistema que permite guardar los datos sin procesamiento alguno (crudos) tal como se han medido o
contado. No confundir con fuente, que puede ser, por ejemplo, un termómetro, un anemómetro, una encuesta, es decir los
instrumentos generadores.
24
El único procedimiento existente en Rstudio es scan(), la función data.entry() no esta implementada en Rstudio pero si en R.
En el caso de una instalación local (solo en su pc) no hay acceso, solo debe púlsar el icono en el
escritorio o en la barra de programas y accede.
Como se advierte son idénticas ambas pantallas. Solo difieren en algunos aspectos menores (la
interfaz web requiere validación como usuario con contraseña) no así en las funcionalidades y
elementos.
Una vez abierto el programa en cualquiera de sus dos modalidades, para comenzar y configurar su
directorio de trabajo debe saber donde esta. Con la función getwd() obtiene la ruta por defecto
en donde guardara sus archivos. En las dos imágenes siguientes se podrá ver la misma en dos
En la imagen de
la izquierda se
aprecia que es
la instalación
del servidor, la
URL es visible.
En la
información de
versión también
nos lo indica. El
directorio por
defecto es
/home/usuario
En la imagen de
la derecha se
visualiza que la instalación es local, en un Windows 7 y el directorio por defecto es /users/usuario/documentos Las
funciones versión y getwd() son las utilizadas para determinar esta información.
c. Configurar directorio
Para hacerlo por consola basta con utilizar el comando setwd(ruta):
d. Errores:
debe tener en cuenta que el directorio al cual ubicara su proyecto debe necesariamente existir. Si
no es asi, desde el panel de “files” (archivos) puede crear una nueva carpeta (“folder”) e incluso
25
Rstudio server se instala sobre Linux exclusivamente, hasta este momento. Las distribuciones que ya están adecuadas para su
instalación sin mayores compilaciones, son Debian, CentOs y Ubuntu. Utilizamos Debian debido a su facilidad, sus repositorios y su
manejo. Ubuntu y CentOs no le van a la zaga. Las demás distribuciones requieren de compilación de las fuentes y eso a veces si no se es
conocedor se suele dificultar un poco. Si va a instalar Rstudio Server le recomendamos Debian
Un ejemplo de read.csv()
#configuramos donde
setwd("D:/mapas/apellidos/")
# obtenemos la matriz 100*3 apellidos
apellidos <- read.csv("apellidos.csv", header=F)
#View(apellidos) # descomentar para que aparezca
la ventana con los apellidos
# array de nombres de apellidos
nombres<-as.array(apellidos$V1)
cifras<-as.array(apellidos$V2)
26
Para escribir en archivos se utiliza la función write() que no explicaremos aquí dado que es muy similar a read(), pero se puede
consultar en el manual de R
Al aceptar esta configuración abrirá la consola con un comando que puede copiar para guardar
(copy y paste) desde la consola a la ventana de scripts. Es un buen recurso para cuando hay dudas
en cuanto a como escribir correctamente los parámetros de la función read.table(). El ejemplo con
la imagen correspondiente:
27
“R para principiantes” o. cit. Tabla de pagina 11
El comando Nota 12
view() nos
abre una La mejor manera de importar datos a
Rstudio, en realidad a R, es crear desde el
ventana en el
programa que utilice, un archivo de texto
panel de plano (CSV) e importarlo con la interfaz
scripts con el grafica de Rstudio, así podrá supervisar el
archivo, para proceso y detectar si hay delimitadores o
marcas de formato que impidan la correcta
inspeccionar.
adición de datos a su script.
Write.table incorpora sep=”” que indica como van delimitados los datos, por ejemplo por
tabulador (“\t”), coma (“,”), punto y coma(“;”) tambien la indicacion de EOL (final de linea) con un
salto de linea ("\n"); etc. Debe prestar atención que parámetros elegirá para salvar sus datos, ya
que existen varios tipos de codificaciones que varían entre sistemas y programas (es proverbial la
28
“R para principiantes” op. Cit.
Por supuesto los mismos argumentos que utiliza write, se aplican a write.table. También
se pueden guardar en otros formatos (bases de datos, csv, Excel, consulte la ayuda de las
librerías especificas para tal propósito)
g. Desde la web
Si quisiéramos tomar un archivo de la web existe el comando download.file()
La sintaxis que nos da la ayuda es la siguiente:
download.file(url, destfile, method, quiet = FALSE, mode = "w",cacheOK = TRUE, extra =
getOption("download.file.extra"))
Sin embargo dentro de las opciones evite usar Excel ya que es muy comun que según la
version del mismo (97, 2000, 2003, 2007, 2010) haya variaciones que hagan la lectura
dificil. En parte porque al cambiar el parametro XLM entre el 2003 y 2007, se suelen dar
problemas de compatibilidad al leerlos. Conviertalos a CSV y lea o grabe desde ese formato
29
“Lectura, manipulación y análisis de datos en R”, F. Tusell, actualización 2007 pag. 3; http://www.et.bs.ehu.es/~etptupaf
“No sería una exageración decir que la mayoría de los errores en la captura y mantenimiento de datos tienen la
misma causa. Es el uso casi universal de hojas de cálculo para la captura de datos. Las ventajas de hojas de
cálculos son aparentes.
5. Usuarios avanzados de hojas de cálculo pueden usar una hoja de cálculo como si fuera un base de
datos sofisticada.
Efectivamente, mientras que sean correctamente utilizados las hojas de cálculo son herramientas potentes. Sin
embargo las fortalezas de hojas de cálculo están relacionadas con sus debilidades principales. La flexibilidad
que hace hojas de cálculo tan atractivas al mismo tiempo causa su mal uso y abuso. Al abrir una hoja de calculo
el usuario esta presentado con una hoja en blanco sin estructura. Entonces hay mucha tentación de inventar
una estructura de datos particular para cada problema. El resultado es caótico.
Una forma de evitar la mayoría de los problemas comunes es sencilla. Siempre asegurar que se puede entrar
los datos en ...... ¡una base de datos! Suena trivial y hasta tautológico aconsejar que se use software diseñado
para mantener datos para mantener datos! Sin embargo muchos estudiantes piensan que una hoja de cálculo
como Excel es una base de datos.
No lo es. Manejar Excel como una base de datos relacionada es posible, pero no es nada fácil, ni para usuarios
expertos que saben programar en Visual Basic para aplicaciones. Para un usuario normal sin experiencia con
bases de datos sería imposible manejar datos con una estructura jerárquica compleja en Excel.
En cambio, muchas cosas que son difíciles en Excel son fáciles en una base de datos1. Además la exportación de
datos de una base de datos a Excel para su procesamiento siempre es fácil. Hasta con ODBC se puede hacer
31
una conexión directa para que Excel puede usar la potencia del “structured query language” directamente.
Es común encontrar una resistencia a tomar el camino del uso de bases de datos entre usuarios con algo de
experiencia intermedia con Excel. Al tener contacto con una base de datos de verdad como Access, MySQL o
PostgreSQL usuarios quienes han encontrado sus propios métodos de lograr resultados en Excel
frecuentemente se quejan que el programa no les deja estructurar y capturar los datos como quieren.
¡Exactamente! Muy bien. Esta es precisamente su mayor ventaja. Si quieres mantener tus datos con una
estructura que no es posible en una base de datos, entonces estas ciertamente pensando en una estructura
equivocada para tus datos. Por todo lo lógico que te parezca, tu estructura casi siempre va a ser difícil de
comunicar a los demás y probablemente va a causarte muchos problemas al largo plazo.”
Excel, es bueno recordarlo, es una planilla de cálculos, mientras que una base de datos es lo que
su nombre indica, una base de datos. Es algo preparado para soportar grandes volúmenes de
datos, procesarlos para servir consultas, filtrados, operaciones ABM (altas, bajas, modificaciones),
etc. Es una buena práctica que los datos se guarden siempre en una DB. Hay muchos tipos de base
30
“Como mantener tus datos de investigación ordenadas” Duncan Golicher 2008,
31
SQL: lenguaje estructurado de consultas, lenguaje de manejo y administración de DB
Los registros de la tabla “ríos” nos refieren a las distintas relaciones, por ejemplo “cod_rios”
(código de ríos) involucra una forma de enumeración por cada rio (en tablas separadas) Para
agregar un nuevo rio solo hace falta agregar el código en cod_rios y crear la tabla especifica;
también vemos la relación entre cod_med (códigos de medición) que refiere a distintas medidas
que se cargan también en las tablas de ríos. Este esquema da flexibilidad y permite crear consultas
(“query”) muy especificas o filtradas que serian imposibles en un entorno excel. En R utilizando tan
solo la consulta adecuada se puede disponer de los datos con la granularidad deseada: muy
genéricos o muy específicos, pasando por toda la gama intermedia.
32
Base de datos “Flamenco” en la que analizamos la relación existente entre ríos de Corrientes y determinados puntos del Pacifico
Norte, con el Investigador del Instituto de Clima y Agua INTA Castelar Dr Eduardo Flamenco. El EER es solo demostrativo, no refleja el
estudio en minería de datos con R que se esta efectuando al escribir estas líneas. (N del A)
Por ejemplo “SELECT * FROM tabla_equis” nos traerá la información contenida en la totalidad
de la “tabla_equis”; “SELECT id,especie,f_siembra,f_emergencia,f_cosecha FROM
tabla_equis WHERE condición=x” tendrá una salida selectiva en cuanto a los datos y su
cantidad.
Un par de capturas de una DB MySql, la primera mediante un software que oficia de manejador de
la base de datos 33, llamado phpmyadmin (especifico para MySql):
En este ejemplo corremos un server de MySql local (dentro de la propia pc), también es posible
acceder a un server MySql en red LAN o en la Internet, colocando en la llamada el parámetro –h
(host) que es donde esta el servidor de MySql, por ejemplo en 192.168.0.101; en nuestro ejemplo
el server esta ubicado en la propia pc, el server se llama “localhost” o 127.0.0.1, lo que no
requerirá el parámetro –h en la llamada.
En un par de imágenes puede ver como es el trabajo con esta modalidad, la preferida de la
mayoría de los programadores ya que la pantalla de comandos es menos amigable. El programa
cliente de la base de datos se llama: mysql –u root –p [enter] desde la consola de comandos
de su sistema
33
Los sistemas de gestión de bases de datos o mejor conocidos como SGBD (en inglés database management system,
abreviado DBMS) son un tipo de software muy específico, dedicado a servir de interfaz entre la base de datos, el usuario y
las aplicaciones que la utilizan.(Wikipedia)
k. R y MySql
En R se puede incorporar una consulta SQL mediante una
serie de instrucciones:
1 library(RODBC)
2 ch <- odbcConnect("telip", "root", "entropia")
3 odbcGetInfo(ch)
4 P<-as.real(as.matrix(sqlQuery(ch, as.is=TRUE,
paste("SELECT bruto FROM datos where id <101" ,
sep=""))));
Finalmente la cuarta línea nos extrae una consulta que se carga en un vector “P” de 100
elementos. Existe una línea final que “plotea” un grafico que vemos a la derecha inferior de la
imagen:
Si esto es demasiado técnico para usted, no se preocupe, haremos un ejemplo esclarecedor (eso
esperamos) Tenemos una tabla llamada “resultados” cuya imagen adjuntamos. Esta compuesta de
10 campos, los cuales 9 son utilizados (el primero es el índice único de cada registro, no se repite).
El código:
#==================================================================================
# GUARDAR DATOS EN RESULTADOS
#==================================================================================
library(RODBC)
ch <- odbcConnect("germoplasma", "jefe", "123456789")
odbcGetInfo(ch)
#==================================================================================
sqlTables(ch) #lista las tablas existentes
#==================================================================================
Este script guardara los datos del dataframe en su base de datos MySql. Como es
costumbre le aconsejamos que revise la bibliografía de la librería, ya que de versión en
versión pueden haber diferencias sutiles que ocasionen algún que otro dolor de cabeza;
de todas maneras si guardar en una base de datos se le complica, guarde en CSV, desde MySql
es posible importar estos datos con seguridad utilizando PhpMyAdmin.
library(RODBC)
ch <- odbcConnect("germoplasma", "mi_usuario", "mi_password")
odbcGetInfo(ch)
#==================================================================================
sqlTables(ch) #lista las tablas existentes
#==================================================================================
Esta salida nos dará las tablas existentes, solo a los fines de detallar y realizar la inserción
correctamente, la salida por consola:
TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS
1 germoplasma mani1 TABLE
2 germoplasma resultados TABLE
> #================================================================================
Tenemos dos tablas, una de la cual hemos extraído datos en el ejercicio de creación de un script, y
la tabla “resultados” que esta creada en el ítem anterior, para guardar los resultados de nuestros
cálculos. En SQL la orden de guardar datos es la siguiente:
Donde “valor1…N” es el valor en el tipo de datos especifico que guardara la tabla. En la imagen
del ítem anterior observamos que la tabla Resultados posee tipo numérico decimal 12,2; significa
que admite números de hasta 12 dígitos con dos decimales. Si requiere mas precisión en ellos,
debe cambiar a, por ejemplo, 12,4 etc.
• Trace un plan de trabajo sobre que va a hacer, desde donde parte, con que elementos
cuenta para los análisis y como los va a procesar para obtener una salida y de allí la
conclusión que permita darle sentido a su trabajo.
• Lo ideal es hacer este plan o esquema de trabajo en un papel, dividiendo las etapas de
manera clara y concisa, por ejemplo “adquisición de datos por csv”, “creación de vectores
de análisis”, “análisis de vectores con matriz de correlaciones”, etc., hasta llegar al final
que usualmente es un despliegue de datos (en forma de matriz, dataframes o vectores) y
gráficos.
• Corroborar todos los pasos intermedios y Nota 13
resultados finales, revisando no solo los Para suscribirse a la lista de R en español debe
datos y sus procesos, sino también las darse de alta en la dirección
funciones aplicadas. Muchas veces se https://stat.ethz.ch/mailman/listinfo/r-help-es
utilizan mal funciones que dan obviamente
Ejemplo de lista:
resultados erróneos o funciones no
adecuadas para el caso. Un defecto común Envíe los mensajes para la lista R-help-es a
r-help-es@r-project.org
es por ejemplo no normalizar valores Para subscribirse o anular su subscripción a través de la
cuando tenemos muchas variables disimiles, WEB
mezclar tipos de variables (continuas, https://stat.ethz.ch/mailman/listinfo/r-help-es
O por correo electrónico, enviando un mensaje con el
discretas, categóricas etc.) o usar un método texto "help" en el asunto (subject) o en el cuerpo a:
que quizás no sea el mas adecuado (por r-help-es-request@r-project.org
Puede contactar con el responsable de la lista
ejemplo en agrupamientos –clustering- se escribiendo a:
utilizan distancias. Hay seis o siete tipos de r-help-es-owner@r-project.org
distancias ¿Cuál es la adecuada para su caso
Si responde a algún contenido de este mensaje, por
específico?) favor, edite la linea del asunto (subject) para que el
texto sea mas especifico que:
Lo bueno del caso es que R posee una gran "Re: Contents of R-help-es digest...". Además, por favor,
comunidad científica y técnica que comparte incluya en la respuesta sólo aquellas partes del mensaje
a las que está respondiendo.
conocimientos en listas de correos, si posee dudas y Asuntos del día:
no tiene a quien recurrir, la suscripción (gratuita) a 1. Re: correr modelos no lineales (Roy Vera)
2. Re: correr modelos no lineales (Jorge I Velez)
estas listas será fuente de conocimiento. Plantear su
3. Re: Gráfico con varias variables (Carlos Ortega)
duda en ella es un procedimiento habitual, ya que la 4. Re: Gráfico con varias variables (M. Monsalvo)
lista de paquetes y funciones de R siguen creciendo ------------------------------------------------------------------
día a día y estar al tanto de todos los paquetes y
actualizaciones es un trabajo ingente y nadie puede abarcar todo el conocimiento por si mismo.
En las próximas páginas vamos a abordar un proyecto sencillo, con la idea que se familiarice con el
entorno y su manejo. No se preocupe si no comprende los comandos. Los conceptos son más
importantes.
Caso: tenemos una lista de los 100 apellidos mas usuales en Argentina, deseamos ver que
grado de cercanías hay entre ellos, y como agruparían en un clúster imprimiendo una
salida en un dendograma.
Materiales: apellidos.csv 34
b. fuente de datos
El CSV es un archivo de texto plano en el que hay dos columnas por cien filas, con campos
separados por comas simples, aquí copiamos en una tabla que usted puede copiar y pegar en un
bloc de notas 35 en una sola columna doble de 100 filas:
34
Extraído del INDEC
35
Recomendamos calurosamente el Notepad++ (va por la versión 6) el preferido por los programadores.
Es importante que no agregue ni quite nada, por eso se debe usar el bloc de notas y no otros
programas que agregan marcas ocultas de formato. Este archivo lo debe guardar como
“apellidos.csv”; la extensión CSV también es importante. También debe eliminar los caracteres
acentuados, ya que suelen presentar problemas cuando están presentes.
c. Iniciamos el proyecto
Al iniciar Rstudio “limpio” (sin variables ni historial cargado) vamos al ítem Proyecto en Menú y
seleccionamos la opción de nuevo proyecto, si ya tuviese uno activo puede abrirlo en “open
Project” o echar un vistazo en “Recent Projects” para ver el listado de proyectos anteriores.
Seleccionamos la primera opción y completamos los datos requeridos. Esto creara una carpeta
“Apellidos” con un archivo “apellidos.r” que contendrá el workspace y otra información relevante
Quizás parezca trivial, pero a la hora de revisar y cargar los scripts además de variables y espacio
de trabajo es realmente muy útil, especialmente si llevamos varios proyectos paralelamente.
Como se advierte en la segunda parte del código (la modificación) la inclusión de unas líneas mas
crean cajas de colores para agrupamientos de 3,5 y 10 grupos. La aplicación de distancias y
clústeres se ha hecho en una sola línea, comprimiendo el código anterior. Esto demuestra la
potencia de R que permite concatenar funciones de manera muy eficiente y sencilla.
e. Distancias:
Es la cuantificación del grado de proximidad entre dos o más puntos en un espacio de dimensión
{d} que tradicionalmente en matemáticas se ha asociado al concepto de “métrica” o “distancias”.
Una métrica es una función que a cada par de puntos x,y ϵ Rd (x e y pertenecen al conjunto de
números reales) les asocia un valor positivo de modo que cuando mayor es, mas distantes son.
La función “δ” definida en el espacio producto Rd x Rd debe verificar algunos axiomas para decir
que es una métrica:
• No negativa d(x,y)≥0
• Un punto dista 0 de si mismo d(x,y)=0
• Simetría d(x,y) = d(y,x)
• Desigualdad triangular d(x,z) ≤ d(x,y) + d(y,z)
g. Guardando gráficos
Ahora que hemos realizado el script, sin fallos, que la
salida grafica ha sido creada, debemos guardar el grafico.
En el panel de “Plots” (graficas) podemos seleccionar la
opción “export” y guardarla en una variedad de formatos
Los formatos: PNG, JPEG, TIFF, BMP, METAFILE, SVG y PS además de PDF son fácilmente
insertables en documentos de plataformas Linux, Windows y Apple.
h. Finalizando el proyecto
Cuando termine el proyecto en Rstudio no olvide guardar el script (icono de disquete en la parte
superior izquierda de la ventana de script) y salvar el workspace. De todas maneras al salir le
preguntara Rstudio si desea salvar el espacio de trabajo.
Una buena práctica es cada tanto, e independientemente del estado de su proyecto, guárdelo.
#====================================
# Dendograma con apellidos, una
# prueba de concepto
#====================================
# File-Name: apellidos.R
# Date: 04/10/2012
# Author: Edwin Aguiar -INTA
# TICs Corrientes Desarrollo y Bases
# de Datos
#====================================
#configuramos donde
setwd("D:/mapas/apellidos/");
# obtenemos la matriz 100*3 apellidos
apellidos <- read.csv("D:/mapas/apellidos/apellidos.csv", header=F);
#View(apellidos)
# array de nombres de apellidos
nombres<-as.array(apellidos$V1);
cifras<-as.array(apellidos$V2);
Si desea eliminar una librería que no necesite, solo desmárquela de “packages” (y escriba en el
script de R: detach("package:datasets") , por ejemplo)
36
Un servidor de internet que posee estos paquetes para su descarga
probando la URL
'http://mirror.fcaglp.unlp.edu.ar/CRAN/bin/windows/contrib/2.14/xlsxjars_0.4.0.zip'
Content type 'application/zip' length 9041528 bytes (8.6 Mb)
URL abierta
downloaded 8.6 Mb
probando la URL
'http://mirror.fcaglp.unlp.edu.ar/CRAN/bin/windows/contrib/2.14/xlsx_0.5.0.zip'
Content type 'application/zip' length 381977 bytes (373 Kb)
URL abierta
downloaded 373 Kb
3. ¿Y si no tengo internet?
Busque en el repositorio de R en internet, allí seleccione la librería para descargar (en Windows o
en Linux) y posteriormente llévela a su Rstudio en su maquina fuera de red e instálelo desde la
0-Cloud
http://cran.rstudio.com/ Rstudio, automatic redirection to servers worldwide
Argentina
http://mirror.fcaglp.unlp.edu.ar/CRAN/ Universidad Nacional de La Plata
http://r.mirror.mendoza-conicet.gob.ar/ CONICET Mendoza
Australia
http://cran.csiro.au/ CSIRO
http://cran.ms.unimelb.edu.au/ University of Melbourne
Austria
http://cran.at.r-project.org/ Wirtschaftsuniversitaet Wien
Belgium
http://www.freestatistics.org/cran/ K.U.Leuven Association
Brazil
http://cran-r.c3sl.ufpr.br/ Universidade Federal do Parana
http://cran.fiocruz.br/ Oswaldo Cruz Foundation, Rio de Janeiro
http://www.vps.fmvz.usp.br/CRAN/ University of Sao Paulo, Sao Paulo
http://brieger.esalq.usp.br/CRAN/ University of Sao Paulo, Piracicaba
Canada
http://cran.stat.sfu.ca/ Simon Fraser University, Burnaby
http://mirror.its.dal.ca/cran/ Dalhousie University, Halifax
http://probability.ca/cran/ University of Toronto
http://cran.skazkaforyou.com/ iWeb, Montreal
http://cran.parentingamerica.com/ iWeb, Montreal
Chile
http://dirichlet.mat.puc.cl/ Pontificia Universidad Catolica de Chile, Santiago
China
http://ftp.ctex.org/mirrors/CRAN/ CTEX.ORG
http://cran.csdb.cn/ Computer Network Information Center, CAS, Beijing
http://mirror.bjtu.edu.cn/cran Beijing Jiaotong University, Beijing
http://cran.dataguru.cn Dataguru (a, Guangzhou)
http://mirrors.ustc.edu.cn/CRAN/ University of Science and Technology of China
http://mirrors.xmu.edu.cn/CRAN/ Xiamen University
Colombia
http://www.laqee.unal.edu.co/CRAN/ National University of Colombia
“En comparación con otras formas de presentación de los datos, los gráficos nos permiten,
de una mirada, comprender el comportamiento de los datos, aun de datos muy complejos,
por lo tanto ahorran tiempo al analista de información. Los gráficos estadísticos nos
permiten usar nuestra habilidad para visualmente procesar información de un grafico. Esto
Los gráficos que podemos trazar se pueden dividir a priori en la representación de la cantidad de
dimensiones que representan. Suponiendo hasta tres, tendríamos una lista que abarcan las
distintas funciones, a su vez divididas en funciones de graficación de bajo nivel y de alto nivel; esto
son las graficaciones sobre una nueva imagen o sobre una existente. No es un calificador de
calidades como podría suponerse ligeramente.
La forma de trabajo de las funciones graficas es sustancialmente diferente al de las funciones, que
trabajan en base a lo que se llaman objetos (tablas, matrices, vectores, dataframes etc).El
resultado de una función grafica no puede ser asignado a un objeto sino que es enviado a un
dispositivo grafico. Un dispositivo grafico es una ventana grafica o un archivo, y de allí la salida
visual que obtenemos.
37
“Gráficos estadísticos con R” Juan Carlos Correa y Nelfi González, Posgrado en Estadística Universidad Nacional-Sede Medellín
(jccorrea@perseus.unalmed.edu.co), 2002
Otro barplot
> amplitud<-c(1,1,1,1,1,1,1,1,1,1,1)
> nombres<-c("uno","dos","tres","cuatro","cinco","seis",
"siete","ocho","nueve","diez","once")
> estaturas<-c(round(rnorm(10,1,2)),digits=2)
> barplot(estaturas, amplitud, nombres, space=.2)
Estas funciones suelen tener muchos parámetros interesantes, es adecuado leer cuidadosamente
las ayudas del Rstudio, por ejemplo agregando el parámetro de color en forma de un vector:
col = c("lightblue", "mistyrose", "lightcyan", "lavender", "cornsilk"),
digits
2.50 -Inf 3.20 2.00 2.50 2.50
3.50 2.66 3.25 3.50 3.50
> boxplot(estaturas,3,otracosa)
“lines” dibuja líneas sobre una serie de puntos graficados (“plot”), el ejemplo del uso es el
siguiente:
> indice<-c(1:11) # crea el vector x de 1 a 11
> plot(estaturas, main="Estaturas") # situa los puntos “plot” en la grafica
> lines(indice, estaturas) # traza la línea que une a los puntos
En la línea superior le damos al tipo de línea el parámetro “o” (overploted), color rojo y puntos
“peach” el valor 16. El resultado es el de abajo, sin usar la segunda instrucción de “lines”
El tipo “n” en plot significa que no escribirá ningún grafico, solo crea el eje de coordenadas. La
función rnorm crea una secuencia aleatoria de una distribución normal, para generar los puntos y
sus dos coordenadas (x,y)
Lsfit() es la estimación de
mínimos cuadrados 38 de los
datos del vector sales5 En la
segunda lsfit() se ha configurado
un termino de intercepción como FALSO, mientras que en la primera es VERDADERA por defecto.
Los datos y el código son el ejemplo de la ayuda de R.
38
Mínimos cuadrados es una técnica de análisis numérico encuadrada dentro de la optimización matemática, en la que, dados un
conjunto de pares ordenados: (variable independiente, variable dependiente) y una familia de funciones, se intenta encontrar la
función, dentro de dicha familia, que mejor se aproxime a los datos (un "mejor ajuste"), de acuerdo con el criterio de mínimo error
cuadrático.
b. Las distribuciones en 3D
Dada la complejidad de la materia, a la que apenas hemos arañado en la superficie aun en los
ejemplos mas sencillos, se puede profundizar en “R graphics" de Paul Murrell , que se encuentra
en http://www.stat.auckland.ac.nz/~paul/RGraphics/rgraphics.html para su descarga gratuita y
que hemos utilizado en parte aquí para demostraciones conceptuales.
plot(variable, type="b",
ylim=c(13,29),xlab="casos",
ylab="ocurrencias", main="Casos
vs Ocurrencias", col="blue",
lty=2, lwd=1)
barplot(variable,
ylim=c(10,29),xlab="casos",
ylab="ocurrencias", main="Casos
vs Ocurrencias", border=2,
col="gray", density=8)
par(bg="yellow")
plot(mat5)
39
“R para principiantes”pag. 36 E. Paradis, traducción de J.A.Ahumeda, op. Cit.
40
Ejercicio adaptado de “Practicas de estadística en R” Manuel Febrero Bande, Pedro Galeano San Miguel, Julio González Díaz y
Beatriz Pateiro López. Universidad de Santiago de Compostela, 2008. Pag. 69 y sgtes
Iris esta compuesto por 150 registros de 5 campos cada uno, referidos a especies vegetales, en
pantalla una muestra de los primeros 9. Con estos datos deseamos realizar un grafico que nos
muestre la relación de longitud y anchura de pétalo (“Petal length”, “Petal Width”). Si contamos
los elementos del vector
tenemos que “FC” 41 es la
manera de indexar los datos;
longitud de pétalos es iris[ ,3]
e iris[ ,4] el ancho de los
mismos. Esto desplegara los
41
FC: fila y columna ¿Ya lo ha olvidado?
Dados los números de componentes (el ID y el campo 5to: especie) los resultados son los que
salen por pantalla. Una rápida visión nos permite definir que el agrupamiento inferior consisten en
“setosa” y el punto 68 (el ultimo, que esta sobre la cuz) cuyo id es 68 es una “versicolor”.
El resultado:
Otra manera es además de dar color, es asignarle un símbolo propio. En el siguiente desarrollo
utilizamos las funciones matplot() y matpoints() de manera similar a cuando utilizamos plot y
points en la primera parte de graficación.
> iS <- iris$Species == "setosa"
> iV <- iris$Species == "versicolor"
> iVi<- iris$Species == "virginica"
> matplot(c(1,8),c(0,4.5),type= "n",xlab="Longitud",ylab ="Anchura", main = "Petalos y
Sepalos de Iris")
> matpoints(iris[iS,c(1,3)],iris[iS,c(2,4)],pch =1, col=c(2,4))
> matpoints(iris[iV,c(1,3)],iris[iV,c(2,4)],pch =4, col=c(2,4))
> matpoints(iris[iVi,c(1,3)],iris[iVi,c(2,4)],pch=20, col=c(2,4))
> legend(1,5,c("Sepalos Setosa","Petalos Setosa","Sepalos Versicolor", "Petalos
Versicolor","Sepalos Virginica","Petalos Virginica"), pch =c(1,1,4,4,20,20),col=rep(c(2,4),
2))
En las primeras líneas asignamos (==) a iS, iV, iVi valores lógicos según la pertenencia a la especie
en cuestión, los tres vectores de datos son:
A riesgo de ser penosamente detallistas es importante constatar como funciona esto. En el vector
iS el primer valor es TRUE, FALSE en los demás, en iV el valor 55 es TRUE, no en los demás
vectores, en iVi el valor 150 es TRUE y FALSE en los demas… Estas tres pequeñas líneas y la
utilización de una condición lógica establecen un poderoso filtro de datos. Cada dato, al ser
ploteado por la función matpoints() imprime o no según la condición, la separación de Sépalos y
Pétalos esta determinada por las variables que concatenan el punto
La primera expresión por sépalos y la segunda por pétalos, si son TRUE, sino no imprimen. El
resultado:
Al asignar un símbolo y un
color característico por
cada clasificación y por la
condición T/F van
imprimiendo los puntos.
No se preocupe si aun no
lo comprende, es cosa de
practica.
Copie el código y
pruébelo, es la mejor
manera de entender su
funcionamiento.
j. Concluyendo
Existen numerosas y muy
sofisticadas funciones
graficadoras, aquí solo
hemos expuesto algunas de
las más sencillas. Los
paquetes grid y lattice, por
ejemplo, poseen graficas
muy superiores y más
elaboradas. Para explorarlas
en la consola use demo() y
en el cuadro de demos que
aparezca, vea las funciones
graficas (varias) existentes.
Aqui algunas imágenes de
muestra:
Nosotros somos deudores de muchos otros que han dejado sus experiencias en la web y nuestra
aspiración es que este pequeño trabajo sea de utilidad para que ud se inicie en este mundo que
posee las características de ser libre, gratuito, abierto y colaborativo además de profundamente
creativo.
A continuación algunos textos de interés (que hemos citado o utilizado) de los muchos que
encontrara en la web: