Tutorial 02: Estadística descriptiva con...

52
PostData Curso de Introducción a la Estadística Tutorial 02: Estadística descriptiva con R. Atención: Este documento pdf lleva adjuntos algunos de los ficheros de datos necesarios. Y está pensado para trabajar con él directamente en tu ordenador. Al usarlo en la pantalla, si es necesario, puedes aumentar alguna de las figuras para ver los detalles. Antes de imprimirlo, piensa si es necesario. Los árboles y nosotros te lo agradeceremos. Fecha: 23 de octubre de 2017. Si este fichero tiene más de un año, puede resultar obsoleto. Busca si existe una versión más reciente. Índice 1. Primer contacto con R y RStudio. 1 2. Variables y vectores. 8 3. Ficheros csv con R. 12 4. Estadística descriptiva de una variable cuantitativa, con datos no agrupados. 18 5. Ficheros de comandos R. Comentarios. 28 6. Más operaciones con vectores en R. 35 7. Formato del código R en próximos tutoriales. 45 8. Ejercicios adicionales y soluciones. 46 1. Primer contacto con R y RStudio. Aunque la hoja de cálculo nos va a seguir acompañando durante todo el curso, nuestra herramienta fundamental va a ser R. En esta sesión vamos a familiarizarnos con RStudio, y aprenderemos a cargar un fichero de comandos R “prefabricado” . No te preocupes si al principio no entiendes algunas cosas, y otras tantas te parecen extrañas. Pronto irá quedando todo más claro. Para empezar, abriremos el programa RStudio que instalamos en el Tutorial02. Cuando, tras instalarlo, iniciamos RStudio por primera vez, nos encontramos con una ventana similar a esta: 1

Transcript of Tutorial 02: Estadística descriptiva con...

PostData Curso de Introduccioacuten a la Estadiacutestica

Tutorial 02 Estadiacutestica descriptiva con R

AtencioacutenEste documento pdf lleva adjuntos algunos de los ficheros de datos necesarios Y estaacute pensadopara trabajar con eacutel directamente en tu ordenador Al usarlo en la pantalla si es necesario puedesaumentar alguna de las figuras para ver los detalles Antes de imprimirlo piensa si es necesario Losaacuterboles y nosotros te lo agradeceremos

Fecha 23 de octubre de 2017 Si este fichero tiene maacutes de un antildeo puede resultar obsoleto Busca siexiste una versioacuten maacutes reciente

Iacutendice1 Primer contacto con R y RStudio 1

2 Variables y vectores 8

3 Ficheros csv con R 12

4 Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados 18

5 Ficheros de comandos R Comentarios 28

6 Maacutes operaciones con vectores en R 35

7 Formato del coacutedigo R en proacuteximos tutoriales 45

8 Ejercicios adicionales y soluciones 46

1 Primer contacto con R y RStudioAunque la hoja de caacutelculo nos va a seguir acompantildeando durante todo el curso nuestra herramientafundamental va a ser R En esta sesioacuten vamos a familiarizarnos con RStudio y aprenderemos acargar un fichero de comandos R ldquoprefabricadordquo No te preocupes si al principio no entiendes algunascosas y otras tantas te parecen extrantildeas Pronto iraacute quedando todo maacutes claroPara empezar abriremos el programa RStudio que instalamos en el Tutorial02 Cuando trasinstalarlo iniciamos RStudio por primera vez nos encontramos con una ventana similar a esta

1

Como ves la ventana aparece dividida en tres grandes regiones o paneles que hemos rotulado enrojo en la figura

A la izquierda la Consola de Comandos de R en la que vamos a empezar nuestro trabajo

En la parte superior derecha el panel con las pestantildeas de Historial (History)y Espacio detrabajo (Workspace) (en versiones recientes de RStudio en lugar del Espacio de Trabajo semuestra el Entorno (Environment) no te preocupes por esto de momento)

En la parte inferior derecha el panel con pestantildeas para Ficheros (Files) Graacuteficos (Plots)Libreriacuteas (Packages) y Ayuda (Help) Las versiones recientes incluyen panel Visor (Viewer)

En este y proacuteximos tutoriales y con la praacutectica iremos conociendo la finalidad de cada una deesas regiones Vamos a comenzar con la Consola de Comandos En ella aparecen en primer lugaruna serie de mensajes con informacioacuten sobre la versioacuten de R que estamos ejecutando (la 300 enesa figura aunque seguramente tuacute habraacutes instalado una versioacuten superior) Y bajo estos mensajesaparece el prompt de R que es el siacutembolo gt junto al que parpadea el cursor

Ese siacutembolo y el cursor parpadeando nos indican que ese es el prompt activo y que R estaacute esperandouna orden En esta primera seccioacuten vamos a aprender a usar R (a traveacutes de RStudio) como unacalculadora El objetivo principal es que empecemos a familiarizarnos con la sintaxis de R y conlas peculiaridades de la interfaz de RStudioEmpecemos el juego Vamos a calcular 32 Aseguacuterate de que estaacutes situado en la liacutenea del promptde R Si es necesario haz clic con el ratoacuten junto al siacutembolo gt y despueacutes teclea

3^2

El siacutembolo ^ es un acento circunflejo el siacutembolo and normalmente situado junto a la P de un tecladoespantildeol estaacutendar en Windows y en los Mac situado junto a la tecla fn Al pulsar Entrar apareceraacuteuna liacutenea como esta

[1] 9

y justo debajo aparece un nuevo prompt que ahora pasa a ser el prompt activo

El uno entre corchetes es la forma en la que R nos indica que esta es la primera liacutenea de su res-puesta En este caso la respuesta cabe holgadamente en una liacutenea pero pronto veremos casos enlos que no es asiacute El nuacutemero 9 naturalmente es el valor 32 que hemos calculado Como ves en Rse usa ^ para los exponentes igual que en Calc

2

Las operaciones aritmeacuteticas elementales se representan asiacute en R (como en muchos otros programas)

suma +

resta -

producto

cociente

potencia ^

La raiacutez cuadrada es una funcioacuten en R la primera que vamos a discutir Se representa con sqrt(del ingleacutes square root) Es como en Calc pero recuerda que en R la diferencia entre mayuacutesculasy minuacutesculas es siempre esencial Sqrt o SQRT no funcionaraacuten Se usa poniendo el argumentoentre pareacutentesis Por ejemplo si tecleas sqrt(9) en el siguiente prompt activo y lo ejecutas (pulsaEntrar) obtendraacutes el resultado previsible

Un aviso aunque hasta aquiacute te hemos mostrado el resultado mediante figuras con capturas depantalla vamos a empezar a usar cada vez maacutes descripciones textuales como esta

gt sqrt(9)[1] 3

Soacutelo recurriremos a las capturas de pantalla en los casos en los que nos interesa destacar visualmentealguacuten aspecto de la interfaz graacutefica del programa La ventaja (aparte de ahorrar espacio en eltutorial claro) es que estas descripciones textuales te permitiraacuten seleccionar el texto en la versioacutenen pdf del tutorial para usar copiar y pegar con RStudio Ya iraacutes viendo que esa forma de trabajaraunque a veces tiene alguacuten problema a la larga te resulta coacutemoda Pero a la vez que te decimosesto te recomendamos que especialmente al principio practiques tecleando tuacute mismo muchos delos comandos para acostumbrarte a la interfaz y para ayudarte a recordarlos mas eficazmente Enlas descripciones textuales a menudo te mostraremos juntos prompt comandos y salida en otroscasos nos limitaremos al comando R Recuerda si usas copiar y pegar que el prompt gt no formaparte del comandoNaturalmente ademaacutes de sqrt en R hay muchas otras funciones relacionadas con la Estadiacutesticaque iremos encontrando en el resto del curso Para practicar un poco maacutes este uso de R comocalculadora y la teacutecnica de copiar y pegar ademaacutes de introducir un par de ideas nuevas vamos aproponerte el primer ejercicio de este tutorial

3

Ejercicio 1En este ejercicio vamos a utilizar las liacuteneas de coacutedigo que aparecen a continuacioacuten Copia o tecleacada liacutenea en el prompt (iexclpractica las dos maneras) una por una y ejecuacutetalas pulsando Entrartras copiar o teclear cada liacutenea Trata de adivinar el resultado de cada operacioacuten antes de ejecutarel coacutedigo

2+315-74613513513513+15sqrt(25)sqrt(26)sin(pi)sin(314)

Los resultados de este ejercicio aparecen en la Tabla 1 (paacuteg 5) iexclNo los mires sin haberlo intentadoEsos resultados se merecen algunos comentarios

Seguramente las liacuteneas que menos previsibles te han resultado son las que contienen losoperadores y Estos operadores representan respectivamente el cociente y el resto dela divisioacuten entera

Lo maacutes importante que tienes que observar en los resultados es que R trabaja siempre conla representacioacuten mediante decimales de los nuacutemeros Esto es evidente por ejemplo en larespuesta a la instruccioacuten

13+15

que representa la operacioacuten1

3+

1

5

pero cuyo resultado en R es 05333333 y no 815 El valor decimal es una aproximacioacuten ala fraccioacuten pero no es un resultado exacto (la fraccioacuten siacute es exacta) Por lo tanto cuandohagamos operaciones con R tenemos que tener cuidado con la posible peacuterdida de precisioacutenque llevan siempre aparejadas las operaciones con decimales Teacutecnicamente esto significaque R es un programa (esencialmente) numeacuterico Maacutes adelante en el curso veremos alguacutenprograma simboacutelico y discutiremos la diferencia entre ambos

Fiacutejate en que como hemos dicho R ha interpretado el siacutembolo

13+15

como la operacioacuten1

3+

1

5

en lugar de darle otras interpretaciones posibles como por ejemplo

1(3 + 1

5

) Para hacer esa interpretacioacuten R ha aplicado una serie de reglas de lo que se conoce comoprioridad de operadores y que dicen en que orden se realizan las operaciones seguacuten el tipode operador No queremos entretenernos con esto ahora asiacute que baste con decir que encaso de duda siempre puedes (y a menudo debes) usar pareacutentesis para despejar la posibleambiguumledad

4

gt 3^2[1] 9gt sqrt(9)[1] 3gt 2+3[1] 5gt 15-7[1] 8gt 46[1] 24gt 135[1] 26gt 135[1] 2gt 135[1] 3gt 13+15[1] 05333333gt sqrt(25)[1] 5gt sqrt(26)[1] 509902gt sin(pi)[1] 1224606e-16gt sin(314)[1] 0001592653

Tabla 1 Resultados del Ejercicio 1

Por ejemplo para distinguir entre las dos interpretaciones que hemos dado puedes escribir

(13)+(15)

o por el contrario

1 ( (3+1)5 )

Un uso prudente de pareacutentesis y espacios en las operaciones es una marca caracteriacutestica delbuen hacer cuando se escribe coacutedigo en un ordenador Si alguna vez esto llega a ser unproblema para ti habraacute llegado el momento de aprender algo maacutes sobre esa prioridad deoperadores

La funcioacuten sin es la funcioacuten seno de la Trigonometriacutea Ademaacutes R utiliza el siacutembolo pi parareferirse a la constante matemaacutetica π asymp 3141593 Y el caraacutecter numeacuterico de R se refleja denuevo en el hecho de que al ejecutar sin(pi) no has obtenido 0 (que es la respuesta exacta)sino

gt sin(pi)[1] 1224606e-16

La notacioacuten que se usa en la respuesta es la forma tiacutepica de traducir la notacioacuten cientiacutefica alos lenguajes de ordenador y calculadoras El siacutembolo 1224606e-16 representa el nuacutemero

1224606 middot 10minus16

de manera que el nuacutemero -16 que sigue a la letra e en esta representacioacuten es el exponentede 10 (tambieacuten llamado orden de magnitud) mientras que el nuacutemero 1224606 se denominaa veces mantisa Puedes leer maacutes sobre la notacioacuten cientiacutefica en este artiacuteculo de la Wikipedia

5

httpeswikipediaorgwikiNotacioacuten_cientiacutefica

En cualquier caso el exponente -16 nos indica que se trata de un nuacutemero extremadamentecercano a 0 Fiacutejate en cambio que si usas 314 como aproximacioacuten de π la respuesta aunquepequentildea es todaviacutea del orden de mileacutesimas

11 Algunos detalles de la interfaz de RStudioAntes de avanzar maacutes queremos ocuparnos de algunos aspectos del trabajo con RStudio que amenudo causan algunos quebraderos de cabeza a quienes se inician en el uso del programa

Comandos incompletos

Para ver un ejemplo prueba a escribir en el prompt activo esta operacioacuten evidentemente incom-pleta

3

y pulsa Entrar La respuesta de R es un siacutembolo +

gt 3+

que en este caso no tiene nada que ver con la suma Es la forma que tiene R de decirnos ldquonecesitoalgo maacutesrdquo Cuando R se encuentra con una expresioacuten que considera no erroacutenea sino incompleta(por ejemplo con un pareacutentesis abierto al que corresponde un pareacutentesis cerrado) entonces nos locomunica con este siacutembolo + Y al hacerlo nos da la oportunidad en casos como este de corregirel error completando la expresioacuten incompleta Asiacute que si ahora junto al siacutembolo + escribes 2 deesta forma

gt 3+ 2

y pulsas Entrar veraacutes que R ha entendido la expresioacuten completa 32 y nso devuelve la respuesta

gt 3+ 2[1] 6

En alguacuten momento no obstante ese siacutembolo + de los comandos incompletos se convertiraacute en uninconveniente Imagiacutenate por ejemplo que queriacuteas multiplicar 5 middot7 pero que por error has tecleadola expresioacuten

57-

y has pulsado Entrar antes de darte cuenta del error En tal caso R piensa que esa expresioacuten estaacuteincompleta y vuelve a aparecer el signo +

gt 57-+

iexclPero ahora no queremos antildeadir nada En este caso podriacuteas antildeadir un 0 sin que eso afectara elresultado pero habraacute maacutes adelante muchos casos en los que no hay una solucioacuten sencilla evidenteiquestCoacutemo salimos del paso Simplemente pulsamos la tecla Esc (escape) con lo que R interrumpe elcomando y nos devuelve a un nuevo prompt activo sin calcular nada

Navegando el historial de comandos

En un caso como el que hemos descrito no supone un problema volver a teclear la expresioacutenevitando el error que habiacuteamos cometido Pero en ocasiones si hemos escrito una expresioacuten real-mente complicada y por ejemplo hemos tecleado un pareacutentesis de maacutes en medio de la expresioacutenseguramente prefeririacuteamos no tener que volver a teclear la expresioacuten completa Un remedio ldquocaserordquoconsiste en seleccionar y copiar la expresioacuten erroacutenea pegarla en el prompt activo y editarla ahiacutepara corregir el errorHay una segunda manera de conseguir el mismo efecto Otra caracteriacutestica interesante de la Consolade Comandos es que si te situacuteas en el prompt activo y pulsas las teclas con flechas arriba o abajoveraacutes pasar la lista completa de comandos que has ejecutado desde el principio de la sesioacuten detrabajo Prueba a hacerlo ahora para ver como funciona Si has ejecutado todos los comandosque hemos ido describiendo en este tutorial puedes pulsar la flecha uarr repetidamente e iraacutes viendopasar todos esos comandos hasta llegar al

6

3^2

con el que hemos empezado Y con la flecha hacia abajo recorres la lista en sentido contrario hastael comando de ejecucioacuten maacutes reciente Esa lista de comandos es el Historial de Comandos Usandolas flechas arriba y abajo puedes recorrer el Historial de Comandos detenerte en cualquier puntomodificar ese comando si lo deseas y despueacutes ejecutarlo (con o sin modificaciones) Al principiopuede que te cueste un poco acostumbrarte pero una vez que te habituacutees a esta herramientala encontraraacutes sin duda muy uacutetil El Historial de Comandos que puedes recorrer con las flechasarriba y abajo se limita a la sesioacuten de trabajo actual Pero si miras en el panel superior derecho deRStudio veraacutes una pestantildea titulada History que se muestra en esta figura

El Historial de Comandos que aparece en ese panel refleja tus comandos de esta y anterioressesiones Si esta es tu primera sesioacuten de trabajo con R ambos coincidiraacuten claro estaacute Pero a medidaque vayas abriendo RStudio en diacuteas sucesivos te puede resultar muy uacutetil localizar por ejemploun comando que usaste hace dos sesiones pero que no recuerdas exactamente Los comandos queaparecen en ese panel se pueden copiar y pegar en la Consola de Comandos o de forma maacutes directapuedes seleccionar uno de ellos con el ratoacuten y pulsar en el botoacuten To Console que hemos destacadoen la Figura

111 Errores

Los errores son inevitables y nos conviene estar preparados para su aparicioacuten Dependiendo delmotivo del error R nos informaraacute con distintos tipos de mensajes Asiacute que vamos a ver algunosejemplos para conocer la terminologiacutea asociadaPara empezar este es el mensaje de error que obtenemos tras ejecutar una expresioacuten sin sentido

gt 43Error unexpected rsquorsquo in 4

Los mensajes de error aparecen en color rojo en RStudio Este mensaje de error en particulares bastante faacutecil de entender R simplemente se queja de que esta expresioacuten es defectuosa Noincompleta como alguna que hemos visto antes Es imposible completar esta expresioacuten de formacorrectaVeamos otro tipo de mensaje de error Ya sabes que no se puede dividir por 0 Si lo intentamos enR

gt 20[1] Inf

7

el siacutembolo Inf (de infinito) nos avisa del problema Ese siacutembolo tambieacuten puede aparecer con signomenos si por ejemplo tratas de calcular el logaritmo neperiano de 0 En R el logaritmo neperianoes la funcioacuten log asiacute que seriacutea

gt log(0)[1] -Inf

En ambos casos R no lanza un mensaje de error pero utiliza el siacutembolo de infinito porque asiacute nosproporciona maacutes informacioacuten matemaacutetica sobre lo que ha ocurrido Tambieacuten puede suceder queel siacutembolo Inf aparezca como resultado intermedio en una expresioacuten En ese caso R aplica unasreglas sencillas de aritmeacutetica con infinitos para tratar de darnos la respuesta maacutes coherente desdeel punto de vista matemaacutetico Por ejemplo si calculas

3(-5(4-2^2))

Entonces R empieza calculando el resultado del pareacutentesis 4-2ˆ2 que es 0 Asiacute que al dividir minus5entre 0 R obtiene -Inf y finalmente al calcular 3(-Inf) se obtiene -Inf como valor de laexpresioacuten Comprobeacutemoslo

gt 3(-5(4-2^2))[1] -Inf

A pesar de que R no lanza mensajes de error estaacute claro que en la mayoriacutea de los casos no esdeseable que nuestros caacutelculos produzcan Inf como resultado en ninguna etapaEn otros casos el problema es diferente Por ejemplo si tratas de calcular la raiacutez cuadrada de unnuacutemero negativo

gt sqrt(-4)[1] NaNWarning messageIn sqrt(-4) NaNs produced

En este caso obtenemos una respuesta NaN y ademaacutes una advertencia (warning) sobre la aparicioacutende esa respuesta El siacutembolo NaN es la abreviatura de Not a Number es decir ldquono es un nuacutemerordquo Estaes la respuesta que obtendremos cuando tratamos de hacer operaciones como esta que producencomo resultado un nuacutemero complejo R es capaz de trabajar con los nuacutemeros complejos pero comono los vamos a necesitar en el curso no nos ocuparemos de esto Para que veas otro ejemplo esarespuesta NaN aparece tambieacuten si tratamos de ir demasiado lejos con la aritmeacutetica con infinitos

gt (10)+log(0)[1] NaN

En este caso R se ha encontrado en un paso intermedio con Inf - Inf y su respuesta ha sido NaN

En cualquier caso y como resumen final tenemos que tratar de evitar que nuestros caacutelculos con-duzcan a este tipo de expresiones

Haciendo limpieza en la Consola de Comandos

Si has seguido todas las instrucciones hasta aquiacute tu Consola de Comandos seguramente empiezaa estar llena de comandos y algunos pueden quedar ocultos en la parte superior Naturalmentepuedes usar las barras de desplazamiento para moverte por la Consola Pero en sesiones largas detrabajo o cuando hemos terminado de hacer pruebas y queremos ejecutar una versioacuten definitivade nuestro trabajo es normal que queramos hacer limpieza en la Consola Eso se consigue con lacombinacioacuten de teclas Ctrl + L iexclCuidado Es un proceso no reversible podraacutes seguir navegandoel Historial de Comandos con las teclas arriba y abajo pero para recuperar los resultados tendraacutesque ejecutar de nuevo los comandosMaacutes adelante aprenderemos formas de guardar nuestro trabajo de una manera maacutes eficiente Perote podemos adelantar que puesto R se maneja escribiendo comandos bastaraacute con guardar esoscomandos en ficheros de texto plano Ahora vamos a cambiar de tema y para empezar desde cerovamos a cerrar RStudio para eliminar las trazas del trabajo que hemos hecho

2 Variables y vectoresVuelve a abrir RStudio para continuar el trabajo En la seccioacuten previa hemos usado R como unacalculadora Pero para ir maacutes allaacute tenemos que disponer de estructuras de datos Ese teacutermino

8

describe en Computacioacuten las herramientas que nos permiten almacenar y procesar informacioacutenLas estructuras de datos maacutes baacutesicas de R son las variables y los vectores En proacuteximos tutorialesnos iremos encontrando con otras estructuras de datos matrices dataframes listas entre otras

21 Variables en RUna variable en R es un siacutembolo que usamos para referirnos a un valor Por ejemplo si te situacuteasen la Consola de Comandos tecleas

a = 2

y ejecutas esa instruccioacuten entonces aunque aparentemente no ha sucedido nada (porque no hayrespuesta) a partir de ese momento R ha asignado el valor 2 al siacutembolo a Asiacute que si por ejemplotecleas y ejecutas

a + 1

obtendraacutes como respuesta 3

Ejercicio 2iquestQueacute se obtiene al ejecutar estos comandos uno detraacutes de otro iquestCuaacutento valen las variables a by c al final

a = 2b = 3c = a + ba = b cb = (c - a)^2c = a b

La solucioacuten estaacute en la paacutegina 47 iexclNo la mires antes de intentar pensar el ejercicio por ti mismo

En el Capiacutetulo 1 del libro hemos hablado de variables cualitativas y cuantitativas Estas uacuteltimastoman siempre valores numeacutericos y las variables de R sirven desde luego para almacenar esa clasede valores Pero como iremos viendo en sucesivos tutoriales tambieacuten se pueden utilizar variablesde R para guardar valores de variables cualitativas (factores) y otros tipos de objetos que iremosconociendo a lo largo del curso De momento para que veas a que nos referimos recordaremos elEjemplo 111 del libro (paacuteg 6) en el que teniacuteamos una variable cualitativa ordenada que representael pronoacutestico de un paciente que ingresa en un hospital Prueba a ejecutar este coacutedigo

pronostico = Leve

simplemente para que de momento veas que

R no protesta El valor Leve es un valor perfectamente aceptable

En R los valores que representan palabras frases o como las llamaremos teacutecnicamente cadenasalfanumeacutericas se escriben siempre entre comillas Puedes usar comillas simples o dobles perote aconsejamos que uses dobles comillas

La relacioacuten entre factores y valores alfanumeacutericos en R es algo maacutes complicada de lo que estesencillo ejemplo parece sugerir Pero ya tendremos ocasioacuten en futuros tutoriales de extendernossobre eso

Asignaciones

Las instrucciones como

a = 2

o como

b = (c - a)^2

se denominan asignaciones En la primera por ejemplo decimos que hemos asignado el valor 2a la variable aQueremos advertir al lector de que en R hay otra forma esencialmente equivalente de escribir lasinstrucciones y que de hecho se usa mayoritariamente En lugar del siacutembolo = puedes conseguirel mismo efecto escribiendo lt- (el signo ldquomenorrdquo seguido sin espacios de un signo ldquomenosrdquo) Asiacuteque si ejecutas

9

a lt- 2

el resultado seraacute el mismo que antes con = Las dos notaciones tienen ventajas e inconvenientes peronosotros preferimos = porque se parece maacutes a lo que se utiliza en muchos lenguajes de programacioacuten

Coacutemo ver los resultados de un caacutelculo a la vez que lo hacemos

Ya habraacutes notado que al hacer una asignacioacuten R no produce ninguna respuesta y se limita aguardar el valor en la variable En una asignacioacuten como a=2 esto no genera ninguna duda Perosi el miembro derecho de la asignacioacuten es una expresioacuten maacutes complicada puede ser convenientepedirle a R que nos muestre el resultado de esa expresioacuten a la vez que se hace la asignacioacutenImagiacutenate por ejemplo esta situacioacuten

b = 2c = -2d = -4a = b c^2 d + 3

iquestCuaacutel es el valor que se asigna a la variable a Una forma de averiguarlo es simplemente ejecutaruna liacutenea adicional en la que aparece soacutelo el nombre de la variable que queremos inspeccionar Alejecutar esta sentencia R nos devuelve como respuesta

gt a[1] 1

Pero hay otra manera de conseguir que R nos muestre el resultado de la asignacioacuten que es maacutesinteresante porque produce coacutedigo maacutes simple Basta con encerrar toda la asignacioacuten entre pareacuten-tesis El resultado es

gt ( a = b c^2 d + 3 )[1] 1

como antes Este ejemplo es desde luego bastante artificial Te recordamos en cualquier caso laconveniencia de utilizar pareacutentesis para hacer maacutes legibles las expresiones y evitar posibles erroresPero a la vez la posibilidad de comprobar el resultado de las asignaciones aumenta la fiabilidaddel coacutedigo que escribimos

Nombres de las variables

Aunque hasta ahora hemos usado letras como nombres de las variables puedes utilizar nombresmaacutes descriptivos Y muchas veces es una buena idea hacerlo Por ejemplo puede que hace unasemana hayas escrito estas instrucciones para resolver un problema

a = 2b = 3c = a b

Pero si las vuelves a ver pasada una semana es posible que no recuerdes queacute era lo que estabastratando de conseguir al hacer esto En cambio al ver estas instrucciones

espacio = 2tiempo = 3velocidad = espacio tiempo

es mucho maacutes faacutecil reconocer el objetivo que persiguen A lo largo de los tutoriales del curso vamos ainsistir muchas veces en la necesidad de que el coacutedigo esteacute bien organizado y esteacute bien documentadoUn primer paso en esa direccioacuten es tratar de elegir nombres descriptivos para las variables En Rlas reglas para los nombres de variables son muy flexibles esencialmente que empiecen por unaletra y no contengan espacios ni caracteres especiales como + pareacutentesis etceacutetera Pero cuidadocon los excesos Es cierto que puedes usar nombres de variables arbitrariamente largos Pero si usascomo nombre

Estavariablealmacenaelresultadodelaoperaciontaninteresantequeacabamosdehacer

tu trabajo resultaraacute ilegible Como siempre se necesita un equilibrio y con la praacutectica encontraraacutesel tuyo (consejo zen gratuito del tutorial de hoy) Para empezar es una buena idea combinarmayuacutesculas y minuacutesculas en los nombres de las variables Si vas a usar una variable para representarla temperatura final de un proceso el nombre temperaturafinalproceso es menos legible y maacuteslargo que tempFinal Es mucho maacutes faacutecil por otra parte que te equivoques tecleando el primerode esos nombres

10

22 VectoresEn Estadiacutestica lo habitual es trabajar con colecciones o muestras de datos Y para almacenar esascolecciones de datos la estructura maacutes baacutesica de R son los vectores En este apartado vamos aempezar nuestro trabajo con ellos aunque a lo largo del curso auacuten tendremos ocasioacuten de aprenderbastante maacutes sobre el manejo de los vectores de RPara empezar vamos a trabajar con vectores que contienen una coleccioacuten de nuacutemeros que puedenser las edades de los alumnos de una clase

22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19

En R las listas de nuacutemeros como esta se almacenan en vectores El vector que corresponde a esasedades se construye en R mediante un comando como este

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19)

En realidad en esa expresioacuten hemos hecho dos cosas

1 Hemos creado el vector con los datos en la parte derecha de la expresioacuten

c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19)

Los datos estaacuten separados por comas y rodeados por pareacutentesis Hasta aquiacute todo es bastantetiacutepico pero fiacutejate especialmente en la letra c que precede al primer pareacutentesis Esa letra ces el nombre de una nueva funcioacuten de R y es la forma maacutes sencilla que existe en R paracrear un vector de datos Podriacutea pensarse que la c es de crear pero en realidad proviene deconcatenar Enseguida entenderemos porque es asiacute

2 Una vez creado el vector lo hemos asignado a la variable edades Hasta ahora soacutelo habiacuteamosusado variables para identificar un uacutenico valor (un nuacutemero o una cadena alfanumeacuterica)Pero una variable puede usarse para identificar un vector o como veremos maacutes adelanteestructuras mucho maacutes complejas

Una observacioacuten maacutes los vectores de R se usan para almacenar valores de una variable Y enparticular todos los datos de un vector son del mismo tipo de variable No se puede mezclar en unvector nuacutemeros y cadenas alfanumeacutericas (aparentemente R te dejaraacute hacerlo pero internamentehabraacute convertido todos los nuacutemeros en cadenas alfanumeacutericas)

Manos a la obra Prueba a copiar el comando anterior en tu Consola de comandos (puedes usarcopiar y pegar desde este fichero) y ejecuacutetalo Si las cosas van bien no esperes ninguna respuestacomo ya hemos dicho R no te muestra el resultado de las asignaciones Recuerda que si quieresver el resultado de una asignacioacuten puedes rodear toda liacutenea con pareacutentesis como en

(edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19))

Otra opcioacuten naturalmente es preguntarle a R por el valor de edades despueacutes de la asignacioacutenEscribe simplemente edades en la Consola de Comandos y ejecuacutetalo Veraacutes de nuevo el contenidode esa variable

Vamos a hacer algunas operaciones con este vector Imagiacutenate que como sucede a menudo despueacutesde haber creado nuestra lista de edades de alumnos desde la administracioacuten nos avisan de que haycinco alumnos nuevos recieacuten matriculados y debemos incorporar sus edades que son

22 18 20 21 20

a nuestro vector de datos Naturalmente podemos empezar de nuevo pero es preferible reutilizarel vector edades que ya habiacuteamos creado Vamos a ver esto como primer ejemplo para empezar aaprender coacutemo se manipulan vectores en R Una forma de antildeadir los datos es empezar creando unnuevo vector (con la funcioacuten c de R)

(edades2 = c(22 18 20 21 20))

Y a continuacioacuten concatenamos los vectores usando de nuevo la misma funcioacuten c de una maneradistinta

(edades = c( edades edades2))

11

Hemos rodeado toda la liacutenea con pareacutentesis para ver el resultado y poder observar coacutemo hacambiado el vector edadesVamos a analizar paso a paso lo que ha ocurrido

La instruccioacuten c( edades edades2) toma los datos contenidos en edades y edades2 y losconcatena en ese orden para fabricar un nuevo vector que todaviacutea no estaacute guardado enninguna variable

La asignacioacuten edades = c( edades edades2) toma ese vector y lo guarda en la propiavariable edades Al hacer esto como era de esperar el anterior vector edades es reemplazadocon la nueva lista y su contenido anterior se pierde (cuidado con esto las reasignaciones sonuna de las formas habituales de cometer errores)

El nombre de la funcioacuten c proviene en realidad de concatenate concatenar en ingleacutesLa siguiente figura resume lo que hemos venido haciendo con estos datos

Los nuacutemeros entre corchetes al principio de cada fila como el [1] y el [16] de este ejemploson soacutelo ayudas para que podamos localizar los elementos del vector En mi pantalla la primerafila muestra los primeros 15 nuacutemeros del vector Pero en la tuya si la ventana de RStudio es dedistinta anchura los nuacutemeros entre corchetes pueden ser distintos Hasta ahora soacutelo habiacuteamos vistoejemplos con [1] que es lo que sucede cuando la respuesta es un vector que cabe en una uacutenicaliacutenea

3 Ficheros csv con REn esta seccioacuten vamos a aprender a utilizar ficheros csv con R En el Tutorial-01 hemos vistoalgunos ejemplos de ese tipo de ficheros y el manejo baacutesico con una hoja de caacutelculo como CalcComo vimos alliacute un fichero csv tiacutepico contiene una tabla de datos con varias columnas Esaestructura de tabla se haraacute imprescindible maacutes adelante Pero durante una buena parte del cursonosotros nos vamos a limitar a problemas en los que interviene una uacutenica variable En tal casopara almacenar los datos de esa variable nos podemos a limitar a considerar un tipo de ficheroscsv muy baacutesico como el fichero adjunto

Guaacuterdalo en la subcarpeta datos de tu directorio de trabajo (el que contiene este pdf) Si lo abrescon un editor de texto (como el Bloc de Notas en Windows) veraacutes como muestra esta figura

12

61371381381381391391351381371381371371361361371351381391341371351371371351391341371371371381351381391371341361361361391381361371361371361361381361351351361361381351381351391371361391351371381381371310137138137135136138138137133135136137135137137135138134138138138136137136136138135136135138136139137

que el fichero contiene soacutelo una columna de datos que en este ejemplo corresponde a valores deuna variable cuantitativa discreta En la figura soacutelo se muestra una parte de los datos

Ejercicio 3iquestCuaacutentos datos hay en ese vector Usa Calc para averiguarlo pronto aprenderemos a hacerlo conR Solucioacuten en la paacutegina 47

Queremos utilizar esos datos en R y para eso vamos a (1) leerlos desde el fichero y (2)guardarlos enun vector El resultado seraacute como si nosotros hubieacuteramos creado ese vector tecleaacutendo sus elementosdirectamentePara el primer paso (la lectura del fichero csv) vamos a tener que empezar por explicarle a R(usando RStudio como intermediario) donde estaacute el fichero que contiene esos datos Cuando tra-bajamos con ficheros R utiliza un directorio de nuestro ordenador como directorio de trabajo Acontinuacioacuten vamos a aprender a elegir un directorio de trabajo Puedes usar cualquier carpeta yen lo que sigue vamos a suponer que hemos elegido el Escritorio Lo maacutes importante es que esacarpeta debe contener a su vez una subcarpeta llamada datos Y aseguacuterate de que los ficheroscsv que vas a usar estaacuten almacenados en esa subcarpeta llamada datos

Usamos el menuacute Session rarr Set Working Directory rarr Choose Directory

Se abre un cuadro de diaacutelogo del sistema y navegamos hasta la carpeta que contiene el ficherocsv que en mi caso es el Escritorio Cuando selecciono el Escritorio veo aparecer en la Consolade Comandos de R un comando que RStudio ha escrito y ejecutado por nosotros

13

setwd(CUsersFernandoDesktop)

Este es el resultado en mi ordenador (de ahiacute el nombre de usuario) usando Windows 10 Enversiones maacutes antiguas de Windows o en una maacutequina con Linux o un Mac el comando seraacuteligeramente distinto Cuando tengamos maacutes praacutectica aprenderemos otras formas de seleccionar eldirectorio de trabajo o incluso de utilizar ficheros situados fuera de ese directorio de trabajo Peropor el momento resulta maacutes coacutemodo dejar que RStudio haga ese trabajo para nosotrosAhora R ya sabe doacutende estaacute el fichero que nos interesa pero todaviacutea no sabe cual es Para ello vamosa utilizar la funcioacuten readtable de R Aunque esta funcioacuten tiene muchas opciones disponiblesnuestro primer uso de ella seraacute bastante sencillo Copia y ejecuta el siguiente coacutedigo en RStudio

(vectorEdades = readtable(datosTut02-Edadescsvheader = FALSE)[1])

En esta instruccioacuten le decimos a R que use la funcioacuten readtable para leer el contenido del ficheroTut02-Edadescsv y que almacene lo que ha leiacutedo en un vector que hemos decidido llamarvectorEdades Y aunque no es necesario entender en detalle el funcionamiento de readtable eneste momento vamos a explicar un poco maacutes lo que hemos hecho A medida que el curso avanceiraacutes teniendo maacutes ocasiones de practicar esto e iraacute quedando cada vez maacutes claroLa opcioacuten header = FALSE sirver para indicarle a R que la tabla almacenada en el fichero no tieneuna liacutenea de cabecera (en ingleacutes header) que cuando existe suele contener los nombres de lasvariables de la tabla Ademaacutes la funcioacuten readtable sirve para leer tablas con varias columnasobteniendo como resultado un objeto de R de tipo dataframe Pero nuestro primer ejemplo esmuy sencillo y la tabla soacutelo tiene una columna Asiacute que usamos la notacioacuten [1] para indicarle aR que soacutelo queremos la primera columna de esa tabla considerada como un vectorAl ejecutar esa orden habraacutes obtenido una respuesta como esta

gt gt (vectorEdades = readtable(datosTut02-Edadescsv header = FALSE)[1])[1] 6 7 8 8 8 9 9 5 8 7 8 7 7 6 6 7 5 8 9 4 7 5 7[24] 7 5 9 4 7 7 7 8 5 8 9 7 4 6 6 6 9 8 6 7 6 7 6[47] 6 8 6 5 5 6 6 8 5 8 5 9 7 6 9 5 7 8 8 7 10 7 8[70] 7 5 6 8 8 7 3 5 6 7 5 7 7 5 8 4 8 8 8 6 7 6 6[93] 8 5 6 5 8 6 9 7

Como hemos dicho antes los nuacutemeros entre corchetes al principio de cada fila que en mi casoson [1] [24] [47] [70] y [93] son soacutelo ayudas para que podamos localizar los elementos delvector En mi pantalla cada primera fila muestra 23 nuacutemeros del vector Pero en la tuya si laventana de RStudio es de distinta anchura los nuacutemeros entre corchetes pueden ser distintos

En cualquier caso ahora el vector vectorEdades contiene la informacioacuten del fichero csv con el quehemos empezado En la Seccioacuten 4 vamos a empezar a hacer Estadiacutestica Descriptiva Pero antes tepedimos un poco maacutes de paciencia porque vamos a entretenernos un poco maacutes en los detalles delmanejo de ficheros csv con R No pretendemos ser exhaustivos ni mucho menos pero siacute queremosaprender lo suficiente como para evitarnos los problemas maacutes habituales en los casos maacutes sencillosPara cerrar este apartado es conveniente haber visto el error que se produce cuando el fichero quetratamos de leer desde R no existe o no estaacute en el directorio de trabajo

Ejercicio 4Prueba a ejecutar

errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)

y fiacutejate en el mensaje de error Solucioacuten en la paacutegina 47

Otra variante del fichero de entrada

Los ficheros csv que contienen un uacutenico vector (en lugar de una tabla de datos) pueden adoptarformatos distintos del que acabamos de ver Por ejemplo el fichero adjunto

contiene los mismos datos que Tut02-Edadescsv pero ahora los datos del vector estaacuten todos enuna fila y separados por comas Guaacuterdalo como antes en la subcarpeta datos El aspecto delfichero visto a traveacutes de un editor de texto es este (soacutelo son visibles una parte de los datos)

14

67888995878776675894757759477785897466698676766865566858597695788710787568873567577584888676685658697

Desde luego no nos podemos plantear transformar a mano este vector en uno como el anteriorLa solucioacuten que te proponemos pasa por la hoja de caacutelculo y la opcioacuten de trasponer una tablaque hemos visto en el Tutorial-00 lo leeriacuteamos en una fila de la hoja y luego habriacutea que usar elPegado especial para trasponerlo -es decir girarlo- para finalmente volver a guardarlo Alterna-tivamente hay otras soluciones sin salir de R usando una funcioacuten llamada scan o usando de nuevoreadtable y trasponiendo la tabla dentro de R Esos meacutetodos son sencillos cuando se aprendeun poco maacutes sobre R pero por el momento y para los ejemplos sencillos que encontraremos nosvamos a conformar con ese enfoque baacutesico que usa la hoja de Caacutelculo si es necesario

31 Coacutemo obtener ayuda y usar el tabulador en RStudioVamos a aprovechar estos ejemplos de lectura de ficheros csv para aprender a obtener ayuda sobrelas funciones de R La mayoriacutea de las funciones de R como la funcioacuten readtable o la funcioacutenscan que hemos mencionado al final del anterior apartado tienen muchos argumentos opcionalesY hay muchiacutesimas funciones en R (cada vez maacutes porque como veremos maacutes adelante usuarios detodo el mundo antildeaden constantemente funciones nuevas a R cuando las necesitan) No es posiblerecordar todos esas funciones cada una con sus opciones asiacute que es muy importante aprender aobtener esa informacioacuten cuando la necesitamosPara ver como obtener esa informacioacuten en RStudio vamos a usar por ejemplo la funcioacuten scanSituacuteate en una liacutenea vaciacutea de la Consola de Comandos escribe scan y a continuacioacuten mientras elcursor parpadea junto a la n final de scan pulsa la tecla del tabulador (si esto no funciona usa latecla F1 y mira el panel ayuda de RStudio) Veraacutes aparecer una ventana emergente con informacioacutensobre la funcioacuten scan como en esta figura

15

Como ves se muestra un resumen sobre la funcioacuten scan que a veces seraacute suficiente Si necesitasmaacutes detalles haz caso a la indicacioacuten que aparece al final de esa ventana y pulsa la tecla F1 Alhacerlo veraacutes que en el panel inferior derecho de RStudio aparece el fichero de ayuda de la funcioacutenscan como en esta figura

Esos ficheros de ayuda son muy uacutetiles aunque al principio pueden resultar un poco intimidatoriosya sea por un exceso de informacioacuten ya sea porque se da por supuesto que el usuario ya entiendealgunos conceptos baacutesicos de R Podemos garantizar al lector que a medida que se progresa en Rla utilidad de estos ficheros aumentaPero la utilidad de la tecla tabulador en RStudio no se acaba ahiacute Supongamos que quieres aplicarreadtable para leer el fichero Tut02-Edadescsv Pero te da pereza escribir un nombre tan largoo no recuerdas exactamente el nombre o dudas entre dos nombres no importa cual sea el motivoEmpiezas a escribir la orden tecleas

(vectorEdades2 = readtable(datos

y de nuevo justo en este punto pulsas el tabulador Entonces RStudio te ofrece en una nuevaventana emergente todos los ficheros disponibles en la carpeta datos

Y ahora puedes usar esa lista seleccionar el fichero que quieras utilizar Puedes tambieacuten teclearalguna letra maacutes del nombre para acotar auacuten maacutes la buacutesqueda cuando la carpeta contiene muchosficherosEn general la idea es que en RStudio el tabulador es tu amigo Como tendremos ocasioacuten decomprobar RStudio nos ofrece bastante ayuda para hacer maacutes coacutemodo nuestro trabajo con R yel tabulador es una de las herramientas maacutes versaacutetiles y uacutetiles

16

32 El camino contrario escribir un vector a un fichero de tipo csvHemos aprendido a leer con R vectores de datos a partir de ficheros de tipo csv Pero muchasveces despueacutes de hacer operaciones en R obtendremos como resultados nuevos vectores (y maacutesadelante en el curso otro tipo de objetos) Lo natural entonces es aprender a guardar ese vectoren un fichero de tipo csv como el fichero con el que empezamos De esa forma por ejemplo puedescompartir tus resultados con otras personas que utilicen programas distintos de R Para ello siantes usaacutebamos la funcioacuten readtable ahora vamos a usar la funcioacuten writetable de R

Como ejemplo vamos a utilizar este vector de nuacutemeros enteros

29 17 63 31 55 9 92 61 10 16 63 6 61 59 66 41 68 6 99 21 87 68 52 83 66 98 45 5024 100 83 37 44 4 97 67 56 74 75 71 55 22 86 22 93 65 38 84 54 83 100 71 99 1963 11 11 62 91 20 79 42 59 95 70 74 8 25 45 58 57 75 81 34 70 68 39 12 14 21

Ejercicio 5Usa copiar y pegar a partir de este documento pdf para crear un vector de R llamado muestraque contenga esos datos

Para guardar ese vector muestra en un fichero csv (dentro de la subcarpeta datos del directoriode trabajo) podemos utilizar la funcioacuten writetable usando como argumentos

El nombre del vector que queremos guardar que es muestra

Y el nombre del fichero en el que lo guardamos Vamos llamarlo por ejemplo Tut02-muestracsvLe indicamos a R ademaacutes que lo ponga en la subcarpeta datos

La opcioacuten colnames = FALSE o colnames = TRUE para decidir si queremos que R incluyauna liacutenea de cabecera con el nombre de la variable que en este caso es muestra (y que novamos a incluir)

La opcioacuten rownames = FALSE para evitar que R incluya nuacutemeros de fila en el fichero desalida (normalmente no querremos esos nuacutemeros)

Es decir que ejecutamos

writetable(muestrafile = datosTut02-muestracsv colnames=FALSE rownames=FALSE)

Al ejecutar esa orden el fichero que obtenemos tiene la forma deseada (de nuevo soacutelo es visible elcomienzo del fichero)

17

Puedes probar a abrirlo en Calc para ver que es un fichero de datos como los que hemos visto hastaahora

Naturalmente apenas hemos rozado el tema de la entradasalida de datos en R Pero con lo quehemos aprendido en este apartado estamos listos para empezar a hacer Estadiacutestica Descriptivausando ejemplos que no sean demasiado triviales

4 Estadiacutestica descriptiva de una variable cuantitativa condatos no agrupados

Para seguir adelante tenemos que empezar por aprender un poco maacutes sobre la forma en la que Rpermite operar con los vectores Vamos a hacerlo a traveacutes de una serie de ejercicios-ejemplos

Ejercicio 6

1 Vamos a definir dos vectores cada uno de ellos con 12 nuacutemeros enteros El primero al quellamaremos vector1 estaacute formado por

8 5 19 9 17 2 28 18 3 4 19 1

Usa copiar y pegar a partir de este fichero pdf para definir el vector1 en R

2 El segundo vector al que en un rapto de originalidad llamaremos vector2 estaacute almacenadoen el fichero

Guaacuterdalo en datos y examiacutenalo primero con un editor de texto (como el Bloc de Notas)para ver coacutemo estaacuten almacenados los datos en ese fichero Una vez hecho esto usa Calc yla funcioacuten readtable para almacenar el contenido de ese fichero csv en el vector2 de REn alguacuten momento del proceso puede que tengas que usar el pegado especial de Calc paratrasponer los datos

Solucioacuten en la paacutegina 47

41 Aritmeacutetica vectorial en RAhora vamos a sumar los dos vectores Ejecuta el comando

vector1 + vector2

para comprobar que el resultado es la suma componente a componente de los dos vectores

gt vector1 + vector2[1] 26 23 39 21 37 3 58 24 29 24 34 26

Este resultado es bastante previsible Lo que quizaacute resulteacute un poco maacutes inesperado es que simultiplicas los dos vectores tambieacuten se obtienen los productos componente a componente el primerelemento de vector1 se multiplica por el primero de vector2 el segundo por el segundo etc

gt vector1 vector2[1] 144 90 380 108 340 2 840 108 78 80 285 25

Esta forma de operar de R como veremos pronto es muy uacutetil Si lo piensas un momento cadavector numeacuterico de R se corresponde con una columna de una hoja de caacutelculo como las queusaacutebamos en el Tutorial01 Alliacute vimos que para algunas operaciones era necesario multiplicar doscolumnas elemento a elemento En Calc esa operacioacuten no es complicada pero en R es auacuten maacutes faacutecilBasta con un comando como vector1 vector2 para conseguir el objetivo Veremos muchos maacutesejemplos a lo largo del curso en los que una operacioacuten que en Calc requeririacutea bastantes pasosen R se reduce a ejecutar un uacutenico comandoEn R las operaciones con vectores siguen en general este esquema de funcionamiento componentea componente Si por ejemplo ejecutas

18

1818201220130626201525

gt vector1 + 5[1] 13 10 24 14 22 7 33 23 8 9 24 6gt 2 vector1[1] 16 10 38 18 34 4 56 36 6 8 38 2

veraacutes que en el primer caso cada uno de los elementos de vector1 se ha incrementado en 5mientras que en el segundo caso cada uno se ha multiplicado por 2 Sucede lo mismo con otrasoperaciones como elevar al cuadrado

gt vector1^2[1] 64 25 361 81 289 4 784 324 9 16 361 1

Y podemos aplicar funciones en un solo paso Por ejemplo podemos calcular el logaritmo neperianode todos los elementos de un vector en un soacutelo paso

gt log(vector1)[1] 20794415 16094379 29444390 21972246 28332133 06931472[7] 33322045 28903718 10986123 13862944 29444390 00000000

Los resultados de todas estas operaciones son de nuevo vectores Y por tanto se pueden asignara nuevas variables para utilizarlos en nuestras operaciones Por ejemplo si luego vas a necesitar loslogaritmos de vector1 puedes definir una variable para identificar ese vector llamada logVector1(e el nombre que tuacute quieras) haciendo

gt logVector1 = log(vector1)

Recuerda que si ademaacutes de la asignacioacuten quieres ver el resultado puedes rodear toda esta senten-cia con pareacutentesis De lo contrario R la ejecuta pero no imprime ninguna respuesta como ya sabes

Aunque al principio puede parecer complicado cuando te acostumbres a esta forma de trabajarcon vectores veraacutes que resulta muy coacutemoda y eficiente

Generando vectores de nuacutemeros enteros consecutivos

Hay muchas ocasiones en que para alguna operacioacuten necesitamos un vector que contenga losnuacutemeros enteros consecutivos del 1 al n o del 0 al n etc En R esto es muy faacutecil de hacer Porejemplo para conseguir un vector con los nuacutemeros del 1 al 15 basta con ejecutar

gt 115[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Esa notacioacuten con los dos puntos permite generar vectores en los que cada elemento es igual alanterior maacutes 1 Otro ejemplo

gt -713[1] -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13

O incluso cuando los puntos de partida no son enteros

gt 1575[1] 15 25 35 45 55 65 75gt 1574[1] 15 25 35 45 55 65

iquestVes la diferencia entre estos dos casos

Es muy posible que te esteacutes preguntando iquesty si quiero ir avanzando de 2 en 2 o quiero ir hacia atraacutes(ldquoavanzandordquo de minus2 en minus2 por ejemplo) Pronto cuando hayamos aprendido un poco maacutes volve-remos sobre esto y comprobaremos que R nos ofrece un cataacutelogo de herramientas extremadamentepotentes para fabricar vectores de acuerdo con nuestros deseos y necesidadesLos vectores fabricados con este meacutetodo son vectores iguales que los demaacutes y se pueden asignar avariables operar con ellos etc

19

Ejercicio 7

1 Fabrica un vector con los cuadrados de los nuacutemeros del 1 al 10 y asiacutegnalo a la variablecuadrados Usa los pareacutentesis para ver el resultado de la asignacioacuten

2 Haz lo mismo con los cuadrados de los nuacutemeros del 2 al 11 y un vector cuadrados2

3 Resta los vectores cuadrados2 - cuadrados iquestObservas algo interesante

Solucioacuten en la paacutegina 47

Funciones vectoriales

Hemos visto antes que se puede aplicar una funcioacuten como la raiacutez cuadrada a un vector y seobtiene como resultado otro vector con las raiacuteces cuadradas elemento a elemento Pero hay otrotipo de funciones que permiten hacer caacutelculos con el vector en conjunto Por ejemplo antes hemosfabricado el vector -713 y la funcioacuten length nos dice cuantos elementos tiene ese vector

gt length(-713)[1] 21

En el Ejercicio 3 (paacuteg 13) nos preguntaacutebamos cuantos elementos teniacutea el vector vectorEdades quehabiacuteamos cargado desde el fichero csv Puedes obtener la respuesta con length(vectorEdades)Para comprobarlo aseguacuterate de que has creado el vector llamado vectorEdades y ejecuta estaorden

gt length(vectorEdades)[1] 100

Como ves el resultado de length es el esperado

Vamos a conocer otra funcioacuten llamada sum que sirve para calcular la suma de todos los elementosde un vector

gt sum(vectorEdades)[1] 675

Ejercicio 8iquestCuaacutento vale la suma de los cuadrados de los nuacutemeros del 1 al 100 Solucioacuten en la paacutegina 47

A lo mejor te ha pasado desapercibido pero con las funciones length y sum estamos por fin encondiciones de empezar a hacer Estadiacutestica Descriptiva Por ejemplo podemos calcular la mediaaritmeacutetica de vectorEdades

gt ( mediaEdades = sum(vectorEdades) length(vectorEdades) )[1] 675

Y una vez que tenemos la media podemos calcular la varianza poblacional Para que resulte maacutesclaro vamos a mostrarte el proceso paso a paso aunque al final lo ejecutaremos en un soacutelo paso

1 Empezamos restando la media que estaacute en la variable mediaEdades de cada uno de loselementos de vectorEdades

vectorEdades - mediaEdades

El resultado es un vector de diferencias

2 Ahora elevamos cada una de esas diferencias al cuadrado

( vectorEdades - mediaEdades )^2

El resultado de este paso es de nuevo un vector ahora con las diferencias al cuadrado Fiacutejateen el pareacutentesis para garantizar que elevamos al cuadrado la diferencia Si no incluyeacuteramosel pareacutentesis iquestqueacute calculariacuteamos

20

3 A continuacioacuten sumamos todas esas diferencias al cuadrado usando la funcioacuten sum

sum( ( vectorEdades - mediaEdades )^2)

De nuevo el pareacutentesis es fundamental para que el cuadrado del vector de diferencias secalcule antes que la suma En este paso el resultado ya no es un vector sino un nuacutemero

4 Por uacuteltimo dividimos esa suma por n el nuacutemero de elementos de vectorEdades que seobtiene con la funcioacuten length

sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades)

El resultado de estos pasos se puede condensar en un soacutelo comando de R en el que a la vezcalculamos la varianza y la asignamos a una variable

gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades) )[1] 19875

Ejercicio 9

1 Calcula la desviacioacuten tiacutepica (poblacional) de vectorEdades

2 Calcula la cuasivarianza y cuasidesviacioacuten tiacutepica (muestrales) de vectorEdades

3 iquestQueacute sucede si en el tercer paso ejecutas el siguiente comandosum( vectorEdades - mediaEdades )^2iquestPor queacute sucede esto

Solucioacuten en la paacutegina 48

Con estos caacutelculos hemos empezado a hacer Estadiacutestica con R Naturalmente nos queda muchiacutesimoque aprender sobre los vectores de R Por ejemplo como se accede a una componente individualdel vector para responder a preguntas como ldquoiquestCuaacutento vale el quinto elemento del vectorrdquo Maacutesen general aprenderemos a extraer aquellos elementos del vector que cumplan alguna condicioacutenrespondiendo a preguntas como ldquoiquestQueacute elementos del vector son mayores que 7rdquo

42 Y por fin hagamos Estadiacutestica DescriptivaEn esta seccioacuten vamos a trabajar con un vector de datos contenido en este fichero adjunto

Este vector contiene los datos de la variable var3 del fichero Tut01-PracticaConCalccsv queya hemos utilizado en el Tutorial-00 para aprender a hacer Estadiacutestica Descriptiva con Calc Enesta seccioacuten vamos a reproducir los resultados que obtuvimos alliacute pero esta vez usando R Parapreparar el terreno vamos a hacer limpieza

Ejercicio 10

1 Cierra Rstudio y vuelve a abrirlo para limpiar la memora del sistema El trabajo que hemoshecho hasta ahora se perderaacute (aunque los comandos siguen en el Historial de Comandos queya vimos)

2 Establece el Directorio de Trabajo (por ejemplo el Escritorio) y aseguacuterate de que Tut02-var3csvestaacute guardado en la subcarpeta datos de ese directorio

3 Carga de nuevo el contenido de ese fichero en un vector var3 de R

Solucioacuten en la paacutegina 48

Veraacutes en lo que sigue que siempre que calculamos un objeto le asignamos una variable Eso permiteahorrarse la repeticioacuten innecesaria de caacutelculos si maacutes adelante volvemos a necesitar ese objeto Yen algunos casos como veremos maacutes adelante al hacer esto podemos acceder a propiedades delobjeto calculado que R no muestra en su respuesta por defecto

21

4 138 134 134 135 135 133 136 136 132 134 134 133 133 133 132 136 134 135 132 135 136 135 132 136 134 135 133 134 134 134 1310 136 138 134 135 137 133 135 138 136 137 135 134 137 135 136 138 137 134 133 135 135 134 131 135 137 133 133 137 136 135 135 132 138 135 135 135 136 135 133 1311 136 1310 134 131 133 138 139 135 134 1310 134 134 137 135 134 133 132 135 132 136 135 134 133 139 136 135 134 135 132 132 138 134 133 136 138 134 134 134 138 134 132 135 1310 136 1312 135 139 135 138 138 135 132 135 1310 136 135 136 135 135 137 134 133 134 133 133 134 133 133 133 133 137 138 135 134 135 134 135 137 135 133 134 134 137 133 132 135 137 135 134 136 132 135 132 136 1310 134 132 139 134 136 136 132 137 134 138 135 135 134 134 137 134 136 136 135 134 133 135 133 133 136 132 133 134 138 138 137 137 136 135 1310 134 134 134 138 136 134 136 137 135 135 136 138 134 138 134 135 137 136 134 137 137 135 137 132 136 135 133 135 136 130 133 135 135 137 134 137 131 135 136 135 138 132 134 136 139 137 1310 134 135 136 132 135 135 135 1313 133 136 133 136 135 130 1310 134 136 136 134 131 133 135 137 136 133 135 133 134 132 132 138 138 134 136 135 135 134 133 139 134 139 136 1311 133 132 132 136 138 1310 133 137 133 134 135 139 133 135 133 134 138 139 132 138 133 133 137 138 136 133 135 134 132 1311 137 137 136 134 133 135 1310 135 134 135 133 135 136 135 139 135 134 135 135 134 133 137 134 1310 135 134 132 139 134 137 133 135 134 131 136 135 136 134 138 135 135 138 138 134 132 135 133 134 138 138 135 138 132 1311 135 134 134 136 139 1310 137 134 137 132 133 135 1310 135 135 133 135 136 134 134 136 135 137 136 136 134 133 134 135 132 134 136 139 133 135 133 136 133 133 135 134 134 134 137 135 139 1310 133 134 136 131 137 138 135 133 133 135 133 133 137 136 135 135 138 134 139 136 135 135 138 134 130 133 137 133 134 1311 132 137 133 136 135 133 134 133 133 132 138 133 134 134 134 134 138 138 137 136 132 132 137 135 133 135 138 135 134 135 134 135 134 1312 133 135 133 133 133 132 134 131 139 135 135 135 138 138 135 138 133 134 133 136 136 135 134 133 133 135 133 137 135 132 133 133 132 131 132 136 137 130 136 133 134 1310 132 136 137 134 133 132 138 133 135 133 135 136 132 134 134 133 135 135 135 134 134 136 133 132 138 1310 135 135 132 132 137 136 134 135 134 134 136 134 136 135 133 137 137 136 137 134 134 137 133 130 134 136 135 137 136 136 135 137 134 134 135 136 136 135 136 132 134 133 139 135 133 137 135 136 137 136 136 136 134 135 137 137 133 134 137 137 136 133 134 137 131 135 136 133 137 133 135 133 137 138 133 137 132 135 134 133 132 135 134 134 135 133 134 139 135 134 139 137 133 132 133 134 133 134 135 135 138 134 135 134 135 139 137 133 133 132 136 132 138 135 132 137 134 135 136 132 134 135 135 133 135 136 137 135 138 132 131 137 135 135 138 134 137 136 139 1310 137 134 131 136 132 136 137 133 135 137 135 132 135 135 133 133 137 134 133 133 131 138 139 132 134 138 135 136 138 137 1310 138 133 134 134 135 134 134 135 136 135 134 134 135 133 136 135 137 132 133 139 132 133 137 136 134 137 131 135 134 132 134 138 135 134 131 132 134 135 136 133 134 138 134 132 135 134 132 134 133 136 135 138 133 139 1310 134 133 133 137 137 136 137 133 133 133 135 139 136 136 137 136 135 132 132 139 136 132 139 132 137 135 133 138 137 135 134 136 131 133 135 133 134 137 135 134 132 136 136 136 137 133 132 135 134 135 134 137 134 133 133 134 132 134 135 134 134 136 134 135 138 133 135 135 138 133 135 134 135 135 138 1311 132 134 134 136 133 135 133 136 132 131 136 134 136 132 136 136 136 136 130 136 134 134 131 138 131 1310 135 139 136 132 136 138 135 138 134 132 134 133 136 137 133 133 133 133 137 136 135 133 139 133 132 135 136 136 134 132 132 135 137 136 136 136 138 137 137 135 135 131 136 133 136 135 133 134 130 133 135 136 137 138 136 134 135 132 137 132 137 132 133 134 135 138 134 136 133 135 135 139 134 134 136 134 134 134 135 134 133 135 135 138 133 136 136 134 135 134 134 138 136 133 137 132 134 137 136 135 133 134 133 135 134 134 136 134 133 137 133 135 135 136 135 138 134 136 132 137 136 138 134 136 136 137 136 136 135 136 1310 138 133 137 135 136 137 134 136 133 134 133 132 132 134 137 132 132 133 132 138 134 134 135 135 139 135 134 132 134 135 134 139 137 133 134 134 135 133 133 137 138 135 139 133 138 136 136 134 133 136 135 1314 137 133 137 135 136 134 134 136 133 135 134 135 136 136 135 133 135 131 135 137 135 136 133 137 135 134 133 134 134 134 134 134 136 132 134 136 136 137 139 134 138 133 133 132 135 131 134 133 137 133 133 134 139 138 134 134 137 137 135 136 134 139 137 138 134 133 134 134 135 137 134 135 138 133 132 134 1310 133 135 134 132 138 137 136 135 138 1314 139 135 135 131 134 135 134 135 135 135 133 136 135 135 132 136 139 133 133 136 134 132 132 137 136 131 137 135 135 134 1313 1310 132 134 134 133 138 135 134 133 136 136 136 1310 134 137 136 138 139 137 135 134 134 137 137 138 133 134 135 137 135 136 1310 136 136 138 133 136 133 134 135 135 134 136 133 136 136 137 134 135 1316 136 136 132 136 136 133 134 133 137 134 135 134 133 138 134 1310 136 136 136 137 134 136 137 132 138 136 131 132 134 135 130 134 135 135 137 130 136 135 131 136 137 133 137 135 139 138 135 139 133 137 139 133 136 137 136 138 134 1310 136 134 133 139 136 137 133 13713

Rango maacuteximo y miacutenimo

Para empezar vamos a aprender tres nuevas funciones de R que nos permiten calcular esos tresvalores

gt (minimo = min(var3) )[1] 0gt (maximo = max(var3) )[1] 16gt (rango = range(var3) )[1] 0 16

El funcionamiento de las dos primeras es evidente La funcioacuten range devuelve un vector formadopor el maacuteximo y el miacutenimo

Tablas de frecuencia Clases de objetos en R

La tabla de frecuencia absoluta de var3 se obtiene usando la funcioacuten table de esta forma tansencilla

gt ( tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

La primera fila contiene los elementos de var3 y en la segunda aparece la frecuencia de cada unode ellos Puedes comprobar que son los mismos resultados que obtuvimos con Calc en la paacutegina10 del Tutorial01 Aunque alliacute desde luego el proceso fue maacutes laborioso

A lo mejor te has dado cuenta de que el formato de la respuesta es diferente de los que hemosobtenido hasta ahora Para empezar la respuesta no empieza con el [1] al que ya nos vamosacostumbrando El motivo de esto es que el objeto que hemos obtenido como respuesta no es unvector sino una tabla Ya dijimos que R utiliza distintos tipos de objetos con fines distintosiquestCoacutemo podemos saber de queacute clase es un objeto Pues usando una funcioacuten de R oportunamentellamada class Si la usamos con el vector var3 y con su tabla de frecuencias obtenemos

gt class(var3)[1] numericgt class(tablaFrecAbs)[1] table

El vector var3 es de clase numeric porque es un vector de nuacutemeros Y la tabla de frecuencias esde clase table Veremos a lo largo del curso otros objetos de tipo tabular como las matrices (clasematrix) los conjuntos de datos (clase dataframe) y los arraysAunque las tablas son objetos distintos de los vectores tienen algunas propiedades en comuacuten yalgunas de las funciones que hemos usado con vectores tambieacuten se pueden usar con tablas

Ejercicio 11Aplica las funciones length sum min max y range a la tabla tablaFrecAbs Solucioacuten en la paacutegina48

Siguiendo con los parecidos entre tablas y vectores puedes multiplicar (o dividir) una tabla porun nuacutemero y la operacioacuten se haraacute elemento a elemento

gt 2 tablaFrecAbsvar30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1618 50 200 376 488 492 372 262 174 86 56 12 4 4 4 2

Como ves cada frecuencia se multiplica por 2 Esta propiedad de las tablas permite obtener deforma muy sencilla la tabla de frecuencias relativa de var3 Como primer paso vamos a guardarla longitud de var3 en la variable n

22

gt ( n = length( var3 ) )[1] 1300

Y ahora podemos dividir la tabla por n para conseguir la tabla de frecuencias relativas (hemosestrechado la Consola de Comandos para que el resultado cupiera en esta paacutegina)

gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 400069230769 00192307692 00769230769 01446153846 01876923077

5 6 7 8 901892307692 01430769231 01007692308 00669230769 00330769231

10 11 12 13 1400215384615 00046153846 00015384615 00015384615 00015384615

1600007692308

Ejercicio 12Ya sabemos cuanto debe sumar esta tabla de frecuencias relativas Comprueacutebalo Solucioacuten en lapaacutegina 48

Si lo que queremos es una tabla de frecuencias acumuladas debemos emplear la funcioacuten cumsum

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Ejercicio 13La uacuteltima tabla que falta es la de frecuencias relativas acumuladas pero ya tienes todos los ingre-dientes para obtenerla de dos maneras diferentes Hazlo y comprueba si dan el mismo resultadoSi no es asiacute iquesta queacute crees que se debe y cuaacutel es la mejor opcioacuten Asigna el resultado a la variabletablaFrecRelAcu Solucioacuten en la paacutegina 49

Graacuteficos de columnas y diagramas de caja (boxplot) Argumentos con nombre

Vamos a fabricar nuestros primeros graacuteficos con R En concreto vamos a dibujar un graacutefico debarras a partir de la tabla de frecuencias de var3 usando la funcioacuten barplot de R

gt barplot(tablaFrecAbs)

Al ejecutar este comando no debes ver ninguna salida en la Consola de Comandos En su lugaren el panel inferior derecho de RStudio concretamente en la ventana Plots apareceraacute el graacuteficodeseado El resultado puede variar dependiendo de la anchura de tu ventana de RStudio

23

Hemos destacado ademaacutes en la figura los dos botones Zoom y Export que te permiten respecti-vamente ver una versioacuten ampliada de la Figura (que se redimensiona dinaacutemicamente si cambiasla ventana) y guardar esa figura como un fichero de graacuteficos que puedes insertar en cualquierdocumento editar con un programa de manipulacioacuten de graacuteficos etceacuteteraLos graacuteficos de R se pueden controlar hasta en sus detalles maacutes miacutenimos Como aperitivo miacutenimovamos a antildeadir algo de color al graacutefico

gt barplot(tablaFrecAbs col = heatcolors(15))

El resultado es esta figura

Las posibilidades de control de los graacuteficos de R son como decimos inmensas y pueden llegar aser abrumadoras Hay libros de cientos de paacuteginas dedicados a este tema como el R GraphicsCookbook de W Chang (ver las referencias del curso) Nosotros a lo largo de los tutoriales delcurso vamos a aprender algo maacutes aunque a penas nos podremos limitar a rozar la superficie delo que se puede llegar a hacerEn la Seccioacuten 231 del libro hemos descrito los diagramas de cajas o boxplots (recuerda la Figura22 de la paacuteg 36 del libro) Y en el Tutorial-01 dijimos que con Calc no es faacutecil dibujar ese tipode diagramas En cambio con R no podriacutea ser maacutes faacutecil

gt boxplot(var3)

Y el resultado es esta figura

24

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

Como ves la ventana aparece dividida en tres grandes regiones o paneles que hemos rotulado enrojo en la figura

A la izquierda la Consola de Comandos de R en la que vamos a empezar nuestro trabajo

En la parte superior derecha el panel con las pestantildeas de Historial (History)y Espacio detrabajo (Workspace) (en versiones recientes de RStudio en lugar del Espacio de Trabajo semuestra el Entorno (Environment) no te preocupes por esto de momento)

En la parte inferior derecha el panel con pestantildeas para Ficheros (Files) Graacuteficos (Plots)Libreriacuteas (Packages) y Ayuda (Help) Las versiones recientes incluyen panel Visor (Viewer)

En este y proacuteximos tutoriales y con la praacutectica iremos conociendo la finalidad de cada una deesas regiones Vamos a comenzar con la Consola de Comandos En ella aparecen en primer lugaruna serie de mensajes con informacioacuten sobre la versioacuten de R que estamos ejecutando (la 300 enesa figura aunque seguramente tuacute habraacutes instalado una versioacuten superior) Y bajo estos mensajesaparece el prompt de R que es el siacutembolo gt junto al que parpadea el cursor

Ese siacutembolo y el cursor parpadeando nos indican que ese es el prompt activo y que R estaacute esperandouna orden En esta primera seccioacuten vamos a aprender a usar R (a traveacutes de RStudio) como unacalculadora El objetivo principal es que empecemos a familiarizarnos con la sintaxis de R y conlas peculiaridades de la interfaz de RStudioEmpecemos el juego Vamos a calcular 32 Aseguacuterate de que estaacutes situado en la liacutenea del promptde R Si es necesario haz clic con el ratoacuten junto al siacutembolo gt y despueacutes teclea

3^2

El siacutembolo ^ es un acento circunflejo el siacutembolo and normalmente situado junto a la P de un tecladoespantildeol estaacutendar en Windows y en los Mac situado junto a la tecla fn Al pulsar Entrar apareceraacuteuna liacutenea como esta

[1] 9

y justo debajo aparece un nuevo prompt que ahora pasa a ser el prompt activo

El uno entre corchetes es la forma en la que R nos indica que esta es la primera liacutenea de su res-puesta En este caso la respuesta cabe holgadamente en una liacutenea pero pronto veremos casos enlos que no es asiacute El nuacutemero 9 naturalmente es el valor 32 que hemos calculado Como ves en Rse usa ^ para los exponentes igual que en Calc

2

Las operaciones aritmeacuteticas elementales se representan asiacute en R (como en muchos otros programas)

suma +

resta -

producto

cociente

potencia ^

La raiacutez cuadrada es una funcioacuten en R la primera que vamos a discutir Se representa con sqrt(del ingleacutes square root) Es como en Calc pero recuerda que en R la diferencia entre mayuacutesculasy minuacutesculas es siempre esencial Sqrt o SQRT no funcionaraacuten Se usa poniendo el argumentoentre pareacutentesis Por ejemplo si tecleas sqrt(9) en el siguiente prompt activo y lo ejecutas (pulsaEntrar) obtendraacutes el resultado previsible

Un aviso aunque hasta aquiacute te hemos mostrado el resultado mediante figuras con capturas depantalla vamos a empezar a usar cada vez maacutes descripciones textuales como esta

gt sqrt(9)[1] 3

Soacutelo recurriremos a las capturas de pantalla en los casos en los que nos interesa destacar visualmentealguacuten aspecto de la interfaz graacutefica del programa La ventaja (aparte de ahorrar espacio en eltutorial claro) es que estas descripciones textuales te permitiraacuten seleccionar el texto en la versioacutenen pdf del tutorial para usar copiar y pegar con RStudio Ya iraacutes viendo que esa forma de trabajaraunque a veces tiene alguacuten problema a la larga te resulta coacutemoda Pero a la vez que te decimosesto te recomendamos que especialmente al principio practiques tecleando tuacute mismo muchos delos comandos para acostumbrarte a la interfaz y para ayudarte a recordarlos mas eficazmente Enlas descripciones textuales a menudo te mostraremos juntos prompt comandos y salida en otroscasos nos limitaremos al comando R Recuerda si usas copiar y pegar que el prompt gt no formaparte del comandoNaturalmente ademaacutes de sqrt en R hay muchas otras funciones relacionadas con la Estadiacutesticaque iremos encontrando en el resto del curso Para practicar un poco maacutes este uso de R comocalculadora y la teacutecnica de copiar y pegar ademaacutes de introducir un par de ideas nuevas vamos aproponerte el primer ejercicio de este tutorial

3

Ejercicio 1En este ejercicio vamos a utilizar las liacuteneas de coacutedigo que aparecen a continuacioacuten Copia o tecleacada liacutenea en el prompt (iexclpractica las dos maneras) una por una y ejecuacutetalas pulsando Entrartras copiar o teclear cada liacutenea Trata de adivinar el resultado de cada operacioacuten antes de ejecutarel coacutedigo

2+315-74613513513513+15sqrt(25)sqrt(26)sin(pi)sin(314)

Los resultados de este ejercicio aparecen en la Tabla 1 (paacuteg 5) iexclNo los mires sin haberlo intentadoEsos resultados se merecen algunos comentarios

Seguramente las liacuteneas que menos previsibles te han resultado son las que contienen losoperadores y Estos operadores representan respectivamente el cociente y el resto dela divisioacuten entera

Lo maacutes importante que tienes que observar en los resultados es que R trabaja siempre conla representacioacuten mediante decimales de los nuacutemeros Esto es evidente por ejemplo en larespuesta a la instruccioacuten

13+15

que representa la operacioacuten1

3+

1

5

pero cuyo resultado en R es 05333333 y no 815 El valor decimal es una aproximacioacuten ala fraccioacuten pero no es un resultado exacto (la fraccioacuten siacute es exacta) Por lo tanto cuandohagamos operaciones con R tenemos que tener cuidado con la posible peacuterdida de precisioacutenque llevan siempre aparejadas las operaciones con decimales Teacutecnicamente esto significaque R es un programa (esencialmente) numeacuterico Maacutes adelante en el curso veremos alguacutenprograma simboacutelico y discutiremos la diferencia entre ambos

Fiacutejate en que como hemos dicho R ha interpretado el siacutembolo

13+15

como la operacioacuten1

3+

1

5

en lugar de darle otras interpretaciones posibles como por ejemplo

1(3 + 1

5

) Para hacer esa interpretacioacuten R ha aplicado una serie de reglas de lo que se conoce comoprioridad de operadores y que dicen en que orden se realizan las operaciones seguacuten el tipode operador No queremos entretenernos con esto ahora asiacute que baste con decir que encaso de duda siempre puedes (y a menudo debes) usar pareacutentesis para despejar la posibleambiguumledad

4

gt 3^2[1] 9gt sqrt(9)[1] 3gt 2+3[1] 5gt 15-7[1] 8gt 46[1] 24gt 135[1] 26gt 135[1] 2gt 135[1] 3gt 13+15[1] 05333333gt sqrt(25)[1] 5gt sqrt(26)[1] 509902gt sin(pi)[1] 1224606e-16gt sin(314)[1] 0001592653

Tabla 1 Resultados del Ejercicio 1

Por ejemplo para distinguir entre las dos interpretaciones que hemos dado puedes escribir

(13)+(15)

o por el contrario

1 ( (3+1)5 )

Un uso prudente de pareacutentesis y espacios en las operaciones es una marca caracteriacutestica delbuen hacer cuando se escribe coacutedigo en un ordenador Si alguna vez esto llega a ser unproblema para ti habraacute llegado el momento de aprender algo maacutes sobre esa prioridad deoperadores

La funcioacuten sin es la funcioacuten seno de la Trigonometriacutea Ademaacutes R utiliza el siacutembolo pi parareferirse a la constante matemaacutetica π asymp 3141593 Y el caraacutecter numeacuterico de R se refleja denuevo en el hecho de que al ejecutar sin(pi) no has obtenido 0 (que es la respuesta exacta)sino

gt sin(pi)[1] 1224606e-16

La notacioacuten que se usa en la respuesta es la forma tiacutepica de traducir la notacioacuten cientiacutefica alos lenguajes de ordenador y calculadoras El siacutembolo 1224606e-16 representa el nuacutemero

1224606 middot 10minus16

de manera que el nuacutemero -16 que sigue a la letra e en esta representacioacuten es el exponentede 10 (tambieacuten llamado orden de magnitud) mientras que el nuacutemero 1224606 se denominaa veces mantisa Puedes leer maacutes sobre la notacioacuten cientiacutefica en este artiacuteculo de la Wikipedia

5

httpeswikipediaorgwikiNotacioacuten_cientiacutefica

En cualquier caso el exponente -16 nos indica que se trata de un nuacutemero extremadamentecercano a 0 Fiacutejate en cambio que si usas 314 como aproximacioacuten de π la respuesta aunquepequentildea es todaviacutea del orden de mileacutesimas

11 Algunos detalles de la interfaz de RStudioAntes de avanzar maacutes queremos ocuparnos de algunos aspectos del trabajo con RStudio que amenudo causan algunos quebraderos de cabeza a quienes se inician en el uso del programa

Comandos incompletos

Para ver un ejemplo prueba a escribir en el prompt activo esta operacioacuten evidentemente incom-pleta

3

y pulsa Entrar La respuesta de R es un siacutembolo +

gt 3+

que en este caso no tiene nada que ver con la suma Es la forma que tiene R de decirnos ldquonecesitoalgo maacutesrdquo Cuando R se encuentra con una expresioacuten que considera no erroacutenea sino incompleta(por ejemplo con un pareacutentesis abierto al que corresponde un pareacutentesis cerrado) entonces nos locomunica con este siacutembolo + Y al hacerlo nos da la oportunidad en casos como este de corregirel error completando la expresioacuten incompleta Asiacute que si ahora junto al siacutembolo + escribes 2 deesta forma

gt 3+ 2

y pulsas Entrar veraacutes que R ha entendido la expresioacuten completa 32 y nso devuelve la respuesta

gt 3+ 2[1] 6

En alguacuten momento no obstante ese siacutembolo + de los comandos incompletos se convertiraacute en uninconveniente Imagiacutenate por ejemplo que queriacuteas multiplicar 5 middot7 pero que por error has tecleadola expresioacuten

57-

y has pulsado Entrar antes de darte cuenta del error En tal caso R piensa que esa expresioacuten estaacuteincompleta y vuelve a aparecer el signo +

gt 57-+

iexclPero ahora no queremos antildeadir nada En este caso podriacuteas antildeadir un 0 sin que eso afectara elresultado pero habraacute maacutes adelante muchos casos en los que no hay una solucioacuten sencilla evidenteiquestCoacutemo salimos del paso Simplemente pulsamos la tecla Esc (escape) con lo que R interrumpe elcomando y nos devuelve a un nuevo prompt activo sin calcular nada

Navegando el historial de comandos

En un caso como el que hemos descrito no supone un problema volver a teclear la expresioacutenevitando el error que habiacuteamos cometido Pero en ocasiones si hemos escrito una expresioacuten real-mente complicada y por ejemplo hemos tecleado un pareacutentesis de maacutes en medio de la expresioacutenseguramente prefeririacuteamos no tener que volver a teclear la expresioacuten completa Un remedio ldquocaserordquoconsiste en seleccionar y copiar la expresioacuten erroacutenea pegarla en el prompt activo y editarla ahiacutepara corregir el errorHay una segunda manera de conseguir el mismo efecto Otra caracteriacutestica interesante de la Consolade Comandos es que si te situacuteas en el prompt activo y pulsas las teclas con flechas arriba o abajoveraacutes pasar la lista completa de comandos que has ejecutado desde el principio de la sesioacuten detrabajo Prueba a hacerlo ahora para ver como funciona Si has ejecutado todos los comandosque hemos ido describiendo en este tutorial puedes pulsar la flecha uarr repetidamente e iraacutes viendopasar todos esos comandos hasta llegar al

6

3^2

con el que hemos empezado Y con la flecha hacia abajo recorres la lista en sentido contrario hastael comando de ejecucioacuten maacutes reciente Esa lista de comandos es el Historial de Comandos Usandolas flechas arriba y abajo puedes recorrer el Historial de Comandos detenerte en cualquier puntomodificar ese comando si lo deseas y despueacutes ejecutarlo (con o sin modificaciones) Al principiopuede que te cueste un poco acostumbrarte pero una vez que te habituacutees a esta herramientala encontraraacutes sin duda muy uacutetil El Historial de Comandos que puedes recorrer con las flechasarriba y abajo se limita a la sesioacuten de trabajo actual Pero si miras en el panel superior derecho deRStudio veraacutes una pestantildea titulada History que se muestra en esta figura

El Historial de Comandos que aparece en ese panel refleja tus comandos de esta y anterioressesiones Si esta es tu primera sesioacuten de trabajo con R ambos coincidiraacuten claro estaacute Pero a medidaque vayas abriendo RStudio en diacuteas sucesivos te puede resultar muy uacutetil localizar por ejemploun comando que usaste hace dos sesiones pero que no recuerdas exactamente Los comandos queaparecen en ese panel se pueden copiar y pegar en la Consola de Comandos o de forma maacutes directapuedes seleccionar uno de ellos con el ratoacuten y pulsar en el botoacuten To Console que hemos destacadoen la Figura

111 Errores

Los errores son inevitables y nos conviene estar preparados para su aparicioacuten Dependiendo delmotivo del error R nos informaraacute con distintos tipos de mensajes Asiacute que vamos a ver algunosejemplos para conocer la terminologiacutea asociadaPara empezar este es el mensaje de error que obtenemos tras ejecutar una expresioacuten sin sentido

gt 43Error unexpected rsquorsquo in 4

Los mensajes de error aparecen en color rojo en RStudio Este mensaje de error en particulares bastante faacutecil de entender R simplemente se queja de que esta expresioacuten es defectuosa Noincompleta como alguna que hemos visto antes Es imposible completar esta expresioacuten de formacorrectaVeamos otro tipo de mensaje de error Ya sabes que no se puede dividir por 0 Si lo intentamos enR

gt 20[1] Inf

7

el siacutembolo Inf (de infinito) nos avisa del problema Ese siacutembolo tambieacuten puede aparecer con signomenos si por ejemplo tratas de calcular el logaritmo neperiano de 0 En R el logaritmo neperianoes la funcioacuten log asiacute que seriacutea

gt log(0)[1] -Inf

En ambos casos R no lanza un mensaje de error pero utiliza el siacutembolo de infinito porque asiacute nosproporciona maacutes informacioacuten matemaacutetica sobre lo que ha ocurrido Tambieacuten puede suceder queel siacutembolo Inf aparezca como resultado intermedio en una expresioacuten En ese caso R aplica unasreglas sencillas de aritmeacutetica con infinitos para tratar de darnos la respuesta maacutes coherente desdeel punto de vista matemaacutetico Por ejemplo si calculas

3(-5(4-2^2))

Entonces R empieza calculando el resultado del pareacutentesis 4-2ˆ2 que es 0 Asiacute que al dividir minus5entre 0 R obtiene -Inf y finalmente al calcular 3(-Inf) se obtiene -Inf como valor de laexpresioacuten Comprobeacutemoslo

gt 3(-5(4-2^2))[1] -Inf

A pesar de que R no lanza mensajes de error estaacute claro que en la mayoriacutea de los casos no esdeseable que nuestros caacutelculos produzcan Inf como resultado en ninguna etapaEn otros casos el problema es diferente Por ejemplo si tratas de calcular la raiacutez cuadrada de unnuacutemero negativo

gt sqrt(-4)[1] NaNWarning messageIn sqrt(-4) NaNs produced

En este caso obtenemos una respuesta NaN y ademaacutes una advertencia (warning) sobre la aparicioacutende esa respuesta El siacutembolo NaN es la abreviatura de Not a Number es decir ldquono es un nuacutemerordquo Estaes la respuesta que obtendremos cuando tratamos de hacer operaciones como esta que producencomo resultado un nuacutemero complejo R es capaz de trabajar con los nuacutemeros complejos pero comono los vamos a necesitar en el curso no nos ocuparemos de esto Para que veas otro ejemplo esarespuesta NaN aparece tambieacuten si tratamos de ir demasiado lejos con la aritmeacutetica con infinitos

gt (10)+log(0)[1] NaN

En este caso R se ha encontrado en un paso intermedio con Inf - Inf y su respuesta ha sido NaN

En cualquier caso y como resumen final tenemos que tratar de evitar que nuestros caacutelculos con-duzcan a este tipo de expresiones

Haciendo limpieza en la Consola de Comandos

Si has seguido todas las instrucciones hasta aquiacute tu Consola de Comandos seguramente empiezaa estar llena de comandos y algunos pueden quedar ocultos en la parte superior Naturalmentepuedes usar las barras de desplazamiento para moverte por la Consola Pero en sesiones largas detrabajo o cuando hemos terminado de hacer pruebas y queremos ejecutar una versioacuten definitivade nuestro trabajo es normal que queramos hacer limpieza en la Consola Eso se consigue con lacombinacioacuten de teclas Ctrl + L iexclCuidado Es un proceso no reversible podraacutes seguir navegandoel Historial de Comandos con las teclas arriba y abajo pero para recuperar los resultados tendraacutesque ejecutar de nuevo los comandosMaacutes adelante aprenderemos formas de guardar nuestro trabajo de una manera maacutes eficiente Perote podemos adelantar que puesto R se maneja escribiendo comandos bastaraacute con guardar esoscomandos en ficheros de texto plano Ahora vamos a cambiar de tema y para empezar desde cerovamos a cerrar RStudio para eliminar las trazas del trabajo que hemos hecho

2 Variables y vectoresVuelve a abrir RStudio para continuar el trabajo En la seccioacuten previa hemos usado R como unacalculadora Pero para ir maacutes allaacute tenemos que disponer de estructuras de datos Ese teacutermino

8

describe en Computacioacuten las herramientas que nos permiten almacenar y procesar informacioacutenLas estructuras de datos maacutes baacutesicas de R son las variables y los vectores En proacuteximos tutorialesnos iremos encontrando con otras estructuras de datos matrices dataframes listas entre otras

21 Variables en RUna variable en R es un siacutembolo que usamos para referirnos a un valor Por ejemplo si te situacuteasen la Consola de Comandos tecleas

a = 2

y ejecutas esa instruccioacuten entonces aunque aparentemente no ha sucedido nada (porque no hayrespuesta) a partir de ese momento R ha asignado el valor 2 al siacutembolo a Asiacute que si por ejemplotecleas y ejecutas

a + 1

obtendraacutes como respuesta 3

Ejercicio 2iquestQueacute se obtiene al ejecutar estos comandos uno detraacutes de otro iquestCuaacutento valen las variables a by c al final

a = 2b = 3c = a + ba = b cb = (c - a)^2c = a b

La solucioacuten estaacute en la paacutegina 47 iexclNo la mires antes de intentar pensar el ejercicio por ti mismo

En el Capiacutetulo 1 del libro hemos hablado de variables cualitativas y cuantitativas Estas uacuteltimastoman siempre valores numeacutericos y las variables de R sirven desde luego para almacenar esa clasede valores Pero como iremos viendo en sucesivos tutoriales tambieacuten se pueden utilizar variablesde R para guardar valores de variables cualitativas (factores) y otros tipos de objetos que iremosconociendo a lo largo del curso De momento para que veas a que nos referimos recordaremos elEjemplo 111 del libro (paacuteg 6) en el que teniacuteamos una variable cualitativa ordenada que representael pronoacutestico de un paciente que ingresa en un hospital Prueba a ejecutar este coacutedigo

pronostico = Leve

simplemente para que de momento veas que

R no protesta El valor Leve es un valor perfectamente aceptable

En R los valores que representan palabras frases o como las llamaremos teacutecnicamente cadenasalfanumeacutericas se escriben siempre entre comillas Puedes usar comillas simples o dobles perote aconsejamos que uses dobles comillas

La relacioacuten entre factores y valores alfanumeacutericos en R es algo maacutes complicada de lo que estesencillo ejemplo parece sugerir Pero ya tendremos ocasioacuten en futuros tutoriales de extendernossobre eso

Asignaciones

Las instrucciones como

a = 2

o como

b = (c - a)^2

se denominan asignaciones En la primera por ejemplo decimos que hemos asignado el valor 2a la variable aQueremos advertir al lector de que en R hay otra forma esencialmente equivalente de escribir lasinstrucciones y que de hecho se usa mayoritariamente En lugar del siacutembolo = puedes conseguirel mismo efecto escribiendo lt- (el signo ldquomenorrdquo seguido sin espacios de un signo ldquomenosrdquo) Asiacuteque si ejecutas

9

a lt- 2

el resultado seraacute el mismo que antes con = Las dos notaciones tienen ventajas e inconvenientes peronosotros preferimos = porque se parece maacutes a lo que se utiliza en muchos lenguajes de programacioacuten

Coacutemo ver los resultados de un caacutelculo a la vez que lo hacemos

Ya habraacutes notado que al hacer una asignacioacuten R no produce ninguna respuesta y se limita aguardar el valor en la variable En una asignacioacuten como a=2 esto no genera ninguna duda Perosi el miembro derecho de la asignacioacuten es una expresioacuten maacutes complicada puede ser convenientepedirle a R que nos muestre el resultado de esa expresioacuten a la vez que se hace la asignacioacutenImagiacutenate por ejemplo esta situacioacuten

b = 2c = -2d = -4a = b c^2 d + 3

iquestCuaacutel es el valor que se asigna a la variable a Una forma de averiguarlo es simplemente ejecutaruna liacutenea adicional en la que aparece soacutelo el nombre de la variable que queremos inspeccionar Alejecutar esta sentencia R nos devuelve como respuesta

gt a[1] 1

Pero hay otra manera de conseguir que R nos muestre el resultado de la asignacioacuten que es maacutesinteresante porque produce coacutedigo maacutes simple Basta con encerrar toda la asignacioacuten entre pareacuten-tesis El resultado es

gt ( a = b c^2 d + 3 )[1] 1

como antes Este ejemplo es desde luego bastante artificial Te recordamos en cualquier caso laconveniencia de utilizar pareacutentesis para hacer maacutes legibles las expresiones y evitar posibles erroresPero a la vez la posibilidad de comprobar el resultado de las asignaciones aumenta la fiabilidaddel coacutedigo que escribimos

Nombres de las variables

Aunque hasta ahora hemos usado letras como nombres de las variables puedes utilizar nombresmaacutes descriptivos Y muchas veces es una buena idea hacerlo Por ejemplo puede que hace unasemana hayas escrito estas instrucciones para resolver un problema

a = 2b = 3c = a b

Pero si las vuelves a ver pasada una semana es posible que no recuerdes queacute era lo que estabastratando de conseguir al hacer esto En cambio al ver estas instrucciones

espacio = 2tiempo = 3velocidad = espacio tiempo

es mucho maacutes faacutecil reconocer el objetivo que persiguen A lo largo de los tutoriales del curso vamos ainsistir muchas veces en la necesidad de que el coacutedigo esteacute bien organizado y esteacute bien documentadoUn primer paso en esa direccioacuten es tratar de elegir nombres descriptivos para las variables En Rlas reglas para los nombres de variables son muy flexibles esencialmente que empiecen por unaletra y no contengan espacios ni caracteres especiales como + pareacutentesis etceacutetera Pero cuidadocon los excesos Es cierto que puedes usar nombres de variables arbitrariamente largos Pero si usascomo nombre

Estavariablealmacenaelresultadodelaoperaciontaninteresantequeacabamosdehacer

tu trabajo resultaraacute ilegible Como siempre se necesita un equilibrio y con la praacutectica encontraraacutesel tuyo (consejo zen gratuito del tutorial de hoy) Para empezar es una buena idea combinarmayuacutesculas y minuacutesculas en los nombres de las variables Si vas a usar una variable para representarla temperatura final de un proceso el nombre temperaturafinalproceso es menos legible y maacuteslargo que tempFinal Es mucho maacutes faacutecil por otra parte que te equivoques tecleando el primerode esos nombres

10

22 VectoresEn Estadiacutestica lo habitual es trabajar con colecciones o muestras de datos Y para almacenar esascolecciones de datos la estructura maacutes baacutesica de R son los vectores En este apartado vamos aempezar nuestro trabajo con ellos aunque a lo largo del curso auacuten tendremos ocasioacuten de aprenderbastante maacutes sobre el manejo de los vectores de RPara empezar vamos a trabajar con vectores que contienen una coleccioacuten de nuacutemeros que puedenser las edades de los alumnos de una clase

22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19

En R las listas de nuacutemeros como esta se almacenan en vectores El vector que corresponde a esasedades se construye en R mediante un comando como este

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19)

En realidad en esa expresioacuten hemos hecho dos cosas

1 Hemos creado el vector con los datos en la parte derecha de la expresioacuten

c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19)

Los datos estaacuten separados por comas y rodeados por pareacutentesis Hasta aquiacute todo es bastantetiacutepico pero fiacutejate especialmente en la letra c que precede al primer pareacutentesis Esa letra ces el nombre de una nueva funcioacuten de R y es la forma maacutes sencilla que existe en R paracrear un vector de datos Podriacutea pensarse que la c es de crear pero en realidad proviene deconcatenar Enseguida entenderemos porque es asiacute

2 Una vez creado el vector lo hemos asignado a la variable edades Hasta ahora soacutelo habiacuteamosusado variables para identificar un uacutenico valor (un nuacutemero o una cadena alfanumeacuterica)Pero una variable puede usarse para identificar un vector o como veremos maacutes adelanteestructuras mucho maacutes complejas

Una observacioacuten maacutes los vectores de R se usan para almacenar valores de una variable Y enparticular todos los datos de un vector son del mismo tipo de variable No se puede mezclar en unvector nuacutemeros y cadenas alfanumeacutericas (aparentemente R te dejaraacute hacerlo pero internamentehabraacute convertido todos los nuacutemeros en cadenas alfanumeacutericas)

Manos a la obra Prueba a copiar el comando anterior en tu Consola de comandos (puedes usarcopiar y pegar desde este fichero) y ejecuacutetalo Si las cosas van bien no esperes ninguna respuestacomo ya hemos dicho R no te muestra el resultado de las asignaciones Recuerda que si quieresver el resultado de una asignacioacuten puedes rodear toda liacutenea con pareacutentesis como en

(edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19))

Otra opcioacuten naturalmente es preguntarle a R por el valor de edades despueacutes de la asignacioacutenEscribe simplemente edades en la Consola de Comandos y ejecuacutetalo Veraacutes de nuevo el contenidode esa variable

Vamos a hacer algunas operaciones con este vector Imagiacutenate que como sucede a menudo despueacutesde haber creado nuestra lista de edades de alumnos desde la administracioacuten nos avisan de que haycinco alumnos nuevos recieacuten matriculados y debemos incorporar sus edades que son

22 18 20 21 20

a nuestro vector de datos Naturalmente podemos empezar de nuevo pero es preferible reutilizarel vector edades que ya habiacuteamos creado Vamos a ver esto como primer ejemplo para empezar aaprender coacutemo se manipulan vectores en R Una forma de antildeadir los datos es empezar creando unnuevo vector (con la funcioacuten c de R)

(edades2 = c(22 18 20 21 20))

Y a continuacioacuten concatenamos los vectores usando de nuevo la misma funcioacuten c de una maneradistinta

(edades = c( edades edades2))

11

Hemos rodeado toda la liacutenea con pareacutentesis para ver el resultado y poder observar coacutemo hacambiado el vector edadesVamos a analizar paso a paso lo que ha ocurrido

La instruccioacuten c( edades edades2) toma los datos contenidos en edades y edades2 y losconcatena en ese orden para fabricar un nuevo vector que todaviacutea no estaacute guardado enninguna variable

La asignacioacuten edades = c( edades edades2) toma ese vector y lo guarda en la propiavariable edades Al hacer esto como era de esperar el anterior vector edades es reemplazadocon la nueva lista y su contenido anterior se pierde (cuidado con esto las reasignaciones sonuna de las formas habituales de cometer errores)

El nombre de la funcioacuten c proviene en realidad de concatenate concatenar en ingleacutesLa siguiente figura resume lo que hemos venido haciendo con estos datos

Los nuacutemeros entre corchetes al principio de cada fila como el [1] y el [16] de este ejemploson soacutelo ayudas para que podamos localizar los elementos del vector En mi pantalla la primerafila muestra los primeros 15 nuacutemeros del vector Pero en la tuya si la ventana de RStudio es dedistinta anchura los nuacutemeros entre corchetes pueden ser distintos Hasta ahora soacutelo habiacuteamos vistoejemplos con [1] que es lo que sucede cuando la respuesta es un vector que cabe en una uacutenicaliacutenea

3 Ficheros csv con REn esta seccioacuten vamos a aprender a utilizar ficheros csv con R En el Tutorial-01 hemos vistoalgunos ejemplos de ese tipo de ficheros y el manejo baacutesico con una hoja de caacutelculo como CalcComo vimos alliacute un fichero csv tiacutepico contiene una tabla de datos con varias columnas Esaestructura de tabla se haraacute imprescindible maacutes adelante Pero durante una buena parte del cursonosotros nos vamos a limitar a problemas en los que interviene una uacutenica variable En tal casopara almacenar los datos de esa variable nos podemos a limitar a considerar un tipo de ficheroscsv muy baacutesico como el fichero adjunto

Guaacuterdalo en la subcarpeta datos de tu directorio de trabajo (el que contiene este pdf) Si lo abrescon un editor de texto (como el Bloc de Notas en Windows) veraacutes como muestra esta figura

12

61371381381381391391351381371381371371361361371351381391341371351371371351391341371371371381351381391371341361361361391381361371361371361361381361351351361361381351381351391371361391351371381381371310137138137135136138138137133135136137135137137135138134138138138136137136136138135136135138136139137

que el fichero contiene soacutelo una columna de datos que en este ejemplo corresponde a valores deuna variable cuantitativa discreta En la figura soacutelo se muestra una parte de los datos

Ejercicio 3iquestCuaacutentos datos hay en ese vector Usa Calc para averiguarlo pronto aprenderemos a hacerlo conR Solucioacuten en la paacutegina 47

Queremos utilizar esos datos en R y para eso vamos a (1) leerlos desde el fichero y (2)guardarlos enun vector El resultado seraacute como si nosotros hubieacuteramos creado ese vector tecleaacutendo sus elementosdirectamentePara el primer paso (la lectura del fichero csv) vamos a tener que empezar por explicarle a R(usando RStudio como intermediario) donde estaacute el fichero que contiene esos datos Cuando tra-bajamos con ficheros R utiliza un directorio de nuestro ordenador como directorio de trabajo Acontinuacioacuten vamos a aprender a elegir un directorio de trabajo Puedes usar cualquier carpeta yen lo que sigue vamos a suponer que hemos elegido el Escritorio Lo maacutes importante es que esacarpeta debe contener a su vez una subcarpeta llamada datos Y aseguacuterate de que los ficheroscsv que vas a usar estaacuten almacenados en esa subcarpeta llamada datos

Usamos el menuacute Session rarr Set Working Directory rarr Choose Directory

Se abre un cuadro de diaacutelogo del sistema y navegamos hasta la carpeta que contiene el ficherocsv que en mi caso es el Escritorio Cuando selecciono el Escritorio veo aparecer en la Consolade Comandos de R un comando que RStudio ha escrito y ejecutado por nosotros

13

setwd(CUsersFernandoDesktop)

Este es el resultado en mi ordenador (de ahiacute el nombre de usuario) usando Windows 10 Enversiones maacutes antiguas de Windows o en una maacutequina con Linux o un Mac el comando seraacuteligeramente distinto Cuando tengamos maacutes praacutectica aprenderemos otras formas de seleccionar eldirectorio de trabajo o incluso de utilizar ficheros situados fuera de ese directorio de trabajo Peropor el momento resulta maacutes coacutemodo dejar que RStudio haga ese trabajo para nosotrosAhora R ya sabe doacutende estaacute el fichero que nos interesa pero todaviacutea no sabe cual es Para ello vamosa utilizar la funcioacuten readtable de R Aunque esta funcioacuten tiene muchas opciones disponiblesnuestro primer uso de ella seraacute bastante sencillo Copia y ejecuta el siguiente coacutedigo en RStudio

(vectorEdades = readtable(datosTut02-Edadescsvheader = FALSE)[1])

En esta instruccioacuten le decimos a R que use la funcioacuten readtable para leer el contenido del ficheroTut02-Edadescsv y que almacene lo que ha leiacutedo en un vector que hemos decidido llamarvectorEdades Y aunque no es necesario entender en detalle el funcionamiento de readtable eneste momento vamos a explicar un poco maacutes lo que hemos hecho A medida que el curso avanceiraacutes teniendo maacutes ocasiones de practicar esto e iraacute quedando cada vez maacutes claroLa opcioacuten header = FALSE sirver para indicarle a R que la tabla almacenada en el fichero no tieneuna liacutenea de cabecera (en ingleacutes header) que cuando existe suele contener los nombres de lasvariables de la tabla Ademaacutes la funcioacuten readtable sirve para leer tablas con varias columnasobteniendo como resultado un objeto de R de tipo dataframe Pero nuestro primer ejemplo esmuy sencillo y la tabla soacutelo tiene una columna Asiacute que usamos la notacioacuten [1] para indicarle aR que soacutelo queremos la primera columna de esa tabla considerada como un vectorAl ejecutar esa orden habraacutes obtenido una respuesta como esta

gt gt (vectorEdades = readtable(datosTut02-Edadescsv header = FALSE)[1])[1] 6 7 8 8 8 9 9 5 8 7 8 7 7 6 6 7 5 8 9 4 7 5 7[24] 7 5 9 4 7 7 7 8 5 8 9 7 4 6 6 6 9 8 6 7 6 7 6[47] 6 8 6 5 5 6 6 8 5 8 5 9 7 6 9 5 7 8 8 7 10 7 8[70] 7 5 6 8 8 7 3 5 6 7 5 7 7 5 8 4 8 8 8 6 7 6 6[93] 8 5 6 5 8 6 9 7

Como hemos dicho antes los nuacutemeros entre corchetes al principio de cada fila que en mi casoson [1] [24] [47] [70] y [93] son soacutelo ayudas para que podamos localizar los elementos delvector En mi pantalla cada primera fila muestra 23 nuacutemeros del vector Pero en la tuya si laventana de RStudio es de distinta anchura los nuacutemeros entre corchetes pueden ser distintos

En cualquier caso ahora el vector vectorEdades contiene la informacioacuten del fichero csv con el quehemos empezado En la Seccioacuten 4 vamos a empezar a hacer Estadiacutestica Descriptiva Pero antes tepedimos un poco maacutes de paciencia porque vamos a entretenernos un poco maacutes en los detalles delmanejo de ficheros csv con R No pretendemos ser exhaustivos ni mucho menos pero siacute queremosaprender lo suficiente como para evitarnos los problemas maacutes habituales en los casos maacutes sencillosPara cerrar este apartado es conveniente haber visto el error que se produce cuando el fichero quetratamos de leer desde R no existe o no estaacute en el directorio de trabajo

Ejercicio 4Prueba a ejecutar

errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)

y fiacutejate en el mensaje de error Solucioacuten en la paacutegina 47

Otra variante del fichero de entrada

Los ficheros csv que contienen un uacutenico vector (en lugar de una tabla de datos) pueden adoptarformatos distintos del que acabamos de ver Por ejemplo el fichero adjunto

contiene los mismos datos que Tut02-Edadescsv pero ahora los datos del vector estaacuten todos enuna fila y separados por comas Guaacuterdalo como antes en la subcarpeta datos El aspecto delfichero visto a traveacutes de un editor de texto es este (soacutelo son visibles una parte de los datos)

14

67888995878776675894757759477785897466698676766865566858597695788710787568873567577584888676685658697

Desde luego no nos podemos plantear transformar a mano este vector en uno como el anteriorLa solucioacuten que te proponemos pasa por la hoja de caacutelculo y la opcioacuten de trasponer una tablaque hemos visto en el Tutorial-00 lo leeriacuteamos en una fila de la hoja y luego habriacutea que usar elPegado especial para trasponerlo -es decir girarlo- para finalmente volver a guardarlo Alterna-tivamente hay otras soluciones sin salir de R usando una funcioacuten llamada scan o usando de nuevoreadtable y trasponiendo la tabla dentro de R Esos meacutetodos son sencillos cuando se aprendeun poco maacutes sobre R pero por el momento y para los ejemplos sencillos que encontraremos nosvamos a conformar con ese enfoque baacutesico que usa la hoja de Caacutelculo si es necesario

31 Coacutemo obtener ayuda y usar el tabulador en RStudioVamos a aprovechar estos ejemplos de lectura de ficheros csv para aprender a obtener ayuda sobrelas funciones de R La mayoriacutea de las funciones de R como la funcioacuten readtable o la funcioacutenscan que hemos mencionado al final del anterior apartado tienen muchos argumentos opcionalesY hay muchiacutesimas funciones en R (cada vez maacutes porque como veremos maacutes adelante usuarios detodo el mundo antildeaden constantemente funciones nuevas a R cuando las necesitan) No es posiblerecordar todos esas funciones cada una con sus opciones asiacute que es muy importante aprender aobtener esa informacioacuten cuando la necesitamosPara ver como obtener esa informacioacuten en RStudio vamos a usar por ejemplo la funcioacuten scanSituacuteate en una liacutenea vaciacutea de la Consola de Comandos escribe scan y a continuacioacuten mientras elcursor parpadea junto a la n final de scan pulsa la tecla del tabulador (si esto no funciona usa latecla F1 y mira el panel ayuda de RStudio) Veraacutes aparecer una ventana emergente con informacioacutensobre la funcioacuten scan como en esta figura

15

Como ves se muestra un resumen sobre la funcioacuten scan que a veces seraacute suficiente Si necesitasmaacutes detalles haz caso a la indicacioacuten que aparece al final de esa ventana y pulsa la tecla F1 Alhacerlo veraacutes que en el panel inferior derecho de RStudio aparece el fichero de ayuda de la funcioacutenscan como en esta figura

Esos ficheros de ayuda son muy uacutetiles aunque al principio pueden resultar un poco intimidatoriosya sea por un exceso de informacioacuten ya sea porque se da por supuesto que el usuario ya entiendealgunos conceptos baacutesicos de R Podemos garantizar al lector que a medida que se progresa en Rla utilidad de estos ficheros aumentaPero la utilidad de la tecla tabulador en RStudio no se acaba ahiacute Supongamos que quieres aplicarreadtable para leer el fichero Tut02-Edadescsv Pero te da pereza escribir un nombre tan largoo no recuerdas exactamente el nombre o dudas entre dos nombres no importa cual sea el motivoEmpiezas a escribir la orden tecleas

(vectorEdades2 = readtable(datos

y de nuevo justo en este punto pulsas el tabulador Entonces RStudio te ofrece en una nuevaventana emergente todos los ficheros disponibles en la carpeta datos

Y ahora puedes usar esa lista seleccionar el fichero que quieras utilizar Puedes tambieacuten teclearalguna letra maacutes del nombre para acotar auacuten maacutes la buacutesqueda cuando la carpeta contiene muchosficherosEn general la idea es que en RStudio el tabulador es tu amigo Como tendremos ocasioacuten decomprobar RStudio nos ofrece bastante ayuda para hacer maacutes coacutemodo nuestro trabajo con R yel tabulador es una de las herramientas maacutes versaacutetiles y uacutetiles

16

32 El camino contrario escribir un vector a un fichero de tipo csvHemos aprendido a leer con R vectores de datos a partir de ficheros de tipo csv Pero muchasveces despueacutes de hacer operaciones en R obtendremos como resultados nuevos vectores (y maacutesadelante en el curso otro tipo de objetos) Lo natural entonces es aprender a guardar ese vectoren un fichero de tipo csv como el fichero con el que empezamos De esa forma por ejemplo puedescompartir tus resultados con otras personas que utilicen programas distintos de R Para ello siantes usaacutebamos la funcioacuten readtable ahora vamos a usar la funcioacuten writetable de R

Como ejemplo vamos a utilizar este vector de nuacutemeros enteros

29 17 63 31 55 9 92 61 10 16 63 6 61 59 66 41 68 6 99 21 87 68 52 83 66 98 45 5024 100 83 37 44 4 97 67 56 74 75 71 55 22 86 22 93 65 38 84 54 83 100 71 99 1963 11 11 62 91 20 79 42 59 95 70 74 8 25 45 58 57 75 81 34 70 68 39 12 14 21

Ejercicio 5Usa copiar y pegar a partir de este documento pdf para crear un vector de R llamado muestraque contenga esos datos

Para guardar ese vector muestra en un fichero csv (dentro de la subcarpeta datos del directoriode trabajo) podemos utilizar la funcioacuten writetable usando como argumentos

El nombre del vector que queremos guardar que es muestra

Y el nombre del fichero en el que lo guardamos Vamos llamarlo por ejemplo Tut02-muestracsvLe indicamos a R ademaacutes que lo ponga en la subcarpeta datos

La opcioacuten colnames = FALSE o colnames = TRUE para decidir si queremos que R incluyauna liacutenea de cabecera con el nombre de la variable que en este caso es muestra (y que novamos a incluir)

La opcioacuten rownames = FALSE para evitar que R incluya nuacutemeros de fila en el fichero desalida (normalmente no querremos esos nuacutemeros)

Es decir que ejecutamos

writetable(muestrafile = datosTut02-muestracsv colnames=FALSE rownames=FALSE)

Al ejecutar esa orden el fichero que obtenemos tiene la forma deseada (de nuevo soacutelo es visible elcomienzo del fichero)

17

Puedes probar a abrirlo en Calc para ver que es un fichero de datos como los que hemos visto hastaahora

Naturalmente apenas hemos rozado el tema de la entradasalida de datos en R Pero con lo quehemos aprendido en este apartado estamos listos para empezar a hacer Estadiacutestica Descriptivausando ejemplos que no sean demasiado triviales

4 Estadiacutestica descriptiva de una variable cuantitativa condatos no agrupados

Para seguir adelante tenemos que empezar por aprender un poco maacutes sobre la forma en la que Rpermite operar con los vectores Vamos a hacerlo a traveacutes de una serie de ejercicios-ejemplos

Ejercicio 6

1 Vamos a definir dos vectores cada uno de ellos con 12 nuacutemeros enteros El primero al quellamaremos vector1 estaacute formado por

8 5 19 9 17 2 28 18 3 4 19 1

Usa copiar y pegar a partir de este fichero pdf para definir el vector1 en R

2 El segundo vector al que en un rapto de originalidad llamaremos vector2 estaacute almacenadoen el fichero

Guaacuterdalo en datos y examiacutenalo primero con un editor de texto (como el Bloc de Notas)para ver coacutemo estaacuten almacenados los datos en ese fichero Una vez hecho esto usa Calc yla funcioacuten readtable para almacenar el contenido de ese fichero csv en el vector2 de REn alguacuten momento del proceso puede que tengas que usar el pegado especial de Calc paratrasponer los datos

Solucioacuten en la paacutegina 47

41 Aritmeacutetica vectorial en RAhora vamos a sumar los dos vectores Ejecuta el comando

vector1 + vector2

para comprobar que el resultado es la suma componente a componente de los dos vectores

gt vector1 + vector2[1] 26 23 39 21 37 3 58 24 29 24 34 26

Este resultado es bastante previsible Lo que quizaacute resulteacute un poco maacutes inesperado es que simultiplicas los dos vectores tambieacuten se obtienen los productos componente a componente el primerelemento de vector1 se multiplica por el primero de vector2 el segundo por el segundo etc

gt vector1 vector2[1] 144 90 380 108 340 2 840 108 78 80 285 25

Esta forma de operar de R como veremos pronto es muy uacutetil Si lo piensas un momento cadavector numeacuterico de R se corresponde con una columna de una hoja de caacutelculo como las queusaacutebamos en el Tutorial01 Alliacute vimos que para algunas operaciones era necesario multiplicar doscolumnas elemento a elemento En Calc esa operacioacuten no es complicada pero en R es auacuten maacutes faacutecilBasta con un comando como vector1 vector2 para conseguir el objetivo Veremos muchos maacutesejemplos a lo largo del curso en los que una operacioacuten que en Calc requeririacutea bastantes pasosen R se reduce a ejecutar un uacutenico comandoEn R las operaciones con vectores siguen en general este esquema de funcionamiento componentea componente Si por ejemplo ejecutas

18

1818201220130626201525

gt vector1 + 5[1] 13 10 24 14 22 7 33 23 8 9 24 6gt 2 vector1[1] 16 10 38 18 34 4 56 36 6 8 38 2

veraacutes que en el primer caso cada uno de los elementos de vector1 se ha incrementado en 5mientras que en el segundo caso cada uno se ha multiplicado por 2 Sucede lo mismo con otrasoperaciones como elevar al cuadrado

gt vector1^2[1] 64 25 361 81 289 4 784 324 9 16 361 1

Y podemos aplicar funciones en un solo paso Por ejemplo podemos calcular el logaritmo neperianode todos los elementos de un vector en un soacutelo paso

gt log(vector1)[1] 20794415 16094379 29444390 21972246 28332133 06931472[7] 33322045 28903718 10986123 13862944 29444390 00000000

Los resultados de todas estas operaciones son de nuevo vectores Y por tanto se pueden asignara nuevas variables para utilizarlos en nuestras operaciones Por ejemplo si luego vas a necesitar loslogaritmos de vector1 puedes definir una variable para identificar ese vector llamada logVector1(e el nombre que tuacute quieras) haciendo

gt logVector1 = log(vector1)

Recuerda que si ademaacutes de la asignacioacuten quieres ver el resultado puedes rodear toda esta senten-cia con pareacutentesis De lo contrario R la ejecuta pero no imprime ninguna respuesta como ya sabes

Aunque al principio puede parecer complicado cuando te acostumbres a esta forma de trabajarcon vectores veraacutes que resulta muy coacutemoda y eficiente

Generando vectores de nuacutemeros enteros consecutivos

Hay muchas ocasiones en que para alguna operacioacuten necesitamos un vector que contenga losnuacutemeros enteros consecutivos del 1 al n o del 0 al n etc En R esto es muy faacutecil de hacer Porejemplo para conseguir un vector con los nuacutemeros del 1 al 15 basta con ejecutar

gt 115[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Esa notacioacuten con los dos puntos permite generar vectores en los que cada elemento es igual alanterior maacutes 1 Otro ejemplo

gt -713[1] -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13

O incluso cuando los puntos de partida no son enteros

gt 1575[1] 15 25 35 45 55 65 75gt 1574[1] 15 25 35 45 55 65

iquestVes la diferencia entre estos dos casos

Es muy posible que te esteacutes preguntando iquesty si quiero ir avanzando de 2 en 2 o quiero ir hacia atraacutes(ldquoavanzandordquo de minus2 en minus2 por ejemplo) Pronto cuando hayamos aprendido un poco maacutes volve-remos sobre esto y comprobaremos que R nos ofrece un cataacutelogo de herramientas extremadamentepotentes para fabricar vectores de acuerdo con nuestros deseos y necesidadesLos vectores fabricados con este meacutetodo son vectores iguales que los demaacutes y se pueden asignar avariables operar con ellos etc

19

Ejercicio 7

1 Fabrica un vector con los cuadrados de los nuacutemeros del 1 al 10 y asiacutegnalo a la variablecuadrados Usa los pareacutentesis para ver el resultado de la asignacioacuten

2 Haz lo mismo con los cuadrados de los nuacutemeros del 2 al 11 y un vector cuadrados2

3 Resta los vectores cuadrados2 - cuadrados iquestObservas algo interesante

Solucioacuten en la paacutegina 47

Funciones vectoriales

Hemos visto antes que se puede aplicar una funcioacuten como la raiacutez cuadrada a un vector y seobtiene como resultado otro vector con las raiacuteces cuadradas elemento a elemento Pero hay otrotipo de funciones que permiten hacer caacutelculos con el vector en conjunto Por ejemplo antes hemosfabricado el vector -713 y la funcioacuten length nos dice cuantos elementos tiene ese vector

gt length(-713)[1] 21

En el Ejercicio 3 (paacuteg 13) nos preguntaacutebamos cuantos elementos teniacutea el vector vectorEdades quehabiacuteamos cargado desde el fichero csv Puedes obtener la respuesta con length(vectorEdades)Para comprobarlo aseguacuterate de que has creado el vector llamado vectorEdades y ejecuta estaorden

gt length(vectorEdades)[1] 100

Como ves el resultado de length es el esperado

Vamos a conocer otra funcioacuten llamada sum que sirve para calcular la suma de todos los elementosde un vector

gt sum(vectorEdades)[1] 675

Ejercicio 8iquestCuaacutento vale la suma de los cuadrados de los nuacutemeros del 1 al 100 Solucioacuten en la paacutegina 47

A lo mejor te ha pasado desapercibido pero con las funciones length y sum estamos por fin encondiciones de empezar a hacer Estadiacutestica Descriptiva Por ejemplo podemos calcular la mediaaritmeacutetica de vectorEdades

gt ( mediaEdades = sum(vectorEdades) length(vectorEdades) )[1] 675

Y una vez que tenemos la media podemos calcular la varianza poblacional Para que resulte maacutesclaro vamos a mostrarte el proceso paso a paso aunque al final lo ejecutaremos en un soacutelo paso

1 Empezamos restando la media que estaacute en la variable mediaEdades de cada uno de loselementos de vectorEdades

vectorEdades - mediaEdades

El resultado es un vector de diferencias

2 Ahora elevamos cada una de esas diferencias al cuadrado

( vectorEdades - mediaEdades )^2

El resultado de este paso es de nuevo un vector ahora con las diferencias al cuadrado Fiacutejateen el pareacutentesis para garantizar que elevamos al cuadrado la diferencia Si no incluyeacuteramosel pareacutentesis iquestqueacute calculariacuteamos

20

3 A continuacioacuten sumamos todas esas diferencias al cuadrado usando la funcioacuten sum

sum( ( vectorEdades - mediaEdades )^2)

De nuevo el pareacutentesis es fundamental para que el cuadrado del vector de diferencias secalcule antes que la suma En este paso el resultado ya no es un vector sino un nuacutemero

4 Por uacuteltimo dividimos esa suma por n el nuacutemero de elementos de vectorEdades que seobtiene con la funcioacuten length

sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades)

El resultado de estos pasos se puede condensar en un soacutelo comando de R en el que a la vezcalculamos la varianza y la asignamos a una variable

gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades) )[1] 19875

Ejercicio 9

1 Calcula la desviacioacuten tiacutepica (poblacional) de vectorEdades

2 Calcula la cuasivarianza y cuasidesviacioacuten tiacutepica (muestrales) de vectorEdades

3 iquestQueacute sucede si en el tercer paso ejecutas el siguiente comandosum( vectorEdades - mediaEdades )^2iquestPor queacute sucede esto

Solucioacuten en la paacutegina 48

Con estos caacutelculos hemos empezado a hacer Estadiacutestica con R Naturalmente nos queda muchiacutesimoque aprender sobre los vectores de R Por ejemplo como se accede a una componente individualdel vector para responder a preguntas como ldquoiquestCuaacutento vale el quinto elemento del vectorrdquo Maacutesen general aprenderemos a extraer aquellos elementos del vector que cumplan alguna condicioacutenrespondiendo a preguntas como ldquoiquestQueacute elementos del vector son mayores que 7rdquo

42 Y por fin hagamos Estadiacutestica DescriptivaEn esta seccioacuten vamos a trabajar con un vector de datos contenido en este fichero adjunto

Este vector contiene los datos de la variable var3 del fichero Tut01-PracticaConCalccsv queya hemos utilizado en el Tutorial-00 para aprender a hacer Estadiacutestica Descriptiva con Calc Enesta seccioacuten vamos a reproducir los resultados que obtuvimos alliacute pero esta vez usando R Parapreparar el terreno vamos a hacer limpieza

Ejercicio 10

1 Cierra Rstudio y vuelve a abrirlo para limpiar la memora del sistema El trabajo que hemoshecho hasta ahora se perderaacute (aunque los comandos siguen en el Historial de Comandos queya vimos)

2 Establece el Directorio de Trabajo (por ejemplo el Escritorio) y aseguacuterate de que Tut02-var3csvestaacute guardado en la subcarpeta datos de ese directorio

3 Carga de nuevo el contenido de ese fichero en un vector var3 de R

Solucioacuten en la paacutegina 48

Veraacutes en lo que sigue que siempre que calculamos un objeto le asignamos una variable Eso permiteahorrarse la repeticioacuten innecesaria de caacutelculos si maacutes adelante volvemos a necesitar ese objeto Yen algunos casos como veremos maacutes adelante al hacer esto podemos acceder a propiedades delobjeto calculado que R no muestra en su respuesta por defecto

21

4 138 134 134 135 135 133 136 136 132 134 134 133 133 133 132 136 134 135 132 135 136 135 132 136 134 135 133 134 134 134 1310 136 138 134 135 137 133 135 138 136 137 135 134 137 135 136 138 137 134 133 135 135 134 131 135 137 133 133 137 136 135 135 132 138 135 135 135 136 135 133 1311 136 1310 134 131 133 138 139 135 134 1310 134 134 137 135 134 133 132 135 132 136 135 134 133 139 136 135 134 135 132 132 138 134 133 136 138 134 134 134 138 134 132 135 1310 136 1312 135 139 135 138 138 135 132 135 1310 136 135 136 135 135 137 134 133 134 133 133 134 133 133 133 133 137 138 135 134 135 134 135 137 135 133 134 134 137 133 132 135 137 135 134 136 132 135 132 136 1310 134 132 139 134 136 136 132 137 134 138 135 135 134 134 137 134 136 136 135 134 133 135 133 133 136 132 133 134 138 138 137 137 136 135 1310 134 134 134 138 136 134 136 137 135 135 136 138 134 138 134 135 137 136 134 137 137 135 137 132 136 135 133 135 136 130 133 135 135 137 134 137 131 135 136 135 138 132 134 136 139 137 1310 134 135 136 132 135 135 135 1313 133 136 133 136 135 130 1310 134 136 136 134 131 133 135 137 136 133 135 133 134 132 132 138 138 134 136 135 135 134 133 139 134 139 136 1311 133 132 132 136 138 1310 133 137 133 134 135 139 133 135 133 134 138 139 132 138 133 133 137 138 136 133 135 134 132 1311 137 137 136 134 133 135 1310 135 134 135 133 135 136 135 139 135 134 135 135 134 133 137 134 1310 135 134 132 139 134 137 133 135 134 131 136 135 136 134 138 135 135 138 138 134 132 135 133 134 138 138 135 138 132 1311 135 134 134 136 139 1310 137 134 137 132 133 135 1310 135 135 133 135 136 134 134 136 135 137 136 136 134 133 134 135 132 134 136 139 133 135 133 136 133 133 135 134 134 134 137 135 139 1310 133 134 136 131 137 138 135 133 133 135 133 133 137 136 135 135 138 134 139 136 135 135 138 134 130 133 137 133 134 1311 132 137 133 136 135 133 134 133 133 132 138 133 134 134 134 134 138 138 137 136 132 132 137 135 133 135 138 135 134 135 134 135 134 1312 133 135 133 133 133 132 134 131 139 135 135 135 138 138 135 138 133 134 133 136 136 135 134 133 133 135 133 137 135 132 133 133 132 131 132 136 137 130 136 133 134 1310 132 136 137 134 133 132 138 133 135 133 135 136 132 134 134 133 135 135 135 134 134 136 133 132 138 1310 135 135 132 132 137 136 134 135 134 134 136 134 136 135 133 137 137 136 137 134 134 137 133 130 134 136 135 137 136 136 135 137 134 134 135 136 136 135 136 132 134 133 139 135 133 137 135 136 137 136 136 136 134 135 137 137 133 134 137 137 136 133 134 137 131 135 136 133 137 133 135 133 137 138 133 137 132 135 134 133 132 135 134 134 135 133 134 139 135 134 139 137 133 132 133 134 133 134 135 135 138 134 135 134 135 139 137 133 133 132 136 132 138 135 132 137 134 135 136 132 134 135 135 133 135 136 137 135 138 132 131 137 135 135 138 134 137 136 139 1310 137 134 131 136 132 136 137 133 135 137 135 132 135 135 133 133 137 134 133 133 131 138 139 132 134 138 135 136 138 137 1310 138 133 134 134 135 134 134 135 136 135 134 134 135 133 136 135 137 132 133 139 132 133 137 136 134 137 131 135 134 132 134 138 135 134 131 132 134 135 136 133 134 138 134 132 135 134 132 134 133 136 135 138 133 139 1310 134 133 133 137 137 136 137 133 133 133 135 139 136 136 137 136 135 132 132 139 136 132 139 132 137 135 133 138 137 135 134 136 131 133 135 133 134 137 135 134 132 136 136 136 137 133 132 135 134 135 134 137 134 133 133 134 132 134 135 134 134 136 134 135 138 133 135 135 138 133 135 134 135 135 138 1311 132 134 134 136 133 135 133 136 132 131 136 134 136 132 136 136 136 136 130 136 134 134 131 138 131 1310 135 139 136 132 136 138 135 138 134 132 134 133 136 137 133 133 133 133 137 136 135 133 139 133 132 135 136 136 134 132 132 135 137 136 136 136 138 137 137 135 135 131 136 133 136 135 133 134 130 133 135 136 137 138 136 134 135 132 137 132 137 132 133 134 135 138 134 136 133 135 135 139 134 134 136 134 134 134 135 134 133 135 135 138 133 136 136 134 135 134 134 138 136 133 137 132 134 137 136 135 133 134 133 135 134 134 136 134 133 137 133 135 135 136 135 138 134 136 132 137 136 138 134 136 136 137 136 136 135 136 1310 138 133 137 135 136 137 134 136 133 134 133 132 132 134 137 132 132 133 132 138 134 134 135 135 139 135 134 132 134 135 134 139 137 133 134 134 135 133 133 137 138 135 139 133 138 136 136 134 133 136 135 1314 137 133 137 135 136 134 134 136 133 135 134 135 136 136 135 133 135 131 135 137 135 136 133 137 135 134 133 134 134 134 134 134 136 132 134 136 136 137 139 134 138 133 133 132 135 131 134 133 137 133 133 134 139 138 134 134 137 137 135 136 134 139 137 138 134 133 134 134 135 137 134 135 138 133 132 134 1310 133 135 134 132 138 137 136 135 138 1314 139 135 135 131 134 135 134 135 135 135 133 136 135 135 132 136 139 133 133 136 134 132 132 137 136 131 137 135 135 134 1313 1310 132 134 134 133 138 135 134 133 136 136 136 1310 134 137 136 138 139 137 135 134 134 137 137 138 133 134 135 137 135 136 1310 136 136 138 133 136 133 134 135 135 134 136 133 136 136 137 134 135 1316 136 136 132 136 136 133 134 133 137 134 135 134 133 138 134 1310 136 136 136 137 134 136 137 132 138 136 131 132 134 135 130 134 135 135 137 130 136 135 131 136 137 133 137 135 139 138 135 139 133 137 139 133 136 137 136 138 134 1310 136 134 133 139 136 137 133 13713

Rango maacuteximo y miacutenimo

Para empezar vamos a aprender tres nuevas funciones de R que nos permiten calcular esos tresvalores

gt (minimo = min(var3) )[1] 0gt (maximo = max(var3) )[1] 16gt (rango = range(var3) )[1] 0 16

El funcionamiento de las dos primeras es evidente La funcioacuten range devuelve un vector formadopor el maacuteximo y el miacutenimo

Tablas de frecuencia Clases de objetos en R

La tabla de frecuencia absoluta de var3 se obtiene usando la funcioacuten table de esta forma tansencilla

gt ( tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

La primera fila contiene los elementos de var3 y en la segunda aparece la frecuencia de cada unode ellos Puedes comprobar que son los mismos resultados que obtuvimos con Calc en la paacutegina10 del Tutorial01 Aunque alliacute desde luego el proceso fue maacutes laborioso

A lo mejor te has dado cuenta de que el formato de la respuesta es diferente de los que hemosobtenido hasta ahora Para empezar la respuesta no empieza con el [1] al que ya nos vamosacostumbrando El motivo de esto es que el objeto que hemos obtenido como respuesta no es unvector sino una tabla Ya dijimos que R utiliza distintos tipos de objetos con fines distintosiquestCoacutemo podemos saber de queacute clase es un objeto Pues usando una funcioacuten de R oportunamentellamada class Si la usamos con el vector var3 y con su tabla de frecuencias obtenemos

gt class(var3)[1] numericgt class(tablaFrecAbs)[1] table

El vector var3 es de clase numeric porque es un vector de nuacutemeros Y la tabla de frecuencias esde clase table Veremos a lo largo del curso otros objetos de tipo tabular como las matrices (clasematrix) los conjuntos de datos (clase dataframe) y los arraysAunque las tablas son objetos distintos de los vectores tienen algunas propiedades en comuacuten yalgunas de las funciones que hemos usado con vectores tambieacuten se pueden usar con tablas

Ejercicio 11Aplica las funciones length sum min max y range a la tabla tablaFrecAbs Solucioacuten en la paacutegina48

Siguiendo con los parecidos entre tablas y vectores puedes multiplicar (o dividir) una tabla porun nuacutemero y la operacioacuten se haraacute elemento a elemento

gt 2 tablaFrecAbsvar30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1618 50 200 376 488 492 372 262 174 86 56 12 4 4 4 2

Como ves cada frecuencia se multiplica por 2 Esta propiedad de las tablas permite obtener deforma muy sencilla la tabla de frecuencias relativa de var3 Como primer paso vamos a guardarla longitud de var3 en la variable n

22

gt ( n = length( var3 ) )[1] 1300

Y ahora podemos dividir la tabla por n para conseguir la tabla de frecuencias relativas (hemosestrechado la Consola de Comandos para que el resultado cupiera en esta paacutegina)

gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 400069230769 00192307692 00769230769 01446153846 01876923077

5 6 7 8 901892307692 01430769231 01007692308 00669230769 00330769231

10 11 12 13 1400215384615 00046153846 00015384615 00015384615 00015384615

1600007692308

Ejercicio 12Ya sabemos cuanto debe sumar esta tabla de frecuencias relativas Comprueacutebalo Solucioacuten en lapaacutegina 48

Si lo que queremos es una tabla de frecuencias acumuladas debemos emplear la funcioacuten cumsum

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Ejercicio 13La uacuteltima tabla que falta es la de frecuencias relativas acumuladas pero ya tienes todos los ingre-dientes para obtenerla de dos maneras diferentes Hazlo y comprueba si dan el mismo resultadoSi no es asiacute iquesta queacute crees que se debe y cuaacutel es la mejor opcioacuten Asigna el resultado a la variabletablaFrecRelAcu Solucioacuten en la paacutegina 49

Graacuteficos de columnas y diagramas de caja (boxplot) Argumentos con nombre

Vamos a fabricar nuestros primeros graacuteficos con R En concreto vamos a dibujar un graacutefico debarras a partir de la tabla de frecuencias de var3 usando la funcioacuten barplot de R

gt barplot(tablaFrecAbs)

Al ejecutar este comando no debes ver ninguna salida en la Consola de Comandos En su lugaren el panel inferior derecho de RStudio concretamente en la ventana Plots apareceraacute el graacuteficodeseado El resultado puede variar dependiendo de la anchura de tu ventana de RStudio

23

Hemos destacado ademaacutes en la figura los dos botones Zoom y Export que te permiten respecti-vamente ver una versioacuten ampliada de la Figura (que se redimensiona dinaacutemicamente si cambiasla ventana) y guardar esa figura como un fichero de graacuteficos que puedes insertar en cualquierdocumento editar con un programa de manipulacioacuten de graacuteficos etceacuteteraLos graacuteficos de R se pueden controlar hasta en sus detalles maacutes miacutenimos Como aperitivo miacutenimovamos a antildeadir algo de color al graacutefico

gt barplot(tablaFrecAbs col = heatcolors(15))

El resultado es esta figura

Las posibilidades de control de los graacuteficos de R son como decimos inmensas y pueden llegar aser abrumadoras Hay libros de cientos de paacuteginas dedicados a este tema como el R GraphicsCookbook de W Chang (ver las referencias del curso) Nosotros a lo largo de los tutoriales delcurso vamos a aprender algo maacutes aunque a penas nos podremos limitar a rozar la superficie delo que se puede llegar a hacerEn la Seccioacuten 231 del libro hemos descrito los diagramas de cajas o boxplots (recuerda la Figura22 de la paacuteg 36 del libro) Y en el Tutorial-01 dijimos que con Calc no es faacutecil dibujar ese tipode diagramas En cambio con R no podriacutea ser maacutes faacutecil

gt boxplot(var3)

Y el resultado es esta figura

24

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

Las operaciones aritmeacuteticas elementales se representan asiacute en R (como en muchos otros programas)

suma +

resta -

producto

cociente

potencia ^

La raiacutez cuadrada es una funcioacuten en R la primera que vamos a discutir Se representa con sqrt(del ingleacutes square root) Es como en Calc pero recuerda que en R la diferencia entre mayuacutesculasy minuacutesculas es siempre esencial Sqrt o SQRT no funcionaraacuten Se usa poniendo el argumentoentre pareacutentesis Por ejemplo si tecleas sqrt(9) en el siguiente prompt activo y lo ejecutas (pulsaEntrar) obtendraacutes el resultado previsible

Un aviso aunque hasta aquiacute te hemos mostrado el resultado mediante figuras con capturas depantalla vamos a empezar a usar cada vez maacutes descripciones textuales como esta

gt sqrt(9)[1] 3

Soacutelo recurriremos a las capturas de pantalla en los casos en los que nos interesa destacar visualmentealguacuten aspecto de la interfaz graacutefica del programa La ventaja (aparte de ahorrar espacio en eltutorial claro) es que estas descripciones textuales te permitiraacuten seleccionar el texto en la versioacutenen pdf del tutorial para usar copiar y pegar con RStudio Ya iraacutes viendo que esa forma de trabajaraunque a veces tiene alguacuten problema a la larga te resulta coacutemoda Pero a la vez que te decimosesto te recomendamos que especialmente al principio practiques tecleando tuacute mismo muchos delos comandos para acostumbrarte a la interfaz y para ayudarte a recordarlos mas eficazmente Enlas descripciones textuales a menudo te mostraremos juntos prompt comandos y salida en otroscasos nos limitaremos al comando R Recuerda si usas copiar y pegar que el prompt gt no formaparte del comandoNaturalmente ademaacutes de sqrt en R hay muchas otras funciones relacionadas con la Estadiacutesticaque iremos encontrando en el resto del curso Para practicar un poco maacutes este uso de R comocalculadora y la teacutecnica de copiar y pegar ademaacutes de introducir un par de ideas nuevas vamos aproponerte el primer ejercicio de este tutorial

3

Ejercicio 1En este ejercicio vamos a utilizar las liacuteneas de coacutedigo que aparecen a continuacioacuten Copia o tecleacada liacutenea en el prompt (iexclpractica las dos maneras) una por una y ejecuacutetalas pulsando Entrartras copiar o teclear cada liacutenea Trata de adivinar el resultado de cada operacioacuten antes de ejecutarel coacutedigo

2+315-74613513513513+15sqrt(25)sqrt(26)sin(pi)sin(314)

Los resultados de este ejercicio aparecen en la Tabla 1 (paacuteg 5) iexclNo los mires sin haberlo intentadoEsos resultados se merecen algunos comentarios

Seguramente las liacuteneas que menos previsibles te han resultado son las que contienen losoperadores y Estos operadores representan respectivamente el cociente y el resto dela divisioacuten entera

Lo maacutes importante que tienes que observar en los resultados es que R trabaja siempre conla representacioacuten mediante decimales de los nuacutemeros Esto es evidente por ejemplo en larespuesta a la instruccioacuten

13+15

que representa la operacioacuten1

3+

1

5

pero cuyo resultado en R es 05333333 y no 815 El valor decimal es una aproximacioacuten ala fraccioacuten pero no es un resultado exacto (la fraccioacuten siacute es exacta) Por lo tanto cuandohagamos operaciones con R tenemos que tener cuidado con la posible peacuterdida de precisioacutenque llevan siempre aparejadas las operaciones con decimales Teacutecnicamente esto significaque R es un programa (esencialmente) numeacuterico Maacutes adelante en el curso veremos alguacutenprograma simboacutelico y discutiremos la diferencia entre ambos

Fiacutejate en que como hemos dicho R ha interpretado el siacutembolo

13+15

como la operacioacuten1

3+

1

5

en lugar de darle otras interpretaciones posibles como por ejemplo

1(3 + 1

5

) Para hacer esa interpretacioacuten R ha aplicado una serie de reglas de lo que se conoce comoprioridad de operadores y que dicen en que orden se realizan las operaciones seguacuten el tipode operador No queremos entretenernos con esto ahora asiacute que baste con decir que encaso de duda siempre puedes (y a menudo debes) usar pareacutentesis para despejar la posibleambiguumledad

4

gt 3^2[1] 9gt sqrt(9)[1] 3gt 2+3[1] 5gt 15-7[1] 8gt 46[1] 24gt 135[1] 26gt 135[1] 2gt 135[1] 3gt 13+15[1] 05333333gt sqrt(25)[1] 5gt sqrt(26)[1] 509902gt sin(pi)[1] 1224606e-16gt sin(314)[1] 0001592653

Tabla 1 Resultados del Ejercicio 1

Por ejemplo para distinguir entre las dos interpretaciones que hemos dado puedes escribir

(13)+(15)

o por el contrario

1 ( (3+1)5 )

Un uso prudente de pareacutentesis y espacios en las operaciones es una marca caracteriacutestica delbuen hacer cuando se escribe coacutedigo en un ordenador Si alguna vez esto llega a ser unproblema para ti habraacute llegado el momento de aprender algo maacutes sobre esa prioridad deoperadores

La funcioacuten sin es la funcioacuten seno de la Trigonometriacutea Ademaacutes R utiliza el siacutembolo pi parareferirse a la constante matemaacutetica π asymp 3141593 Y el caraacutecter numeacuterico de R se refleja denuevo en el hecho de que al ejecutar sin(pi) no has obtenido 0 (que es la respuesta exacta)sino

gt sin(pi)[1] 1224606e-16

La notacioacuten que se usa en la respuesta es la forma tiacutepica de traducir la notacioacuten cientiacutefica alos lenguajes de ordenador y calculadoras El siacutembolo 1224606e-16 representa el nuacutemero

1224606 middot 10minus16

de manera que el nuacutemero -16 que sigue a la letra e en esta representacioacuten es el exponentede 10 (tambieacuten llamado orden de magnitud) mientras que el nuacutemero 1224606 se denominaa veces mantisa Puedes leer maacutes sobre la notacioacuten cientiacutefica en este artiacuteculo de la Wikipedia

5

httpeswikipediaorgwikiNotacioacuten_cientiacutefica

En cualquier caso el exponente -16 nos indica que se trata de un nuacutemero extremadamentecercano a 0 Fiacutejate en cambio que si usas 314 como aproximacioacuten de π la respuesta aunquepequentildea es todaviacutea del orden de mileacutesimas

11 Algunos detalles de la interfaz de RStudioAntes de avanzar maacutes queremos ocuparnos de algunos aspectos del trabajo con RStudio que amenudo causan algunos quebraderos de cabeza a quienes se inician en el uso del programa

Comandos incompletos

Para ver un ejemplo prueba a escribir en el prompt activo esta operacioacuten evidentemente incom-pleta

3

y pulsa Entrar La respuesta de R es un siacutembolo +

gt 3+

que en este caso no tiene nada que ver con la suma Es la forma que tiene R de decirnos ldquonecesitoalgo maacutesrdquo Cuando R se encuentra con una expresioacuten que considera no erroacutenea sino incompleta(por ejemplo con un pareacutentesis abierto al que corresponde un pareacutentesis cerrado) entonces nos locomunica con este siacutembolo + Y al hacerlo nos da la oportunidad en casos como este de corregirel error completando la expresioacuten incompleta Asiacute que si ahora junto al siacutembolo + escribes 2 deesta forma

gt 3+ 2

y pulsas Entrar veraacutes que R ha entendido la expresioacuten completa 32 y nso devuelve la respuesta

gt 3+ 2[1] 6

En alguacuten momento no obstante ese siacutembolo + de los comandos incompletos se convertiraacute en uninconveniente Imagiacutenate por ejemplo que queriacuteas multiplicar 5 middot7 pero que por error has tecleadola expresioacuten

57-

y has pulsado Entrar antes de darte cuenta del error En tal caso R piensa que esa expresioacuten estaacuteincompleta y vuelve a aparecer el signo +

gt 57-+

iexclPero ahora no queremos antildeadir nada En este caso podriacuteas antildeadir un 0 sin que eso afectara elresultado pero habraacute maacutes adelante muchos casos en los que no hay una solucioacuten sencilla evidenteiquestCoacutemo salimos del paso Simplemente pulsamos la tecla Esc (escape) con lo que R interrumpe elcomando y nos devuelve a un nuevo prompt activo sin calcular nada

Navegando el historial de comandos

En un caso como el que hemos descrito no supone un problema volver a teclear la expresioacutenevitando el error que habiacuteamos cometido Pero en ocasiones si hemos escrito una expresioacuten real-mente complicada y por ejemplo hemos tecleado un pareacutentesis de maacutes en medio de la expresioacutenseguramente prefeririacuteamos no tener que volver a teclear la expresioacuten completa Un remedio ldquocaserordquoconsiste en seleccionar y copiar la expresioacuten erroacutenea pegarla en el prompt activo y editarla ahiacutepara corregir el errorHay una segunda manera de conseguir el mismo efecto Otra caracteriacutestica interesante de la Consolade Comandos es que si te situacuteas en el prompt activo y pulsas las teclas con flechas arriba o abajoveraacutes pasar la lista completa de comandos que has ejecutado desde el principio de la sesioacuten detrabajo Prueba a hacerlo ahora para ver como funciona Si has ejecutado todos los comandosque hemos ido describiendo en este tutorial puedes pulsar la flecha uarr repetidamente e iraacutes viendopasar todos esos comandos hasta llegar al

6

3^2

con el que hemos empezado Y con la flecha hacia abajo recorres la lista en sentido contrario hastael comando de ejecucioacuten maacutes reciente Esa lista de comandos es el Historial de Comandos Usandolas flechas arriba y abajo puedes recorrer el Historial de Comandos detenerte en cualquier puntomodificar ese comando si lo deseas y despueacutes ejecutarlo (con o sin modificaciones) Al principiopuede que te cueste un poco acostumbrarte pero una vez que te habituacutees a esta herramientala encontraraacutes sin duda muy uacutetil El Historial de Comandos que puedes recorrer con las flechasarriba y abajo se limita a la sesioacuten de trabajo actual Pero si miras en el panel superior derecho deRStudio veraacutes una pestantildea titulada History que se muestra en esta figura

El Historial de Comandos que aparece en ese panel refleja tus comandos de esta y anterioressesiones Si esta es tu primera sesioacuten de trabajo con R ambos coincidiraacuten claro estaacute Pero a medidaque vayas abriendo RStudio en diacuteas sucesivos te puede resultar muy uacutetil localizar por ejemploun comando que usaste hace dos sesiones pero que no recuerdas exactamente Los comandos queaparecen en ese panel se pueden copiar y pegar en la Consola de Comandos o de forma maacutes directapuedes seleccionar uno de ellos con el ratoacuten y pulsar en el botoacuten To Console que hemos destacadoen la Figura

111 Errores

Los errores son inevitables y nos conviene estar preparados para su aparicioacuten Dependiendo delmotivo del error R nos informaraacute con distintos tipos de mensajes Asiacute que vamos a ver algunosejemplos para conocer la terminologiacutea asociadaPara empezar este es el mensaje de error que obtenemos tras ejecutar una expresioacuten sin sentido

gt 43Error unexpected rsquorsquo in 4

Los mensajes de error aparecen en color rojo en RStudio Este mensaje de error en particulares bastante faacutecil de entender R simplemente se queja de que esta expresioacuten es defectuosa Noincompleta como alguna que hemos visto antes Es imposible completar esta expresioacuten de formacorrectaVeamos otro tipo de mensaje de error Ya sabes que no se puede dividir por 0 Si lo intentamos enR

gt 20[1] Inf

7

el siacutembolo Inf (de infinito) nos avisa del problema Ese siacutembolo tambieacuten puede aparecer con signomenos si por ejemplo tratas de calcular el logaritmo neperiano de 0 En R el logaritmo neperianoes la funcioacuten log asiacute que seriacutea

gt log(0)[1] -Inf

En ambos casos R no lanza un mensaje de error pero utiliza el siacutembolo de infinito porque asiacute nosproporciona maacutes informacioacuten matemaacutetica sobre lo que ha ocurrido Tambieacuten puede suceder queel siacutembolo Inf aparezca como resultado intermedio en una expresioacuten En ese caso R aplica unasreglas sencillas de aritmeacutetica con infinitos para tratar de darnos la respuesta maacutes coherente desdeel punto de vista matemaacutetico Por ejemplo si calculas

3(-5(4-2^2))

Entonces R empieza calculando el resultado del pareacutentesis 4-2ˆ2 que es 0 Asiacute que al dividir minus5entre 0 R obtiene -Inf y finalmente al calcular 3(-Inf) se obtiene -Inf como valor de laexpresioacuten Comprobeacutemoslo

gt 3(-5(4-2^2))[1] -Inf

A pesar de que R no lanza mensajes de error estaacute claro que en la mayoriacutea de los casos no esdeseable que nuestros caacutelculos produzcan Inf como resultado en ninguna etapaEn otros casos el problema es diferente Por ejemplo si tratas de calcular la raiacutez cuadrada de unnuacutemero negativo

gt sqrt(-4)[1] NaNWarning messageIn sqrt(-4) NaNs produced

En este caso obtenemos una respuesta NaN y ademaacutes una advertencia (warning) sobre la aparicioacutende esa respuesta El siacutembolo NaN es la abreviatura de Not a Number es decir ldquono es un nuacutemerordquo Estaes la respuesta que obtendremos cuando tratamos de hacer operaciones como esta que producencomo resultado un nuacutemero complejo R es capaz de trabajar con los nuacutemeros complejos pero comono los vamos a necesitar en el curso no nos ocuparemos de esto Para que veas otro ejemplo esarespuesta NaN aparece tambieacuten si tratamos de ir demasiado lejos con la aritmeacutetica con infinitos

gt (10)+log(0)[1] NaN

En este caso R se ha encontrado en un paso intermedio con Inf - Inf y su respuesta ha sido NaN

En cualquier caso y como resumen final tenemos que tratar de evitar que nuestros caacutelculos con-duzcan a este tipo de expresiones

Haciendo limpieza en la Consola de Comandos

Si has seguido todas las instrucciones hasta aquiacute tu Consola de Comandos seguramente empiezaa estar llena de comandos y algunos pueden quedar ocultos en la parte superior Naturalmentepuedes usar las barras de desplazamiento para moverte por la Consola Pero en sesiones largas detrabajo o cuando hemos terminado de hacer pruebas y queremos ejecutar una versioacuten definitivade nuestro trabajo es normal que queramos hacer limpieza en la Consola Eso se consigue con lacombinacioacuten de teclas Ctrl + L iexclCuidado Es un proceso no reversible podraacutes seguir navegandoel Historial de Comandos con las teclas arriba y abajo pero para recuperar los resultados tendraacutesque ejecutar de nuevo los comandosMaacutes adelante aprenderemos formas de guardar nuestro trabajo de una manera maacutes eficiente Perote podemos adelantar que puesto R se maneja escribiendo comandos bastaraacute con guardar esoscomandos en ficheros de texto plano Ahora vamos a cambiar de tema y para empezar desde cerovamos a cerrar RStudio para eliminar las trazas del trabajo que hemos hecho

2 Variables y vectoresVuelve a abrir RStudio para continuar el trabajo En la seccioacuten previa hemos usado R como unacalculadora Pero para ir maacutes allaacute tenemos que disponer de estructuras de datos Ese teacutermino

8

describe en Computacioacuten las herramientas que nos permiten almacenar y procesar informacioacutenLas estructuras de datos maacutes baacutesicas de R son las variables y los vectores En proacuteximos tutorialesnos iremos encontrando con otras estructuras de datos matrices dataframes listas entre otras

21 Variables en RUna variable en R es un siacutembolo que usamos para referirnos a un valor Por ejemplo si te situacuteasen la Consola de Comandos tecleas

a = 2

y ejecutas esa instruccioacuten entonces aunque aparentemente no ha sucedido nada (porque no hayrespuesta) a partir de ese momento R ha asignado el valor 2 al siacutembolo a Asiacute que si por ejemplotecleas y ejecutas

a + 1

obtendraacutes como respuesta 3

Ejercicio 2iquestQueacute se obtiene al ejecutar estos comandos uno detraacutes de otro iquestCuaacutento valen las variables a by c al final

a = 2b = 3c = a + ba = b cb = (c - a)^2c = a b

La solucioacuten estaacute en la paacutegina 47 iexclNo la mires antes de intentar pensar el ejercicio por ti mismo

En el Capiacutetulo 1 del libro hemos hablado de variables cualitativas y cuantitativas Estas uacuteltimastoman siempre valores numeacutericos y las variables de R sirven desde luego para almacenar esa clasede valores Pero como iremos viendo en sucesivos tutoriales tambieacuten se pueden utilizar variablesde R para guardar valores de variables cualitativas (factores) y otros tipos de objetos que iremosconociendo a lo largo del curso De momento para que veas a que nos referimos recordaremos elEjemplo 111 del libro (paacuteg 6) en el que teniacuteamos una variable cualitativa ordenada que representael pronoacutestico de un paciente que ingresa en un hospital Prueba a ejecutar este coacutedigo

pronostico = Leve

simplemente para que de momento veas que

R no protesta El valor Leve es un valor perfectamente aceptable

En R los valores que representan palabras frases o como las llamaremos teacutecnicamente cadenasalfanumeacutericas se escriben siempre entre comillas Puedes usar comillas simples o dobles perote aconsejamos que uses dobles comillas

La relacioacuten entre factores y valores alfanumeacutericos en R es algo maacutes complicada de lo que estesencillo ejemplo parece sugerir Pero ya tendremos ocasioacuten en futuros tutoriales de extendernossobre eso

Asignaciones

Las instrucciones como

a = 2

o como

b = (c - a)^2

se denominan asignaciones En la primera por ejemplo decimos que hemos asignado el valor 2a la variable aQueremos advertir al lector de que en R hay otra forma esencialmente equivalente de escribir lasinstrucciones y que de hecho se usa mayoritariamente En lugar del siacutembolo = puedes conseguirel mismo efecto escribiendo lt- (el signo ldquomenorrdquo seguido sin espacios de un signo ldquomenosrdquo) Asiacuteque si ejecutas

9

a lt- 2

el resultado seraacute el mismo que antes con = Las dos notaciones tienen ventajas e inconvenientes peronosotros preferimos = porque se parece maacutes a lo que se utiliza en muchos lenguajes de programacioacuten

Coacutemo ver los resultados de un caacutelculo a la vez que lo hacemos

Ya habraacutes notado que al hacer una asignacioacuten R no produce ninguna respuesta y se limita aguardar el valor en la variable En una asignacioacuten como a=2 esto no genera ninguna duda Perosi el miembro derecho de la asignacioacuten es una expresioacuten maacutes complicada puede ser convenientepedirle a R que nos muestre el resultado de esa expresioacuten a la vez que se hace la asignacioacutenImagiacutenate por ejemplo esta situacioacuten

b = 2c = -2d = -4a = b c^2 d + 3

iquestCuaacutel es el valor que se asigna a la variable a Una forma de averiguarlo es simplemente ejecutaruna liacutenea adicional en la que aparece soacutelo el nombre de la variable que queremos inspeccionar Alejecutar esta sentencia R nos devuelve como respuesta

gt a[1] 1

Pero hay otra manera de conseguir que R nos muestre el resultado de la asignacioacuten que es maacutesinteresante porque produce coacutedigo maacutes simple Basta con encerrar toda la asignacioacuten entre pareacuten-tesis El resultado es

gt ( a = b c^2 d + 3 )[1] 1

como antes Este ejemplo es desde luego bastante artificial Te recordamos en cualquier caso laconveniencia de utilizar pareacutentesis para hacer maacutes legibles las expresiones y evitar posibles erroresPero a la vez la posibilidad de comprobar el resultado de las asignaciones aumenta la fiabilidaddel coacutedigo que escribimos

Nombres de las variables

Aunque hasta ahora hemos usado letras como nombres de las variables puedes utilizar nombresmaacutes descriptivos Y muchas veces es una buena idea hacerlo Por ejemplo puede que hace unasemana hayas escrito estas instrucciones para resolver un problema

a = 2b = 3c = a b

Pero si las vuelves a ver pasada una semana es posible que no recuerdes queacute era lo que estabastratando de conseguir al hacer esto En cambio al ver estas instrucciones

espacio = 2tiempo = 3velocidad = espacio tiempo

es mucho maacutes faacutecil reconocer el objetivo que persiguen A lo largo de los tutoriales del curso vamos ainsistir muchas veces en la necesidad de que el coacutedigo esteacute bien organizado y esteacute bien documentadoUn primer paso en esa direccioacuten es tratar de elegir nombres descriptivos para las variables En Rlas reglas para los nombres de variables son muy flexibles esencialmente que empiecen por unaletra y no contengan espacios ni caracteres especiales como + pareacutentesis etceacutetera Pero cuidadocon los excesos Es cierto que puedes usar nombres de variables arbitrariamente largos Pero si usascomo nombre

Estavariablealmacenaelresultadodelaoperaciontaninteresantequeacabamosdehacer

tu trabajo resultaraacute ilegible Como siempre se necesita un equilibrio y con la praacutectica encontraraacutesel tuyo (consejo zen gratuito del tutorial de hoy) Para empezar es una buena idea combinarmayuacutesculas y minuacutesculas en los nombres de las variables Si vas a usar una variable para representarla temperatura final de un proceso el nombre temperaturafinalproceso es menos legible y maacuteslargo que tempFinal Es mucho maacutes faacutecil por otra parte que te equivoques tecleando el primerode esos nombres

10

22 VectoresEn Estadiacutestica lo habitual es trabajar con colecciones o muestras de datos Y para almacenar esascolecciones de datos la estructura maacutes baacutesica de R son los vectores En este apartado vamos aempezar nuestro trabajo con ellos aunque a lo largo del curso auacuten tendremos ocasioacuten de aprenderbastante maacutes sobre el manejo de los vectores de RPara empezar vamos a trabajar con vectores que contienen una coleccioacuten de nuacutemeros que puedenser las edades de los alumnos de una clase

22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19

En R las listas de nuacutemeros como esta se almacenan en vectores El vector que corresponde a esasedades se construye en R mediante un comando como este

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19)

En realidad en esa expresioacuten hemos hecho dos cosas

1 Hemos creado el vector con los datos en la parte derecha de la expresioacuten

c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19)

Los datos estaacuten separados por comas y rodeados por pareacutentesis Hasta aquiacute todo es bastantetiacutepico pero fiacutejate especialmente en la letra c que precede al primer pareacutentesis Esa letra ces el nombre de una nueva funcioacuten de R y es la forma maacutes sencilla que existe en R paracrear un vector de datos Podriacutea pensarse que la c es de crear pero en realidad proviene deconcatenar Enseguida entenderemos porque es asiacute

2 Una vez creado el vector lo hemos asignado a la variable edades Hasta ahora soacutelo habiacuteamosusado variables para identificar un uacutenico valor (un nuacutemero o una cadena alfanumeacuterica)Pero una variable puede usarse para identificar un vector o como veremos maacutes adelanteestructuras mucho maacutes complejas

Una observacioacuten maacutes los vectores de R se usan para almacenar valores de una variable Y enparticular todos los datos de un vector son del mismo tipo de variable No se puede mezclar en unvector nuacutemeros y cadenas alfanumeacutericas (aparentemente R te dejaraacute hacerlo pero internamentehabraacute convertido todos los nuacutemeros en cadenas alfanumeacutericas)

Manos a la obra Prueba a copiar el comando anterior en tu Consola de comandos (puedes usarcopiar y pegar desde este fichero) y ejecuacutetalo Si las cosas van bien no esperes ninguna respuestacomo ya hemos dicho R no te muestra el resultado de las asignaciones Recuerda que si quieresver el resultado de una asignacioacuten puedes rodear toda liacutenea con pareacutentesis como en

(edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19))

Otra opcioacuten naturalmente es preguntarle a R por el valor de edades despueacutes de la asignacioacutenEscribe simplemente edades en la Consola de Comandos y ejecuacutetalo Veraacutes de nuevo el contenidode esa variable

Vamos a hacer algunas operaciones con este vector Imagiacutenate que como sucede a menudo despueacutesde haber creado nuestra lista de edades de alumnos desde la administracioacuten nos avisan de que haycinco alumnos nuevos recieacuten matriculados y debemos incorporar sus edades que son

22 18 20 21 20

a nuestro vector de datos Naturalmente podemos empezar de nuevo pero es preferible reutilizarel vector edades que ya habiacuteamos creado Vamos a ver esto como primer ejemplo para empezar aaprender coacutemo se manipulan vectores en R Una forma de antildeadir los datos es empezar creando unnuevo vector (con la funcioacuten c de R)

(edades2 = c(22 18 20 21 20))

Y a continuacioacuten concatenamos los vectores usando de nuevo la misma funcioacuten c de una maneradistinta

(edades = c( edades edades2))

11

Hemos rodeado toda la liacutenea con pareacutentesis para ver el resultado y poder observar coacutemo hacambiado el vector edadesVamos a analizar paso a paso lo que ha ocurrido

La instruccioacuten c( edades edades2) toma los datos contenidos en edades y edades2 y losconcatena en ese orden para fabricar un nuevo vector que todaviacutea no estaacute guardado enninguna variable

La asignacioacuten edades = c( edades edades2) toma ese vector y lo guarda en la propiavariable edades Al hacer esto como era de esperar el anterior vector edades es reemplazadocon la nueva lista y su contenido anterior se pierde (cuidado con esto las reasignaciones sonuna de las formas habituales de cometer errores)

El nombre de la funcioacuten c proviene en realidad de concatenate concatenar en ingleacutesLa siguiente figura resume lo que hemos venido haciendo con estos datos

Los nuacutemeros entre corchetes al principio de cada fila como el [1] y el [16] de este ejemploson soacutelo ayudas para que podamos localizar los elementos del vector En mi pantalla la primerafila muestra los primeros 15 nuacutemeros del vector Pero en la tuya si la ventana de RStudio es dedistinta anchura los nuacutemeros entre corchetes pueden ser distintos Hasta ahora soacutelo habiacuteamos vistoejemplos con [1] que es lo que sucede cuando la respuesta es un vector que cabe en una uacutenicaliacutenea

3 Ficheros csv con REn esta seccioacuten vamos a aprender a utilizar ficheros csv con R En el Tutorial-01 hemos vistoalgunos ejemplos de ese tipo de ficheros y el manejo baacutesico con una hoja de caacutelculo como CalcComo vimos alliacute un fichero csv tiacutepico contiene una tabla de datos con varias columnas Esaestructura de tabla se haraacute imprescindible maacutes adelante Pero durante una buena parte del cursonosotros nos vamos a limitar a problemas en los que interviene una uacutenica variable En tal casopara almacenar los datos de esa variable nos podemos a limitar a considerar un tipo de ficheroscsv muy baacutesico como el fichero adjunto

Guaacuterdalo en la subcarpeta datos de tu directorio de trabajo (el que contiene este pdf) Si lo abrescon un editor de texto (como el Bloc de Notas en Windows) veraacutes como muestra esta figura

12

61371381381381391391351381371381371371361361371351381391341371351371371351391341371371371381351381391371341361361361391381361371361371361361381361351351361361381351381351391371361391351371381381371310137138137135136138138137133135136137135137137135138134138138138136137136136138135136135138136139137

que el fichero contiene soacutelo una columna de datos que en este ejemplo corresponde a valores deuna variable cuantitativa discreta En la figura soacutelo se muestra una parte de los datos

Ejercicio 3iquestCuaacutentos datos hay en ese vector Usa Calc para averiguarlo pronto aprenderemos a hacerlo conR Solucioacuten en la paacutegina 47

Queremos utilizar esos datos en R y para eso vamos a (1) leerlos desde el fichero y (2)guardarlos enun vector El resultado seraacute como si nosotros hubieacuteramos creado ese vector tecleaacutendo sus elementosdirectamentePara el primer paso (la lectura del fichero csv) vamos a tener que empezar por explicarle a R(usando RStudio como intermediario) donde estaacute el fichero que contiene esos datos Cuando tra-bajamos con ficheros R utiliza un directorio de nuestro ordenador como directorio de trabajo Acontinuacioacuten vamos a aprender a elegir un directorio de trabajo Puedes usar cualquier carpeta yen lo que sigue vamos a suponer que hemos elegido el Escritorio Lo maacutes importante es que esacarpeta debe contener a su vez una subcarpeta llamada datos Y aseguacuterate de que los ficheroscsv que vas a usar estaacuten almacenados en esa subcarpeta llamada datos

Usamos el menuacute Session rarr Set Working Directory rarr Choose Directory

Se abre un cuadro de diaacutelogo del sistema y navegamos hasta la carpeta que contiene el ficherocsv que en mi caso es el Escritorio Cuando selecciono el Escritorio veo aparecer en la Consolade Comandos de R un comando que RStudio ha escrito y ejecutado por nosotros

13

setwd(CUsersFernandoDesktop)

Este es el resultado en mi ordenador (de ahiacute el nombre de usuario) usando Windows 10 Enversiones maacutes antiguas de Windows o en una maacutequina con Linux o un Mac el comando seraacuteligeramente distinto Cuando tengamos maacutes praacutectica aprenderemos otras formas de seleccionar eldirectorio de trabajo o incluso de utilizar ficheros situados fuera de ese directorio de trabajo Peropor el momento resulta maacutes coacutemodo dejar que RStudio haga ese trabajo para nosotrosAhora R ya sabe doacutende estaacute el fichero que nos interesa pero todaviacutea no sabe cual es Para ello vamosa utilizar la funcioacuten readtable de R Aunque esta funcioacuten tiene muchas opciones disponiblesnuestro primer uso de ella seraacute bastante sencillo Copia y ejecuta el siguiente coacutedigo en RStudio

(vectorEdades = readtable(datosTut02-Edadescsvheader = FALSE)[1])

En esta instruccioacuten le decimos a R que use la funcioacuten readtable para leer el contenido del ficheroTut02-Edadescsv y que almacene lo que ha leiacutedo en un vector que hemos decidido llamarvectorEdades Y aunque no es necesario entender en detalle el funcionamiento de readtable eneste momento vamos a explicar un poco maacutes lo que hemos hecho A medida que el curso avanceiraacutes teniendo maacutes ocasiones de practicar esto e iraacute quedando cada vez maacutes claroLa opcioacuten header = FALSE sirver para indicarle a R que la tabla almacenada en el fichero no tieneuna liacutenea de cabecera (en ingleacutes header) que cuando existe suele contener los nombres de lasvariables de la tabla Ademaacutes la funcioacuten readtable sirve para leer tablas con varias columnasobteniendo como resultado un objeto de R de tipo dataframe Pero nuestro primer ejemplo esmuy sencillo y la tabla soacutelo tiene una columna Asiacute que usamos la notacioacuten [1] para indicarle aR que soacutelo queremos la primera columna de esa tabla considerada como un vectorAl ejecutar esa orden habraacutes obtenido una respuesta como esta

gt gt (vectorEdades = readtable(datosTut02-Edadescsv header = FALSE)[1])[1] 6 7 8 8 8 9 9 5 8 7 8 7 7 6 6 7 5 8 9 4 7 5 7[24] 7 5 9 4 7 7 7 8 5 8 9 7 4 6 6 6 9 8 6 7 6 7 6[47] 6 8 6 5 5 6 6 8 5 8 5 9 7 6 9 5 7 8 8 7 10 7 8[70] 7 5 6 8 8 7 3 5 6 7 5 7 7 5 8 4 8 8 8 6 7 6 6[93] 8 5 6 5 8 6 9 7

Como hemos dicho antes los nuacutemeros entre corchetes al principio de cada fila que en mi casoson [1] [24] [47] [70] y [93] son soacutelo ayudas para que podamos localizar los elementos delvector En mi pantalla cada primera fila muestra 23 nuacutemeros del vector Pero en la tuya si laventana de RStudio es de distinta anchura los nuacutemeros entre corchetes pueden ser distintos

En cualquier caso ahora el vector vectorEdades contiene la informacioacuten del fichero csv con el quehemos empezado En la Seccioacuten 4 vamos a empezar a hacer Estadiacutestica Descriptiva Pero antes tepedimos un poco maacutes de paciencia porque vamos a entretenernos un poco maacutes en los detalles delmanejo de ficheros csv con R No pretendemos ser exhaustivos ni mucho menos pero siacute queremosaprender lo suficiente como para evitarnos los problemas maacutes habituales en los casos maacutes sencillosPara cerrar este apartado es conveniente haber visto el error que se produce cuando el fichero quetratamos de leer desde R no existe o no estaacute en el directorio de trabajo

Ejercicio 4Prueba a ejecutar

errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)

y fiacutejate en el mensaje de error Solucioacuten en la paacutegina 47

Otra variante del fichero de entrada

Los ficheros csv que contienen un uacutenico vector (en lugar de una tabla de datos) pueden adoptarformatos distintos del que acabamos de ver Por ejemplo el fichero adjunto

contiene los mismos datos que Tut02-Edadescsv pero ahora los datos del vector estaacuten todos enuna fila y separados por comas Guaacuterdalo como antes en la subcarpeta datos El aspecto delfichero visto a traveacutes de un editor de texto es este (soacutelo son visibles una parte de los datos)

14

67888995878776675894757759477785897466698676766865566858597695788710787568873567577584888676685658697

Desde luego no nos podemos plantear transformar a mano este vector en uno como el anteriorLa solucioacuten que te proponemos pasa por la hoja de caacutelculo y la opcioacuten de trasponer una tablaque hemos visto en el Tutorial-00 lo leeriacuteamos en una fila de la hoja y luego habriacutea que usar elPegado especial para trasponerlo -es decir girarlo- para finalmente volver a guardarlo Alterna-tivamente hay otras soluciones sin salir de R usando una funcioacuten llamada scan o usando de nuevoreadtable y trasponiendo la tabla dentro de R Esos meacutetodos son sencillos cuando se aprendeun poco maacutes sobre R pero por el momento y para los ejemplos sencillos que encontraremos nosvamos a conformar con ese enfoque baacutesico que usa la hoja de Caacutelculo si es necesario

31 Coacutemo obtener ayuda y usar el tabulador en RStudioVamos a aprovechar estos ejemplos de lectura de ficheros csv para aprender a obtener ayuda sobrelas funciones de R La mayoriacutea de las funciones de R como la funcioacuten readtable o la funcioacutenscan que hemos mencionado al final del anterior apartado tienen muchos argumentos opcionalesY hay muchiacutesimas funciones en R (cada vez maacutes porque como veremos maacutes adelante usuarios detodo el mundo antildeaden constantemente funciones nuevas a R cuando las necesitan) No es posiblerecordar todos esas funciones cada una con sus opciones asiacute que es muy importante aprender aobtener esa informacioacuten cuando la necesitamosPara ver como obtener esa informacioacuten en RStudio vamos a usar por ejemplo la funcioacuten scanSituacuteate en una liacutenea vaciacutea de la Consola de Comandos escribe scan y a continuacioacuten mientras elcursor parpadea junto a la n final de scan pulsa la tecla del tabulador (si esto no funciona usa latecla F1 y mira el panel ayuda de RStudio) Veraacutes aparecer una ventana emergente con informacioacutensobre la funcioacuten scan como en esta figura

15

Como ves se muestra un resumen sobre la funcioacuten scan que a veces seraacute suficiente Si necesitasmaacutes detalles haz caso a la indicacioacuten que aparece al final de esa ventana y pulsa la tecla F1 Alhacerlo veraacutes que en el panel inferior derecho de RStudio aparece el fichero de ayuda de la funcioacutenscan como en esta figura

Esos ficheros de ayuda son muy uacutetiles aunque al principio pueden resultar un poco intimidatoriosya sea por un exceso de informacioacuten ya sea porque se da por supuesto que el usuario ya entiendealgunos conceptos baacutesicos de R Podemos garantizar al lector que a medida que se progresa en Rla utilidad de estos ficheros aumentaPero la utilidad de la tecla tabulador en RStudio no se acaba ahiacute Supongamos que quieres aplicarreadtable para leer el fichero Tut02-Edadescsv Pero te da pereza escribir un nombre tan largoo no recuerdas exactamente el nombre o dudas entre dos nombres no importa cual sea el motivoEmpiezas a escribir la orden tecleas

(vectorEdades2 = readtable(datos

y de nuevo justo en este punto pulsas el tabulador Entonces RStudio te ofrece en una nuevaventana emergente todos los ficheros disponibles en la carpeta datos

Y ahora puedes usar esa lista seleccionar el fichero que quieras utilizar Puedes tambieacuten teclearalguna letra maacutes del nombre para acotar auacuten maacutes la buacutesqueda cuando la carpeta contiene muchosficherosEn general la idea es que en RStudio el tabulador es tu amigo Como tendremos ocasioacuten decomprobar RStudio nos ofrece bastante ayuda para hacer maacutes coacutemodo nuestro trabajo con R yel tabulador es una de las herramientas maacutes versaacutetiles y uacutetiles

16

32 El camino contrario escribir un vector a un fichero de tipo csvHemos aprendido a leer con R vectores de datos a partir de ficheros de tipo csv Pero muchasveces despueacutes de hacer operaciones en R obtendremos como resultados nuevos vectores (y maacutesadelante en el curso otro tipo de objetos) Lo natural entonces es aprender a guardar ese vectoren un fichero de tipo csv como el fichero con el que empezamos De esa forma por ejemplo puedescompartir tus resultados con otras personas que utilicen programas distintos de R Para ello siantes usaacutebamos la funcioacuten readtable ahora vamos a usar la funcioacuten writetable de R

Como ejemplo vamos a utilizar este vector de nuacutemeros enteros

29 17 63 31 55 9 92 61 10 16 63 6 61 59 66 41 68 6 99 21 87 68 52 83 66 98 45 5024 100 83 37 44 4 97 67 56 74 75 71 55 22 86 22 93 65 38 84 54 83 100 71 99 1963 11 11 62 91 20 79 42 59 95 70 74 8 25 45 58 57 75 81 34 70 68 39 12 14 21

Ejercicio 5Usa copiar y pegar a partir de este documento pdf para crear un vector de R llamado muestraque contenga esos datos

Para guardar ese vector muestra en un fichero csv (dentro de la subcarpeta datos del directoriode trabajo) podemos utilizar la funcioacuten writetable usando como argumentos

El nombre del vector que queremos guardar que es muestra

Y el nombre del fichero en el que lo guardamos Vamos llamarlo por ejemplo Tut02-muestracsvLe indicamos a R ademaacutes que lo ponga en la subcarpeta datos

La opcioacuten colnames = FALSE o colnames = TRUE para decidir si queremos que R incluyauna liacutenea de cabecera con el nombre de la variable que en este caso es muestra (y que novamos a incluir)

La opcioacuten rownames = FALSE para evitar que R incluya nuacutemeros de fila en el fichero desalida (normalmente no querremos esos nuacutemeros)

Es decir que ejecutamos

writetable(muestrafile = datosTut02-muestracsv colnames=FALSE rownames=FALSE)

Al ejecutar esa orden el fichero que obtenemos tiene la forma deseada (de nuevo soacutelo es visible elcomienzo del fichero)

17

Puedes probar a abrirlo en Calc para ver que es un fichero de datos como los que hemos visto hastaahora

Naturalmente apenas hemos rozado el tema de la entradasalida de datos en R Pero con lo quehemos aprendido en este apartado estamos listos para empezar a hacer Estadiacutestica Descriptivausando ejemplos que no sean demasiado triviales

4 Estadiacutestica descriptiva de una variable cuantitativa condatos no agrupados

Para seguir adelante tenemos que empezar por aprender un poco maacutes sobre la forma en la que Rpermite operar con los vectores Vamos a hacerlo a traveacutes de una serie de ejercicios-ejemplos

Ejercicio 6

1 Vamos a definir dos vectores cada uno de ellos con 12 nuacutemeros enteros El primero al quellamaremos vector1 estaacute formado por

8 5 19 9 17 2 28 18 3 4 19 1

Usa copiar y pegar a partir de este fichero pdf para definir el vector1 en R

2 El segundo vector al que en un rapto de originalidad llamaremos vector2 estaacute almacenadoen el fichero

Guaacuterdalo en datos y examiacutenalo primero con un editor de texto (como el Bloc de Notas)para ver coacutemo estaacuten almacenados los datos en ese fichero Una vez hecho esto usa Calc yla funcioacuten readtable para almacenar el contenido de ese fichero csv en el vector2 de REn alguacuten momento del proceso puede que tengas que usar el pegado especial de Calc paratrasponer los datos

Solucioacuten en la paacutegina 47

41 Aritmeacutetica vectorial en RAhora vamos a sumar los dos vectores Ejecuta el comando

vector1 + vector2

para comprobar que el resultado es la suma componente a componente de los dos vectores

gt vector1 + vector2[1] 26 23 39 21 37 3 58 24 29 24 34 26

Este resultado es bastante previsible Lo que quizaacute resulteacute un poco maacutes inesperado es que simultiplicas los dos vectores tambieacuten se obtienen los productos componente a componente el primerelemento de vector1 se multiplica por el primero de vector2 el segundo por el segundo etc

gt vector1 vector2[1] 144 90 380 108 340 2 840 108 78 80 285 25

Esta forma de operar de R como veremos pronto es muy uacutetil Si lo piensas un momento cadavector numeacuterico de R se corresponde con una columna de una hoja de caacutelculo como las queusaacutebamos en el Tutorial01 Alliacute vimos que para algunas operaciones era necesario multiplicar doscolumnas elemento a elemento En Calc esa operacioacuten no es complicada pero en R es auacuten maacutes faacutecilBasta con un comando como vector1 vector2 para conseguir el objetivo Veremos muchos maacutesejemplos a lo largo del curso en los que una operacioacuten que en Calc requeririacutea bastantes pasosen R se reduce a ejecutar un uacutenico comandoEn R las operaciones con vectores siguen en general este esquema de funcionamiento componentea componente Si por ejemplo ejecutas

18

1818201220130626201525

gt vector1 + 5[1] 13 10 24 14 22 7 33 23 8 9 24 6gt 2 vector1[1] 16 10 38 18 34 4 56 36 6 8 38 2

veraacutes que en el primer caso cada uno de los elementos de vector1 se ha incrementado en 5mientras que en el segundo caso cada uno se ha multiplicado por 2 Sucede lo mismo con otrasoperaciones como elevar al cuadrado

gt vector1^2[1] 64 25 361 81 289 4 784 324 9 16 361 1

Y podemos aplicar funciones en un solo paso Por ejemplo podemos calcular el logaritmo neperianode todos los elementos de un vector en un soacutelo paso

gt log(vector1)[1] 20794415 16094379 29444390 21972246 28332133 06931472[7] 33322045 28903718 10986123 13862944 29444390 00000000

Los resultados de todas estas operaciones son de nuevo vectores Y por tanto se pueden asignara nuevas variables para utilizarlos en nuestras operaciones Por ejemplo si luego vas a necesitar loslogaritmos de vector1 puedes definir una variable para identificar ese vector llamada logVector1(e el nombre que tuacute quieras) haciendo

gt logVector1 = log(vector1)

Recuerda que si ademaacutes de la asignacioacuten quieres ver el resultado puedes rodear toda esta senten-cia con pareacutentesis De lo contrario R la ejecuta pero no imprime ninguna respuesta como ya sabes

Aunque al principio puede parecer complicado cuando te acostumbres a esta forma de trabajarcon vectores veraacutes que resulta muy coacutemoda y eficiente

Generando vectores de nuacutemeros enteros consecutivos

Hay muchas ocasiones en que para alguna operacioacuten necesitamos un vector que contenga losnuacutemeros enteros consecutivos del 1 al n o del 0 al n etc En R esto es muy faacutecil de hacer Porejemplo para conseguir un vector con los nuacutemeros del 1 al 15 basta con ejecutar

gt 115[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Esa notacioacuten con los dos puntos permite generar vectores en los que cada elemento es igual alanterior maacutes 1 Otro ejemplo

gt -713[1] -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13

O incluso cuando los puntos de partida no son enteros

gt 1575[1] 15 25 35 45 55 65 75gt 1574[1] 15 25 35 45 55 65

iquestVes la diferencia entre estos dos casos

Es muy posible que te esteacutes preguntando iquesty si quiero ir avanzando de 2 en 2 o quiero ir hacia atraacutes(ldquoavanzandordquo de minus2 en minus2 por ejemplo) Pronto cuando hayamos aprendido un poco maacutes volve-remos sobre esto y comprobaremos que R nos ofrece un cataacutelogo de herramientas extremadamentepotentes para fabricar vectores de acuerdo con nuestros deseos y necesidadesLos vectores fabricados con este meacutetodo son vectores iguales que los demaacutes y se pueden asignar avariables operar con ellos etc

19

Ejercicio 7

1 Fabrica un vector con los cuadrados de los nuacutemeros del 1 al 10 y asiacutegnalo a la variablecuadrados Usa los pareacutentesis para ver el resultado de la asignacioacuten

2 Haz lo mismo con los cuadrados de los nuacutemeros del 2 al 11 y un vector cuadrados2

3 Resta los vectores cuadrados2 - cuadrados iquestObservas algo interesante

Solucioacuten en la paacutegina 47

Funciones vectoriales

Hemos visto antes que se puede aplicar una funcioacuten como la raiacutez cuadrada a un vector y seobtiene como resultado otro vector con las raiacuteces cuadradas elemento a elemento Pero hay otrotipo de funciones que permiten hacer caacutelculos con el vector en conjunto Por ejemplo antes hemosfabricado el vector -713 y la funcioacuten length nos dice cuantos elementos tiene ese vector

gt length(-713)[1] 21

En el Ejercicio 3 (paacuteg 13) nos preguntaacutebamos cuantos elementos teniacutea el vector vectorEdades quehabiacuteamos cargado desde el fichero csv Puedes obtener la respuesta con length(vectorEdades)Para comprobarlo aseguacuterate de que has creado el vector llamado vectorEdades y ejecuta estaorden

gt length(vectorEdades)[1] 100

Como ves el resultado de length es el esperado

Vamos a conocer otra funcioacuten llamada sum que sirve para calcular la suma de todos los elementosde un vector

gt sum(vectorEdades)[1] 675

Ejercicio 8iquestCuaacutento vale la suma de los cuadrados de los nuacutemeros del 1 al 100 Solucioacuten en la paacutegina 47

A lo mejor te ha pasado desapercibido pero con las funciones length y sum estamos por fin encondiciones de empezar a hacer Estadiacutestica Descriptiva Por ejemplo podemos calcular la mediaaritmeacutetica de vectorEdades

gt ( mediaEdades = sum(vectorEdades) length(vectorEdades) )[1] 675

Y una vez que tenemos la media podemos calcular la varianza poblacional Para que resulte maacutesclaro vamos a mostrarte el proceso paso a paso aunque al final lo ejecutaremos en un soacutelo paso

1 Empezamos restando la media que estaacute en la variable mediaEdades de cada uno de loselementos de vectorEdades

vectorEdades - mediaEdades

El resultado es un vector de diferencias

2 Ahora elevamos cada una de esas diferencias al cuadrado

( vectorEdades - mediaEdades )^2

El resultado de este paso es de nuevo un vector ahora con las diferencias al cuadrado Fiacutejateen el pareacutentesis para garantizar que elevamos al cuadrado la diferencia Si no incluyeacuteramosel pareacutentesis iquestqueacute calculariacuteamos

20

3 A continuacioacuten sumamos todas esas diferencias al cuadrado usando la funcioacuten sum

sum( ( vectorEdades - mediaEdades )^2)

De nuevo el pareacutentesis es fundamental para que el cuadrado del vector de diferencias secalcule antes que la suma En este paso el resultado ya no es un vector sino un nuacutemero

4 Por uacuteltimo dividimos esa suma por n el nuacutemero de elementos de vectorEdades que seobtiene con la funcioacuten length

sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades)

El resultado de estos pasos se puede condensar en un soacutelo comando de R en el que a la vezcalculamos la varianza y la asignamos a una variable

gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades) )[1] 19875

Ejercicio 9

1 Calcula la desviacioacuten tiacutepica (poblacional) de vectorEdades

2 Calcula la cuasivarianza y cuasidesviacioacuten tiacutepica (muestrales) de vectorEdades

3 iquestQueacute sucede si en el tercer paso ejecutas el siguiente comandosum( vectorEdades - mediaEdades )^2iquestPor queacute sucede esto

Solucioacuten en la paacutegina 48

Con estos caacutelculos hemos empezado a hacer Estadiacutestica con R Naturalmente nos queda muchiacutesimoque aprender sobre los vectores de R Por ejemplo como se accede a una componente individualdel vector para responder a preguntas como ldquoiquestCuaacutento vale el quinto elemento del vectorrdquo Maacutesen general aprenderemos a extraer aquellos elementos del vector que cumplan alguna condicioacutenrespondiendo a preguntas como ldquoiquestQueacute elementos del vector son mayores que 7rdquo

42 Y por fin hagamos Estadiacutestica DescriptivaEn esta seccioacuten vamos a trabajar con un vector de datos contenido en este fichero adjunto

Este vector contiene los datos de la variable var3 del fichero Tut01-PracticaConCalccsv queya hemos utilizado en el Tutorial-00 para aprender a hacer Estadiacutestica Descriptiva con Calc Enesta seccioacuten vamos a reproducir los resultados que obtuvimos alliacute pero esta vez usando R Parapreparar el terreno vamos a hacer limpieza

Ejercicio 10

1 Cierra Rstudio y vuelve a abrirlo para limpiar la memora del sistema El trabajo que hemoshecho hasta ahora se perderaacute (aunque los comandos siguen en el Historial de Comandos queya vimos)

2 Establece el Directorio de Trabajo (por ejemplo el Escritorio) y aseguacuterate de que Tut02-var3csvestaacute guardado en la subcarpeta datos de ese directorio

3 Carga de nuevo el contenido de ese fichero en un vector var3 de R

Solucioacuten en la paacutegina 48

Veraacutes en lo que sigue que siempre que calculamos un objeto le asignamos una variable Eso permiteahorrarse la repeticioacuten innecesaria de caacutelculos si maacutes adelante volvemos a necesitar ese objeto Yen algunos casos como veremos maacutes adelante al hacer esto podemos acceder a propiedades delobjeto calculado que R no muestra en su respuesta por defecto

21

4 138 134 134 135 135 133 136 136 132 134 134 133 133 133 132 136 134 135 132 135 136 135 132 136 134 135 133 134 134 134 1310 136 138 134 135 137 133 135 138 136 137 135 134 137 135 136 138 137 134 133 135 135 134 131 135 137 133 133 137 136 135 135 132 138 135 135 135 136 135 133 1311 136 1310 134 131 133 138 139 135 134 1310 134 134 137 135 134 133 132 135 132 136 135 134 133 139 136 135 134 135 132 132 138 134 133 136 138 134 134 134 138 134 132 135 1310 136 1312 135 139 135 138 138 135 132 135 1310 136 135 136 135 135 137 134 133 134 133 133 134 133 133 133 133 137 138 135 134 135 134 135 137 135 133 134 134 137 133 132 135 137 135 134 136 132 135 132 136 1310 134 132 139 134 136 136 132 137 134 138 135 135 134 134 137 134 136 136 135 134 133 135 133 133 136 132 133 134 138 138 137 137 136 135 1310 134 134 134 138 136 134 136 137 135 135 136 138 134 138 134 135 137 136 134 137 137 135 137 132 136 135 133 135 136 130 133 135 135 137 134 137 131 135 136 135 138 132 134 136 139 137 1310 134 135 136 132 135 135 135 1313 133 136 133 136 135 130 1310 134 136 136 134 131 133 135 137 136 133 135 133 134 132 132 138 138 134 136 135 135 134 133 139 134 139 136 1311 133 132 132 136 138 1310 133 137 133 134 135 139 133 135 133 134 138 139 132 138 133 133 137 138 136 133 135 134 132 1311 137 137 136 134 133 135 1310 135 134 135 133 135 136 135 139 135 134 135 135 134 133 137 134 1310 135 134 132 139 134 137 133 135 134 131 136 135 136 134 138 135 135 138 138 134 132 135 133 134 138 138 135 138 132 1311 135 134 134 136 139 1310 137 134 137 132 133 135 1310 135 135 133 135 136 134 134 136 135 137 136 136 134 133 134 135 132 134 136 139 133 135 133 136 133 133 135 134 134 134 137 135 139 1310 133 134 136 131 137 138 135 133 133 135 133 133 137 136 135 135 138 134 139 136 135 135 138 134 130 133 137 133 134 1311 132 137 133 136 135 133 134 133 133 132 138 133 134 134 134 134 138 138 137 136 132 132 137 135 133 135 138 135 134 135 134 135 134 1312 133 135 133 133 133 132 134 131 139 135 135 135 138 138 135 138 133 134 133 136 136 135 134 133 133 135 133 137 135 132 133 133 132 131 132 136 137 130 136 133 134 1310 132 136 137 134 133 132 138 133 135 133 135 136 132 134 134 133 135 135 135 134 134 136 133 132 138 1310 135 135 132 132 137 136 134 135 134 134 136 134 136 135 133 137 137 136 137 134 134 137 133 130 134 136 135 137 136 136 135 137 134 134 135 136 136 135 136 132 134 133 139 135 133 137 135 136 137 136 136 136 134 135 137 137 133 134 137 137 136 133 134 137 131 135 136 133 137 133 135 133 137 138 133 137 132 135 134 133 132 135 134 134 135 133 134 139 135 134 139 137 133 132 133 134 133 134 135 135 138 134 135 134 135 139 137 133 133 132 136 132 138 135 132 137 134 135 136 132 134 135 135 133 135 136 137 135 138 132 131 137 135 135 138 134 137 136 139 1310 137 134 131 136 132 136 137 133 135 137 135 132 135 135 133 133 137 134 133 133 131 138 139 132 134 138 135 136 138 137 1310 138 133 134 134 135 134 134 135 136 135 134 134 135 133 136 135 137 132 133 139 132 133 137 136 134 137 131 135 134 132 134 138 135 134 131 132 134 135 136 133 134 138 134 132 135 134 132 134 133 136 135 138 133 139 1310 134 133 133 137 137 136 137 133 133 133 135 139 136 136 137 136 135 132 132 139 136 132 139 132 137 135 133 138 137 135 134 136 131 133 135 133 134 137 135 134 132 136 136 136 137 133 132 135 134 135 134 137 134 133 133 134 132 134 135 134 134 136 134 135 138 133 135 135 138 133 135 134 135 135 138 1311 132 134 134 136 133 135 133 136 132 131 136 134 136 132 136 136 136 136 130 136 134 134 131 138 131 1310 135 139 136 132 136 138 135 138 134 132 134 133 136 137 133 133 133 133 137 136 135 133 139 133 132 135 136 136 134 132 132 135 137 136 136 136 138 137 137 135 135 131 136 133 136 135 133 134 130 133 135 136 137 138 136 134 135 132 137 132 137 132 133 134 135 138 134 136 133 135 135 139 134 134 136 134 134 134 135 134 133 135 135 138 133 136 136 134 135 134 134 138 136 133 137 132 134 137 136 135 133 134 133 135 134 134 136 134 133 137 133 135 135 136 135 138 134 136 132 137 136 138 134 136 136 137 136 136 135 136 1310 138 133 137 135 136 137 134 136 133 134 133 132 132 134 137 132 132 133 132 138 134 134 135 135 139 135 134 132 134 135 134 139 137 133 134 134 135 133 133 137 138 135 139 133 138 136 136 134 133 136 135 1314 137 133 137 135 136 134 134 136 133 135 134 135 136 136 135 133 135 131 135 137 135 136 133 137 135 134 133 134 134 134 134 134 136 132 134 136 136 137 139 134 138 133 133 132 135 131 134 133 137 133 133 134 139 138 134 134 137 137 135 136 134 139 137 138 134 133 134 134 135 137 134 135 138 133 132 134 1310 133 135 134 132 138 137 136 135 138 1314 139 135 135 131 134 135 134 135 135 135 133 136 135 135 132 136 139 133 133 136 134 132 132 137 136 131 137 135 135 134 1313 1310 132 134 134 133 138 135 134 133 136 136 136 1310 134 137 136 138 139 137 135 134 134 137 137 138 133 134 135 137 135 136 1310 136 136 138 133 136 133 134 135 135 134 136 133 136 136 137 134 135 1316 136 136 132 136 136 133 134 133 137 134 135 134 133 138 134 1310 136 136 136 137 134 136 137 132 138 136 131 132 134 135 130 134 135 135 137 130 136 135 131 136 137 133 137 135 139 138 135 139 133 137 139 133 136 137 136 138 134 1310 136 134 133 139 136 137 133 13713

Rango maacuteximo y miacutenimo

Para empezar vamos a aprender tres nuevas funciones de R que nos permiten calcular esos tresvalores

gt (minimo = min(var3) )[1] 0gt (maximo = max(var3) )[1] 16gt (rango = range(var3) )[1] 0 16

El funcionamiento de las dos primeras es evidente La funcioacuten range devuelve un vector formadopor el maacuteximo y el miacutenimo

Tablas de frecuencia Clases de objetos en R

La tabla de frecuencia absoluta de var3 se obtiene usando la funcioacuten table de esta forma tansencilla

gt ( tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

La primera fila contiene los elementos de var3 y en la segunda aparece la frecuencia de cada unode ellos Puedes comprobar que son los mismos resultados que obtuvimos con Calc en la paacutegina10 del Tutorial01 Aunque alliacute desde luego el proceso fue maacutes laborioso

A lo mejor te has dado cuenta de que el formato de la respuesta es diferente de los que hemosobtenido hasta ahora Para empezar la respuesta no empieza con el [1] al que ya nos vamosacostumbrando El motivo de esto es que el objeto que hemos obtenido como respuesta no es unvector sino una tabla Ya dijimos que R utiliza distintos tipos de objetos con fines distintosiquestCoacutemo podemos saber de queacute clase es un objeto Pues usando una funcioacuten de R oportunamentellamada class Si la usamos con el vector var3 y con su tabla de frecuencias obtenemos

gt class(var3)[1] numericgt class(tablaFrecAbs)[1] table

El vector var3 es de clase numeric porque es un vector de nuacutemeros Y la tabla de frecuencias esde clase table Veremos a lo largo del curso otros objetos de tipo tabular como las matrices (clasematrix) los conjuntos de datos (clase dataframe) y los arraysAunque las tablas son objetos distintos de los vectores tienen algunas propiedades en comuacuten yalgunas de las funciones que hemos usado con vectores tambieacuten se pueden usar con tablas

Ejercicio 11Aplica las funciones length sum min max y range a la tabla tablaFrecAbs Solucioacuten en la paacutegina48

Siguiendo con los parecidos entre tablas y vectores puedes multiplicar (o dividir) una tabla porun nuacutemero y la operacioacuten se haraacute elemento a elemento

gt 2 tablaFrecAbsvar30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1618 50 200 376 488 492 372 262 174 86 56 12 4 4 4 2

Como ves cada frecuencia se multiplica por 2 Esta propiedad de las tablas permite obtener deforma muy sencilla la tabla de frecuencias relativa de var3 Como primer paso vamos a guardarla longitud de var3 en la variable n

22

gt ( n = length( var3 ) )[1] 1300

Y ahora podemos dividir la tabla por n para conseguir la tabla de frecuencias relativas (hemosestrechado la Consola de Comandos para que el resultado cupiera en esta paacutegina)

gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 400069230769 00192307692 00769230769 01446153846 01876923077

5 6 7 8 901892307692 01430769231 01007692308 00669230769 00330769231

10 11 12 13 1400215384615 00046153846 00015384615 00015384615 00015384615

1600007692308

Ejercicio 12Ya sabemos cuanto debe sumar esta tabla de frecuencias relativas Comprueacutebalo Solucioacuten en lapaacutegina 48

Si lo que queremos es una tabla de frecuencias acumuladas debemos emplear la funcioacuten cumsum

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Ejercicio 13La uacuteltima tabla que falta es la de frecuencias relativas acumuladas pero ya tienes todos los ingre-dientes para obtenerla de dos maneras diferentes Hazlo y comprueba si dan el mismo resultadoSi no es asiacute iquesta queacute crees que se debe y cuaacutel es la mejor opcioacuten Asigna el resultado a la variabletablaFrecRelAcu Solucioacuten en la paacutegina 49

Graacuteficos de columnas y diagramas de caja (boxplot) Argumentos con nombre

Vamos a fabricar nuestros primeros graacuteficos con R En concreto vamos a dibujar un graacutefico debarras a partir de la tabla de frecuencias de var3 usando la funcioacuten barplot de R

gt barplot(tablaFrecAbs)

Al ejecutar este comando no debes ver ninguna salida en la Consola de Comandos En su lugaren el panel inferior derecho de RStudio concretamente en la ventana Plots apareceraacute el graacuteficodeseado El resultado puede variar dependiendo de la anchura de tu ventana de RStudio

23

Hemos destacado ademaacutes en la figura los dos botones Zoom y Export que te permiten respecti-vamente ver una versioacuten ampliada de la Figura (que se redimensiona dinaacutemicamente si cambiasla ventana) y guardar esa figura como un fichero de graacuteficos que puedes insertar en cualquierdocumento editar con un programa de manipulacioacuten de graacuteficos etceacuteteraLos graacuteficos de R se pueden controlar hasta en sus detalles maacutes miacutenimos Como aperitivo miacutenimovamos a antildeadir algo de color al graacutefico

gt barplot(tablaFrecAbs col = heatcolors(15))

El resultado es esta figura

Las posibilidades de control de los graacuteficos de R son como decimos inmensas y pueden llegar aser abrumadoras Hay libros de cientos de paacuteginas dedicados a este tema como el R GraphicsCookbook de W Chang (ver las referencias del curso) Nosotros a lo largo de los tutoriales delcurso vamos a aprender algo maacutes aunque a penas nos podremos limitar a rozar la superficie delo que se puede llegar a hacerEn la Seccioacuten 231 del libro hemos descrito los diagramas de cajas o boxplots (recuerda la Figura22 de la paacuteg 36 del libro) Y en el Tutorial-01 dijimos que con Calc no es faacutecil dibujar ese tipode diagramas En cambio con R no podriacutea ser maacutes faacutecil

gt boxplot(var3)

Y el resultado es esta figura

24

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

Ejercicio 1En este ejercicio vamos a utilizar las liacuteneas de coacutedigo que aparecen a continuacioacuten Copia o tecleacada liacutenea en el prompt (iexclpractica las dos maneras) una por una y ejecuacutetalas pulsando Entrartras copiar o teclear cada liacutenea Trata de adivinar el resultado de cada operacioacuten antes de ejecutarel coacutedigo

2+315-74613513513513+15sqrt(25)sqrt(26)sin(pi)sin(314)

Los resultados de este ejercicio aparecen en la Tabla 1 (paacuteg 5) iexclNo los mires sin haberlo intentadoEsos resultados se merecen algunos comentarios

Seguramente las liacuteneas que menos previsibles te han resultado son las que contienen losoperadores y Estos operadores representan respectivamente el cociente y el resto dela divisioacuten entera

Lo maacutes importante que tienes que observar en los resultados es que R trabaja siempre conla representacioacuten mediante decimales de los nuacutemeros Esto es evidente por ejemplo en larespuesta a la instruccioacuten

13+15

que representa la operacioacuten1

3+

1

5

pero cuyo resultado en R es 05333333 y no 815 El valor decimal es una aproximacioacuten ala fraccioacuten pero no es un resultado exacto (la fraccioacuten siacute es exacta) Por lo tanto cuandohagamos operaciones con R tenemos que tener cuidado con la posible peacuterdida de precisioacutenque llevan siempre aparejadas las operaciones con decimales Teacutecnicamente esto significaque R es un programa (esencialmente) numeacuterico Maacutes adelante en el curso veremos alguacutenprograma simboacutelico y discutiremos la diferencia entre ambos

Fiacutejate en que como hemos dicho R ha interpretado el siacutembolo

13+15

como la operacioacuten1

3+

1

5

en lugar de darle otras interpretaciones posibles como por ejemplo

1(3 + 1

5

) Para hacer esa interpretacioacuten R ha aplicado una serie de reglas de lo que se conoce comoprioridad de operadores y que dicen en que orden se realizan las operaciones seguacuten el tipode operador No queremos entretenernos con esto ahora asiacute que baste con decir que encaso de duda siempre puedes (y a menudo debes) usar pareacutentesis para despejar la posibleambiguumledad

4

gt 3^2[1] 9gt sqrt(9)[1] 3gt 2+3[1] 5gt 15-7[1] 8gt 46[1] 24gt 135[1] 26gt 135[1] 2gt 135[1] 3gt 13+15[1] 05333333gt sqrt(25)[1] 5gt sqrt(26)[1] 509902gt sin(pi)[1] 1224606e-16gt sin(314)[1] 0001592653

Tabla 1 Resultados del Ejercicio 1

Por ejemplo para distinguir entre las dos interpretaciones que hemos dado puedes escribir

(13)+(15)

o por el contrario

1 ( (3+1)5 )

Un uso prudente de pareacutentesis y espacios en las operaciones es una marca caracteriacutestica delbuen hacer cuando se escribe coacutedigo en un ordenador Si alguna vez esto llega a ser unproblema para ti habraacute llegado el momento de aprender algo maacutes sobre esa prioridad deoperadores

La funcioacuten sin es la funcioacuten seno de la Trigonometriacutea Ademaacutes R utiliza el siacutembolo pi parareferirse a la constante matemaacutetica π asymp 3141593 Y el caraacutecter numeacuterico de R se refleja denuevo en el hecho de que al ejecutar sin(pi) no has obtenido 0 (que es la respuesta exacta)sino

gt sin(pi)[1] 1224606e-16

La notacioacuten que se usa en la respuesta es la forma tiacutepica de traducir la notacioacuten cientiacutefica alos lenguajes de ordenador y calculadoras El siacutembolo 1224606e-16 representa el nuacutemero

1224606 middot 10minus16

de manera que el nuacutemero -16 que sigue a la letra e en esta representacioacuten es el exponentede 10 (tambieacuten llamado orden de magnitud) mientras que el nuacutemero 1224606 se denominaa veces mantisa Puedes leer maacutes sobre la notacioacuten cientiacutefica en este artiacuteculo de la Wikipedia

5

httpeswikipediaorgwikiNotacioacuten_cientiacutefica

En cualquier caso el exponente -16 nos indica que se trata de un nuacutemero extremadamentecercano a 0 Fiacutejate en cambio que si usas 314 como aproximacioacuten de π la respuesta aunquepequentildea es todaviacutea del orden de mileacutesimas

11 Algunos detalles de la interfaz de RStudioAntes de avanzar maacutes queremos ocuparnos de algunos aspectos del trabajo con RStudio que amenudo causan algunos quebraderos de cabeza a quienes se inician en el uso del programa

Comandos incompletos

Para ver un ejemplo prueba a escribir en el prompt activo esta operacioacuten evidentemente incom-pleta

3

y pulsa Entrar La respuesta de R es un siacutembolo +

gt 3+

que en este caso no tiene nada que ver con la suma Es la forma que tiene R de decirnos ldquonecesitoalgo maacutesrdquo Cuando R se encuentra con una expresioacuten que considera no erroacutenea sino incompleta(por ejemplo con un pareacutentesis abierto al que corresponde un pareacutentesis cerrado) entonces nos locomunica con este siacutembolo + Y al hacerlo nos da la oportunidad en casos como este de corregirel error completando la expresioacuten incompleta Asiacute que si ahora junto al siacutembolo + escribes 2 deesta forma

gt 3+ 2

y pulsas Entrar veraacutes que R ha entendido la expresioacuten completa 32 y nso devuelve la respuesta

gt 3+ 2[1] 6

En alguacuten momento no obstante ese siacutembolo + de los comandos incompletos se convertiraacute en uninconveniente Imagiacutenate por ejemplo que queriacuteas multiplicar 5 middot7 pero que por error has tecleadola expresioacuten

57-

y has pulsado Entrar antes de darte cuenta del error En tal caso R piensa que esa expresioacuten estaacuteincompleta y vuelve a aparecer el signo +

gt 57-+

iexclPero ahora no queremos antildeadir nada En este caso podriacuteas antildeadir un 0 sin que eso afectara elresultado pero habraacute maacutes adelante muchos casos en los que no hay una solucioacuten sencilla evidenteiquestCoacutemo salimos del paso Simplemente pulsamos la tecla Esc (escape) con lo que R interrumpe elcomando y nos devuelve a un nuevo prompt activo sin calcular nada

Navegando el historial de comandos

En un caso como el que hemos descrito no supone un problema volver a teclear la expresioacutenevitando el error que habiacuteamos cometido Pero en ocasiones si hemos escrito una expresioacuten real-mente complicada y por ejemplo hemos tecleado un pareacutentesis de maacutes en medio de la expresioacutenseguramente prefeririacuteamos no tener que volver a teclear la expresioacuten completa Un remedio ldquocaserordquoconsiste en seleccionar y copiar la expresioacuten erroacutenea pegarla en el prompt activo y editarla ahiacutepara corregir el errorHay una segunda manera de conseguir el mismo efecto Otra caracteriacutestica interesante de la Consolade Comandos es que si te situacuteas en el prompt activo y pulsas las teclas con flechas arriba o abajoveraacutes pasar la lista completa de comandos que has ejecutado desde el principio de la sesioacuten detrabajo Prueba a hacerlo ahora para ver como funciona Si has ejecutado todos los comandosque hemos ido describiendo en este tutorial puedes pulsar la flecha uarr repetidamente e iraacutes viendopasar todos esos comandos hasta llegar al

6

3^2

con el que hemos empezado Y con la flecha hacia abajo recorres la lista en sentido contrario hastael comando de ejecucioacuten maacutes reciente Esa lista de comandos es el Historial de Comandos Usandolas flechas arriba y abajo puedes recorrer el Historial de Comandos detenerte en cualquier puntomodificar ese comando si lo deseas y despueacutes ejecutarlo (con o sin modificaciones) Al principiopuede que te cueste un poco acostumbrarte pero una vez que te habituacutees a esta herramientala encontraraacutes sin duda muy uacutetil El Historial de Comandos que puedes recorrer con las flechasarriba y abajo se limita a la sesioacuten de trabajo actual Pero si miras en el panel superior derecho deRStudio veraacutes una pestantildea titulada History que se muestra en esta figura

El Historial de Comandos que aparece en ese panel refleja tus comandos de esta y anterioressesiones Si esta es tu primera sesioacuten de trabajo con R ambos coincidiraacuten claro estaacute Pero a medidaque vayas abriendo RStudio en diacuteas sucesivos te puede resultar muy uacutetil localizar por ejemploun comando que usaste hace dos sesiones pero que no recuerdas exactamente Los comandos queaparecen en ese panel se pueden copiar y pegar en la Consola de Comandos o de forma maacutes directapuedes seleccionar uno de ellos con el ratoacuten y pulsar en el botoacuten To Console que hemos destacadoen la Figura

111 Errores

Los errores son inevitables y nos conviene estar preparados para su aparicioacuten Dependiendo delmotivo del error R nos informaraacute con distintos tipos de mensajes Asiacute que vamos a ver algunosejemplos para conocer la terminologiacutea asociadaPara empezar este es el mensaje de error que obtenemos tras ejecutar una expresioacuten sin sentido

gt 43Error unexpected rsquorsquo in 4

Los mensajes de error aparecen en color rojo en RStudio Este mensaje de error en particulares bastante faacutecil de entender R simplemente se queja de que esta expresioacuten es defectuosa Noincompleta como alguna que hemos visto antes Es imposible completar esta expresioacuten de formacorrectaVeamos otro tipo de mensaje de error Ya sabes que no se puede dividir por 0 Si lo intentamos enR

gt 20[1] Inf

7

el siacutembolo Inf (de infinito) nos avisa del problema Ese siacutembolo tambieacuten puede aparecer con signomenos si por ejemplo tratas de calcular el logaritmo neperiano de 0 En R el logaritmo neperianoes la funcioacuten log asiacute que seriacutea

gt log(0)[1] -Inf

En ambos casos R no lanza un mensaje de error pero utiliza el siacutembolo de infinito porque asiacute nosproporciona maacutes informacioacuten matemaacutetica sobre lo que ha ocurrido Tambieacuten puede suceder queel siacutembolo Inf aparezca como resultado intermedio en una expresioacuten En ese caso R aplica unasreglas sencillas de aritmeacutetica con infinitos para tratar de darnos la respuesta maacutes coherente desdeel punto de vista matemaacutetico Por ejemplo si calculas

3(-5(4-2^2))

Entonces R empieza calculando el resultado del pareacutentesis 4-2ˆ2 que es 0 Asiacute que al dividir minus5entre 0 R obtiene -Inf y finalmente al calcular 3(-Inf) se obtiene -Inf como valor de laexpresioacuten Comprobeacutemoslo

gt 3(-5(4-2^2))[1] -Inf

A pesar de que R no lanza mensajes de error estaacute claro que en la mayoriacutea de los casos no esdeseable que nuestros caacutelculos produzcan Inf como resultado en ninguna etapaEn otros casos el problema es diferente Por ejemplo si tratas de calcular la raiacutez cuadrada de unnuacutemero negativo

gt sqrt(-4)[1] NaNWarning messageIn sqrt(-4) NaNs produced

En este caso obtenemos una respuesta NaN y ademaacutes una advertencia (warning) sobre la aparicioacutende esa respuesta El siacutembolo NaN es la abreviatura de Not a Number es decir ldquono es un nuacutemerordquo Estaes la respuesta que obtendremos cuando tratamos de hacer operaciones como esta que producencomo resultado un nuacutemero complejo R es capaz de trabajar con los nuacutemeros complejos pero comono los vamos a necesitar en el curso no nos ocuparemos de esto Para que veas otro ejemplo esarespuesta NaN aparece tambieacuten si tratamos de ir demasiado lejos con la aritmeacutetica con infinitos

gt (10)+log(0)[1] NaN

En este caso R se ha encontrado en un paso intermedio con Inf - Inf y su respuesta ha sido NaN

En cualquier caso y como resumen final tenemos que tratar de evitar que nuestros caacutelculos con-duzcan a este tipo de expresiones

Haciendo limpieza en la Consola de Comandos

Si has seguido todas las instrucciones hasta aquiacute tu Consola de Comandos seguramente empiezaa estar llena de comandos y algunos pueden quedar ocultos en la parte superior Naturalmentepuedes usar las barras de desplazamiento para moverte por la Consola Pero en sesiones largas detrabajo o cuando hemos terminado de hacer pruebas y queremos ejecutar una versioacuten definitivade nuestro trabajo es normal que queramos hacer limpieza en la Consola Eso se consigue con lacombinacioacuten de teclas Ctrl + L iexclCuidado Es un proceso no reversible podraacutes seguir navegandoel Historial de Comandos con las teclas arriba y abajo pero para recuperar los resultados tendraacutesque ejecutar de nuevo los comandosMaacutes adelante aprenderemos formas de guardar nuestro trabajo de una manera maacutes eficiente Perote podemos adelantar que puesto R se maneja escribiendo comandos bastaraacute con guardar esoscomandos en ficheros de texto plano Ahora vamos a cambiar de tema y para empezar desde cerovamos a cerrar RStudio para eliminar las trazas del trabajo que hemos hecho

2 Variables y vectoresVuelve a abrir RStudio para continuar el trabajo En la seccioacuten previa hemos usado R como unacalculadora Pero para ir maacutes allaacute tenemos que disponer de estructuras de datos Ese teacutermino

8

describe en Computacioacuten las herramientas que nos permiten almacenar y procesar informacioacutenLas estructuras de datos maacutes baacutesicas de R son las variables y los vectores En proacuteximos tutorialesnos iremos encontrando con otras estructuras de datos matrices dataframes listas entre otras

21 Variables en RUna variable en R es un siacutembolo que usamos para referirnos a un valor Por ejemplo si te situacuteasen la Consola de Comandos tecleas

a = 2

y ejecutas esa instruccioacuten entonces aunque aparentemente no ha sucedido nada (porque no hayrespuesta) a partir de ese momento R ha asignado el valor 2 al siacutembolo a Asiacute que si por ejemplotecleas y ejecutas

a + 1

obtendraacutes como respuesta 3

Ejercicio 2iquestQueacute se obtiene al ejecutar estos comandos uno detraacutes de otro iquestCuaacutento valen las variables a by c al final

a = 2b = 3c = a + ba = b cb = (c - a)^2c = a b

La solucioacuten estaacute en la paacutegina 47 iexclNo la mires antes de intentar pensar el ejercicio por ti mismo

En el Capiacutetulo 1 del libro hemos hablado de variables cualitativas y cuantitativas Estas uacuteltimastoman siempre valores numeacutericos y las variables de R sirven desde luego para almacenar esa clasede valores Pero como iremos viendo en sucesivos tutoriales tambieacuten se pueden utilizar variablesde R para guardar valores de variables cualitativas (factores) y otros tipos de objetos que iremosconociendo a lo largo del curso De momento para que veas a que nos referimos recordaremos elEjemplo 111 del libro (paacuteg 6) en el que teniacuteamos una variable cualitativa ordenada que representael pronoacutestico de un paciente que ingresa en un hospital Prueba a ejecutar este coacutedigo

pronostico = Leve

simplemente para que de momento veas que

R no protesta El valor Leve es un valor perfectamente aceptable

En R los valores que representan palabras frases o como las llamaremos teacutecnicamente cadenasalfanumeacutericas se escriben siempre entre comillas Puedes usar comillas simples o dobles perote aconsejamos que uses dobles comillas

La relacioacuten entre factores y valores alfanumeacutericos en R es algo maacutes complicada de lo que estesencillo ejemplo parece sugerir Pero ya tendremos ocasioacuten en futuros tutoriales de extendernossobre eso

Asignaciones

Las instrucciones como

a = 2

o como

b = (c - a)^2

se denominan asignaciones En la primera por ejemplo decimos que hemos asignado el valor 2a la variable aQueremos advertir al lector de que en R hay otra forma esencialmente equivalente de escribir lasinstrucciones y que de hecho se usa mayoritariamente En lugar del siacutembolo = puedes conseguirel mismo efecto escribiendo lt- (el signo ldquomenorrdquo seguido sin espacios de un signo ldquomenosrdquo) Asiacuteque si ejecutas

9

a lt- 2

el resultado seraacute el mismo que antes con = Las dos notaciones tienen ventajas e inconvenientes peronosotros preferimos = porque se parece maacutes a lo que se utiliza en muchos lenguajes de programacioacuten

Coacutemo ver los resultados de un caacutelculo a la vez que lo hacemos

Ya habraacutes notado que al hacer una asignacioacuten R no produce ninguna respuesta y se limita aguardar el valor en la variable En una asignacioacuten como a=2 esto no genera ninguna duda Perosi el miembro derecho de la asignacioacuten es una expresioacuten maacutes complicada puede ser convenientepedirle a R que nos muestre el resultado de esa expresioacuten a la vez que se hace la asignacioacutenImagiacutenate por ejemplo esta situacioacuten

b = 2c = -2d = -4a = b c^2 d + 3

iquestCuaacutel es el valor que se asigna a la variable a Una forma de averiguarlo es simplemente ejecutaruna liacutenea adicional en la que aparece soacutelo el nombre de la variable que queremos inspeccionar Alejecutar esta sentencia R nos devuelve como respuesta

gt a[1] 1

Pero hay otra manera de conseguir que R nos muestre el resultado de la asignacioacuten que es maacutesinteresante porque produce coacutedigo maacutes simple Basta con encerrar toda la asignacioacuten entre pareacuten-tesis El resultado es

gt ( a = b c^2 d + 3 )[1] 1

como antes Este ejemplo es desde luego bastante artificial Te recordamos en cualquier caso laconveniencia de utilizar pareacutentesis para hacer maacutes legibles las expresiones y evitar posibles erroresPero a la vez la posibilidad de comprobar el resultado de las asignaciones aumenta la fiabilidaddel coacutedigo que escribimos

Nombres de las variables

Aunque hasta ahora hemos usado letras como nombres de las variables puedes utilizar nombresmaacutes descriptivos Y muchas veces es una buena idea hacerlo Por ejemplo puede que hace unasemana hayas escrito estas instrucciones para resolver un problema

a = 2b = 3c = a b

Pero si las vuelves a ver pasada una semana es posible que no recuerdes queacute era lo que estabastratando de conseguir al hacer esto En cambio al ver estas instrucciones

espacio = 2tiempo = 3velocidad = espacio tiempo

es mucho maacutes faacutecil reconocer el objetivo que persiguen A lo largo de los tutoriales del curso vamos ainsistir muchas veces en la necesidad de que el coacutedigo esteacute bien organizado y esteacute bien documentadoUn primer paso en esa direccioacuten es tratar de elegir nombres descriptivos para las variables En Rlas reglas para los nombres de variables son muy flexibles esencialmente que empiecen por unaletra y no contengan espacios ni caracteres especiales como + pareacutentesis etceacutetera Pero cuidadocon los excesos Es cierto que puedes usar nombres de variables arbitrariamente largos Pero si usascomo nombre

Estavariablealmacenaelresultadodelaoperaciontaninteresantequeacabamosdehacer

tu trabajo resultaraacute ilegible Como siempre se necesita un equilibrio y con la praacutectica encontraraacutesel tuyo (consejo zen gratuito del tutorial de hoy) Para empezar es una buena idea combinarmayuacutesculas y minuacutesculas en los nombres de las variables Si vas a usar una variable para representarla temperatura final de un proceso el nombre temperaturafinalproceso es menos legible y maacuteslargo que tempFinal Es mucho maacutes faacutecil por otra parte que te equivoques tecleando el primerode esos nombres

10

22 VectoresEn Estadiacutestica lo habitual es trabajar con colecciones o muestras de datos Y para almacenar esascolecciones de datos la estructura maacutes baacutesica de R son los vectores En este apartado vamos aempezar nuestro trabajo con ellos aunque a lo largo del curso auacuten tendremos ocasioacuten de aprenderbastante maacutes sobre el manejo de los vectores de RPara empezar vamos a trabajar con vectores que contienen una coleccioacuten de nuacutemeros que puedenser las edades de los alumnos de una clase

22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19

En R las listas de nuacutemeros como esta se almacenan en vectores El vector que corresponde a esasedades se construye en R mediante un comando como este

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19)

En realidad en esa expresioacuten hemos hecho dos cosas

1 Hemos creado el vector con los datos en la parte derecha de la expresioacuten

c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19)

Los datos estaacuten separados por comas y rodeados por pareacutentesis Hasta aquiacute todo es bastantetiacutepico pero fiacutejate especialmente en la letra c que precede al primer pareacutentesis Esa letra ces el nombre de una nueva funcioacuten de R y es la forma maacutes sencilla que existe en R paracrear un vector de datos Podriacutea pensarse que la c es de crear pero en realidad proviene deconcatenar Enseguida entenderemos porque es asiacute

2 Una vez creado el vector lo hemos asignado a la variable edades Hasta ahora soacutelo habiacuteamosusado variables para identificar un uacutenico valor (un nuacutemero o una cadena alfanumeacuterica)Pero una variable puede usarse para identificar un vector o como veremos maacutes adelanteestructuras mucho maacutes complejas

Una observacioacuten maacutes los vectores de R se usan para almacenar valores de una variable Y enparticular todos los datos de un vector son del mismo tipo de variable No se puede mezclar en unvector nuacutemeros y cadenas alfanumeacutericas (aparentemente R te dejaraacute hacerlo pero internamentehabraacute convertido todos los nuacutemeros en cadenas alfanumeacutericas)

Manos a la obra Prueba a copiar el comando anterior en tu Consola de comandos (puedes usarcopiar y pegar desde este fichero) y ejecuacutetalo Si las cosas van bien no esperes ninguna respuestacomo ya hemos dicho R no te muestra el resultado de las asignaciones Recuerda que si quieresver el resultado de una asignacioacuten puedes rodear toda liacutenea con pareacutentesis como en

(edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19))

Otra opcioacuten naturalmente es preguntarle a R por el valor de edades despueacutes de la asignacioacutenEscribe simplemente edades en la Consola de Comandos y ejecuacutetalo Veraacutes de nuevo el contenidode esa variable

Vamos a hacer algunas operaciones con este vector Imagiacutenate que como sucede a menudo despueacutesde haber creado nuestra lista de edades de alumnos desde la administracioacuten nos avisan de que haycinco alumnos nuevos recieacuten matriculados y debemos incorporar sus edades que son

22 18 20 21 20

a nuestro vector de datos Naturalmente podemos empezar de nuevo pero es preferible reutilizarel vector edades que ya habiacuteamos creado Vamos a ver esto como primer ejemplo para empezar aaprender coacutemo se manipulan vectores en R Una forma de antildeadir los datos es empezar creando unnuevo vector (con la funcioacuten c de R)

(edades2 = c(22 18 20 21 20))

Y a continuacioacuten concatenamos los vectores usando de nuevo la misma funcioacuten c de una maneradistinta

(edades = c( edades edades2))

11

Hemos rodeado toda la liacutenea con pareacutentesis para ver el resultado y poder observar coacutemo hacambiado el vector edadesVamos a analizar paso a paso lo que ha ocurrido

La instruccioacuten c( edades edades2) toma los datos contenidos en edades y edades2 y losconcatena en ese orden para fabricar un nuevo vector que todaviacutea no estaacute guardado enninguna variable

La asignacioacuten edades = c( edades edades2) toma ese vector y lo guarda en la propiavariable edades Al hacer esto como era de esperar el anterior vector edades es reemplazadocon la nueva lista y su contenido anterior se pierde (cuidado con esto las reasignaciones sonuna de las formas habituales de cometer errores)

El nombre de la funcioacuten c proviene en realidad de concatenate concatenar en ingleacutesLa siguiente figura resume lo que hemos venido haciendo con estos datos

Los nuacutemeros entre corchetes al principio de cada fila como el [1] y el [16] de este ejemploson soacutelo ayudas para que podamos localizar los elementos del vector En mi pantalla la primerafila muestra los primeros 15 nuacutemeros del vector Pero en la tuya si la ventana de RStudio es dedistinta anchura los nuacutemeros entre corchetes pueden ser distintos Hasta ahora soacutelo habiacuteamos vistoejemplos con [1] que es lo que sucede cuando la respuesta es un vector que cabe en una uacutenicaliacutenea

3 Ficheros csv con REn esta seccioacuten vamos a aprender a utilizar ficheros csv con R En el Tutorial-01 hemos vistoalgunos ejemplos de ese tipo de ficheros y el manejo baacutesico con una hoja de caacutelculo como CalcComo vimos alliacute un fichero csv tiacutepico contiene una tabla de datos con varias columnas Esaestructura de tabla se haraacute imprescindible maacutes adelante Pero durante una buena parte del cursonosotros nos vamos a limitar a problemas en los que interviene una uacutenica variable En tal casopara almacenar los datos de esa variable nos podemos a limitar a considerar un tipo de ficheroscsv muy baacutesico como el fichero adjunto

Guaacuterdalo en la subcarpeta datos de tu directorio de trabajo (el que contiene este pdf) Si lo abrescon un editor de texto (como el Bloc de Notas en Windows) veraacutes como muestra esta figura

12

61371381381381391391351381371381371371361361371351381391341371351371371351391341371371371381351381391371341361361361391381361371361371361361381361351351361361381351381351391371361391351371381381371310137138137135136138138137133135136137135137137135138134138138138136137136136138135136135138136139137

que el fichero contiene soacutelo una columna de datos que en este ejemplo corresponde a valores deuna variable cuantitativa discreta En la figura soacutelo se muestra una parte de los datos

Ejercicio 3iquestCuaacutentos datos hay en ese vector Usa Calc para averiguarlo pronto aprenderemos a hacerlo conR Solucioacuten en la paacutegina 47

Queremos utilizar esos datos en R y para eso vamos a (1) leerlos desde el fichero y (2)guardarlos enun vector El resultado seraacute como si nosotros hubieacuteramos creado ese vector tecleaacutendo sus elementosdirectamentePara el primer paso (la lectura del fichero csv) vamos a tener que empezar por explicarle a R(usando RStudio como intermediario) donde estaacute el fichero que contiene esos datos Cuando tra-bajamos con ficheros R utiliza un directorio de nuestro ordenador como directorio de trabajo Acontinuacioacuten vamos a aprender a elegir un directorio de trabajo Puedes usar cualquier carpeta yen lo que sigue vamos a suponer que hemos elegido el Escritorio Lo maacutes importante es que esacarpeta debe contener a su vez una subcarpeta llamada datos Y aseguacuterate de que los ficheroscsv que vas a usar estaacuten almacenados en esa subcarpeta llamada datos

Usamos el menuacute Session rarr Set Working Directory rarr Choose Directory

Se abre un cuadro de diaacutelogo del sistema y navegamos hasta la carpeta que contiene el ficherocsv que en mi caso es el Escritorio Cuando selecciono el Escritorio veo aparecer en la Consolade Comandos de R un comando que RStudio ha escrito y ejecutado por nosotros

13

setwd(CUsersFernandoDesktop)

Este es el resultado en mi ordenador (de ahiacute el nombre de usuario) usando Windows 10 Enversiones maacutes antiguas de Windows o en una maacutequina con Linux o un Mac el comando seraacuteligeramente distinto Cuando tengamos maacutes praacutectica aprenderemos otras formas de seleccionar eldirectorio de trabajo o incluso de utilizar ficheros situados fuera de ese directorio de trabajo Peropor el momento resulta maacutes coacutemodo dejar que RStudio haga ese trabajo para nosotrosAhora R ya sabe doacutende estaacute el fichero que nos interesa pero todaviacutea no sabe cual es Para ello vamosa utilizar la funcioacuten readtable de R Aunque esta funcioacuten tiene muchas opciones disponiblesnuestro primer uso de ella seraacute bastante sencillo Copia y ejecuta el siguiente coacutedigo en RStudio

(vectorEdades = readtable(datosTut02-Edadescsvheader = FALSE)[1])

En esta instruccioacuten le decimos a R que use la funcioacuten readtable para leer el contenido del ficheroTut02-Edadescsv y que almacene lo que ha leiacutedo en un vector que hemos decidido llamarvectorEdades Y aunque no es necesario entender en detalle el funcionamiento de readtable eneste momento vamos a explicar un poco maacutes lo que hemos hecho A medida que el curso avanceiraacutes teniendo maacutes ocasiones de practicar esto e iraacute quedando cada vez maacutes claroLa opcioacuten header = FALSE sirver para indicarle a R que la tabla almacenada en el fichero no tieneuna liacutenea de cabecera (en ingleacutes header) que cuando existe suele contener los nombres de lasvariables de la tabla Ademaacutes la funcioacuten readtable sirve para leer tablas con varias columnasobteniendo como resultado un objeto de R de tipo dataframe Pero nuestro primer ejemplo esmuy sencillo y la tabla soacutelo tiene una columna Asiacute que usamos la notacioacuten [1] para indicarle aR que soacutelo queremos la primera columna de esa tabla considerada como un vectorAl ejecutar esa orden habraacutes obtenido una respuesta como esta

gt gt (vectorEdades = readtable(datosTut02-Edadescsv header = FALSE)[1])[1] 6 7 8 8 8 9 9 5 8 7 8 7 7 6 6 7 5 8 9 4 7 5 7[24] 7 5 9 4 7 7 7 8 5 8 9 7 4 6 6 6 9 8 6 7 6 7 6[47] 6 8 6 5 5 6 6 8 5 8 5 9 7 6 9 5 7 8 8 7 10 7 8[70] 7 5 6 8 8 7 3 5 6 7 5 7 7 5 8 4 8 8 8 6 7 6 6[93] 8 5 6 5 8 6 9 7

Como hemos dicho antes los nuacutemeros entre corchetes al principio de cada fila que en mi casoson [1] [24] [47] [70] y [93] son soacutelo ayudas para que podamos localizar los elementos delvector En mi pantalla cada primera fila muestra 23 nuacutemeros del vector Pero en la tuya si laventana de RStudio es de distinta anchura los nuacutemeros entre corchetes pueden ser distintos

En cualquier caso ahora el vector vectorEdades contiene la informacioacuten del fichero csv con el quehemos empezado En la Seccioacuten 4 vamos a empezar a hacer Estadiacutestica Descriptiva Pero antes tepedimos un poco maacutes de paciencia porque vamos a entretenernos un poco maacutes en los detalles delmanejo de ficheros csv con R No pretendemos ser exhaustivos ni mucho menos pero siacute queremosaprender lo suficiente como para evitarnos los problemas maacutes habituales en los casos maacutes sencillosPara cerrar este apartado es conveniente haber visto el error que se produce cuando el fichero quetratamos de leer desde R no existe o no estaacute en el directorio de trabajo

Ejercicio 4Prueba a ejecutar

errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)

y fiacutejate en el mensaje de error Solucioacuten en la paacutegina 47

Otra variante del fichero de entrada

Los ficheros csv que contienen un uacutenico vector (en lugar de una tabla de datos) pueden adoptarformatos distintos del que acabamos de ver Por ejemplo el fichero adjunto

contiene los mismos datos que Tut02-Edadescsv pero ahora los datos del vector estaacuten todos enuna fila y separados por comas Guaacuterdalo como antes en la subcarpeta datos El aspecto delfichero visto a traveacutes de un editor de texto es este (soacutelo son visibles una parte de los datos)

14

67888995878776675894757759477785897466698676766865566858597695788710787568873567577584888676685658697

Desde luego no nos podemos plantear transformar a mano este vector en uno como el anteriorLa solucioacuten que te proponemos pasa por la hoja de caacutelculo y la opcioacuten de trasponer una tablaque hemos visto en el Tutorial-00 lo leeriacuteamos en una fila de la hoja y luego habriacutea que usar elPegado especial para trasponerlo -es decir girarlo- para finalmente volver a guardarlo Alterna-tivamente hay otras soluciones sin salir de R usando una funcioacuten llamada scan o usando de nuevoreadtable y trasponiendo la tabla dentro de R Esos meacutetodos son sencillos cuando se aprendeun poco maacutes sobre R pero por el momento y para los ejemplos sencillos que encontraremos nosvamos a conformar con ese enfoque baacutesico que usa la hoja de Caacutelculo si es necesario

31 Coacutemo obtener ayuda y usar el tabulador en RStudioVamos a aprovechar estos ejemplos de lectura de ficheros csv para aprender a obtener ayuda sobrelas funciones de R La mayoriacutea de las funciones de R como la funcioacuten readtable o la funcioacutenscan que hemos mencionado al final del anterior apartado tienen muchos argumentos opcionalesY hay muchiacutesimas funciones en R (cada vez maacutes porque como veremos maacutes adelante usuarios detodo el mundo antildeaden constantemente funciones nuevas a R cuando las necesitan) No es posiblerecordar todos esas funciones cada una con sus opciones asiacute que es muy importante aprender aobtener esa informacioacuten cuando la necesitamosPara ver como obtener esa informacioacuten en RStudio vamos a usar por ejemplo la funcioacuten scanSituacuteate en una liacutenea vaciacutea de la Consola de Comandos escribe scan y a continuacioacuten mientras elcursor parpadea junto a la n final de scan pulsa la tecla del tabulador (si esto no funciona usa latecla F1 y mira el panel ayuda de RStudio) Veraacutes aparecer una ventana emergente con informacioacutensobre la funcioacuten scan como en esta figura

15

Como ves se muestra un resumen sobre la funcioacuten scan que a veces seraacute suficiente Si necesitasmaacutes detalles haz caso a la indicacioacuten que aparece al final de esa ventana y pulsa la tecla F1 Alhacerlo veraacutes que en el panel inferior derecho de RStudio aparece el fichero de ayuda de la funcioacutenscan como en esta figura

Esos ficheros de ayuda son muy uacutetiles aunque al principio pueden resultar un poco intimidatoriosya sea por un exceso de informacioacuten ya sea porque se da por supuesto que el usuario ya entiendealgunos conceptos baacutesicos de R Podemos garantizar al lector que a medida que se progresa en Rla utilidad de estos ficheros aumentaPero la utilidad de la tecla tabulador en RStudio no se acaba ahiacute Supongamos que quieres aplicarreadtable para leer el fichero Tut02-Edadescsv Pero te da pereza escribir un nombre tan largoo no recuerdas exactamente el nombre o dudas entre dos nombres no importa cual sea el motivoEmpiezas a escribir la orden tecleas

(vectorEdades2 = readtable(datos

y de nuevo justo en este punto pulsas el tabulador Entonces RStudio te ofrece en una nuevaventana emergente todos los ficheros disponibles en la carpeta datos

Y ahora puedes usar esa lista seleccionar el fichero que quieras utilizar Puedes tambieacuten teclearalguna letra maacutes del nombre para acotar auacuten maacutes la buacutesqueda cuando la carpeta contiene muchosficherosEn general la idea es que en RStudio el tabulador es tu amigo Como tendremos ocasioacuten decomprobar RStudio nos ofrece bastante ayuda para hacer maacutes coacutemodo nuestro trabajo con R yel tabulador es una de las herramientas maacutes versaacutetiles y uacutetiles

16

32 El camino contrario escribir un vector a un fichero de tipo csvHemos aprendido a leer con R vectores de datos a partir de ficheros de tipo csv Pero muchasveces despueacutes de hacer operaciones en R obtendremos como resultados nuevos vectores (y maacutesadelante en el curso otro tipo de objetos) Lo natural entonces es aprender a guardar ese vectoren un fichero de tipo csv como el fichero con el que empezamos De esa forma por ejemplo puedescompartir tus resultados con otras personas que utilicen programas distintos de R Para ello siantes usaacutebamos la funcioacuten readtable ahora vamos a usar la funcioacuten writetable de R

Como ejemplo vamos a utilizar este vector de nuacutemeros enteros

29 17 63 31 55 9 92 61 10 16 63 6 61 59 66 41 68 6 99 21 87 68 52 83 66 98 45 5024 100 83 37 44 4 97 67 56 74 75 71 55 22 86 22 93 65 38 84 54 83 100 71 99 1963 11 11 62 91 20 79 42 59 95 70 74 8 25 45 58 57 75 81 34 70 68 39 12 14 21

Ejercicio 5Usa copiar y pegar a partir de este documento pdf para crear un vector de R llamado muestraque contenga esos datos

Para guardar ese vector muestra en un fichero csv (dentro de la subcarpeta datos del directoriode trabajo) podemos utilizar la funcioacuten writetable usando como argumentos

El nombre del vector que queremos guardar que es muestra

Y el nombre del fichero en el que lo guardamos Vamos llamarlo por ejemplo Tut02-muestracsvLe indicamos a R ademaacutes que lo ponga en la subcarpeta datos

La opcioacuten colnames = FALSE o colnames = TRUE para decidir si queremos que R incluyauna liacutenea de cabecera con el nombre de la variable que en este caso es muestra (y que novamos a incluir)

La opcioacuten rownames = FALSE para evitar que R incluya nuacutemeros de fila en el fichero desalida (normalmente no querremos esos nuacutemeros)

Es decir que ejecutamos

writetable(muestrafile = datosTut02-muestracsv colnames=FALSE rownames=FALSE)

Al ejecutar esa orden el fichero que obtenemos tiene la forma deseada (de nuevo soacutelo es visible elcomienzo del fichero)

17

Puedes probar a abrirlo en Calc para ver que es un fichero de datos como los que hemos visto hastaahora

Naturalmente apenas hemos rozado el tema de la entradasalida de datos en R Pero con lo quehemos aprendido en este apartado estamos listos para empezar a hacer Estadiacutestica Descriptivausando ejemplos que no sean demasiado triviales

4 Estadiacutestica descriptiva de una variable cuantitativa condatos no agrupados

Para seguir adelante tenemos que empezar por aprender un poco maacutes sobre la forma en la que Rpermite operar con los vectores Vamos a hacerlo a traveacutes de una serie de ejercicios-ejemplos

Ejercicio 6

1 Vamos a definir dos vectores cada uno de ellos con 12 nuacutemeros enteros El primero al quellamaremos vector1 estaacute formado por

8 5 19 9 17 2 28 18 3 4 19 1

Usa copiar y pegar a partir de este fichero pdf para definir el vector1 en R

2 El segundo vector al que en un rapto de originalidad llamaremos vector2 estaacute almacenadoen el fichero

Guaacuterdalo en datos y examiacutenalo primero con un editor de texto (como el Bloc de Notas)para ver coacutemo estaacuten almacenados los datos en ese fichero Una vez hecho esto usa Calc yla funcioacuten readtable para almacenar el contenido de ese fichero csv en el vector2 de REn alguacuten momento del proceso puede que tengas que usar el pegado especial de Calc paratrasponer los datos

Solucioacuten en la paacutegina 47

41 Aritmeacutetica vectorial en RAhora vamos a sumar los dos vectores Ejecuta el comando

vector1 + vector2

para comprobar que el resultado es la suma componente a componente de los dos vectores

gt vector1 + vector2[1] 26 23 39 21 37 3 58 24 29 24 34 26

Este resultado es bastante previsible Lo que quizaacute resulteacute un poco maacutes inesperado es que simultiplicas los dos vectores tambieacuten se obtienen los productos componente a componente el primerelemento de vector1 se multiplica por el primero de vector2 el segundo por el segundo etc

gt vector1 vector2[1] 144 90 380 108 340 2 840 108 78 80 285 25

Esta forma de operar de R como veremos pronto es muy uacutetil Si lo piensas un momento cadavector numeacuterico de R se corresponde con una columna de una hoja de caacutelculo como las queusaacutebamos en el Tutorial01 Alliacute vimos que para algunas operaciones era necesario multiplicar doscolumnas elemento a elemento En Calc esa operacioacuten no es complicada pero en R es auacuten maacutes faacutecilBasta con un comando como vector1 vector2 para conseguir el objetivo Veremos muchos maacutesejemplos a lo largo del curso en los que una operacioacuten que en Calc requeririacutea bastantes pasosen R se reduce a ejecutar un uacutenico comandoEn R las operaciones con vectores siguen en general este esquema de funcionamiento componentea componente Si por ejemplo ejecutas

18

1818201220130626201525

gt vector1 + 5[1] 13 10 24 14 22 7 33 23 8 9 24 6gt 2 vector1[1] 16 10 38 18 34 4 56 36 6 8 38 2

veraacutes que en el primer caso cada uno de los elementos de vector1 se ha incrementado en 5mientras que en el segundo caso cada uno se ha multiplicado por 2 Sucede lo mismo con otrasoperaciones como elevar al cuadrado

gt vector1^2[1] 64 25 361 81 289 4 784 324 9 16 361 1

Y podemos aplicar funciones en un solo paso Por ejemplo podemos calcular el logaritmo neperianode todos los elementos de un vector en un soacutelo paso

gt log(vector1)[1] 20794415 16094379 29444390 21972246 28332133 06931472[7] 33322045 28903718 10986123 13862944 29444390 00000000

Los resultados de todas estas operaciones son de nuevo vectores Y por tanto se pueden asignara nuevas variables para utilizarlos en nuestras operaciones Por ejemplo si luego vas a necesitar loslogaritmos de vector1 puedes definir una variable para identificar ese vector llamada logVector1(e el nombre que tuacute quieras) haciendo

gt logVector1 = log(vector1)

Recuerda que si ademaacutes de la asignacioacuten quieres ver el resultado puedes rodear toda esta senten-cia con pareacutentesis De lo contrario R la ejecuta pero no imprime ninguna respuesta como ya sabes

Aunque al principio puede parecer complicado cuando te acostumbres a esta forma de trabajarcon vectores veraacutes que resulta muy coacutemoda y eficiente

Generando vectores de nuacutemeros enteros consecutivos

Hay muchas ocasiones en que para alguna operacioacuten necesitamos un vector que contenga losnuacutemeros enteros consecutivos del 1 al n o del 0 al n etc En R esto es muy faacutecil de hacer Porejemplo para conseguir un vector con los nuacutemeros del 1 al 15 basta con ejecutar

gt 115[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Esa notacioacuten con los dos puntos permite generar vectores en los que cada elemento es igual alanterior maacutes 1 Otro ejemplo

gt -713[1] -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13

O incluso cuando los puntos de partida no son enteros

gt 1575[1] 15 25 35 45 55 65 75gt 1574[1] 15 25 35 45 55 65

iquestVes la diferencia entre estos dos casos

Es muy posible que te esteacutes preguntando iquesty si quiero ir avanzando de 2 en 2 o quiero ir hacia atraacutes(ldquoavanzandordquo de minus2 en minus2 por ejemplo) Pronto cuando hayamos aprendido un poco maacutes volve-remos sobre esto y comprobaremos que R nos ofrece un cataacutelogo de herramientas extremadamentepotentes para fabricar vectores de acuerdo con nuestros deseos y necesidadesLos vectores fabricados con este meacutetodo son vectores iguales que los demaacutes y se pueden asignar avariables operar con ellos etc

19

Ejercicio 7

1 Fabrica un vector con los cuadrados de los nuacutemeros del 1 al 10 y asiacutegnalo a la variablecuadrados Usa los pareacutentesis para ver el resultado de la asignacioacuten

2 Haz lo mismo con los cuadrados de los nuacutemeros del 2 al 11 y un vector cuadrados2

3 Resta los vectores cuadrados2 - cuadrados iquestObservas algo interesante

Solucioacuten en la paacutegina 47

Funciones vectoriales

Hemos visto antes que se puede aplicar una funcioacuten como la raiacutez cuadrada a un vector y seobtiene como resultado otro vector con las raiacuteces cuadradas elemento a elemento Pero hay otrotipo de funciones que permiten hacer caacutelculos con el vector en conjunto Por ejemplo antes hemosfabricado el vector -713 y la funcioacuten length nos dice cuantos elementos tiene ese vector

gt length(-713)[1] 21

En el Ejercicio 3 (paacuteg 13) nos preguntaacutebamos cuantos elementos teniacutea el vector vectorEdades quehabiacuteamos cargado desde el fichero csv Puedes obtener la respuesta con length(vectorEdades)Para comprobarlo aseguacuterate de que has creado el vector llamado vectorEdades y ejecuta estaorden

gt length(vectorEdades)[1] 100

Como ves el resultado de length es el esperado

Vamos a conocer otra funcioacuten llamada sum que sirve para calcular la suma de todos los elementosde un vector

gt sum(vectorEdades)[1] 675

Ejercicio 8iquestCuaacutento vale la suma de los cuadrados de los nuacutemeros del 1 al 100 Solucioacuten en la paacutegina 47

A lo mejor te ha pasado desapercibido pero con las funciones length y sum estamos por fin encondiciones de empezar a hacer Estadiacutestica Descriptiva Por ejemplo podemos calcular la mediaaritmeacutetica de vectorEdades

gt ( mediaEdades = sum(vectorEdades) length(vectorEdades) )[1] 675

Y una vez que tenemos la media podemos calcular la varianza poblacional Para que resulte maacutesclaro vamos a mostrarte el proceso paso a paso aunque al final lo ejecutaremos en un soacutelo paso

1 Empezamos restando la media que estaacute en la variable mediaEdades de cada uno de loselementos de vectorEdades

vectorEdades - mediaEdades

El resultado es un vector de diferencias

2 Ahora elevamos cada una de esas diferencias al cuadrado

( vectorEdades - mediaEdades )^2

El resultado de este paso es de nuevo un vector ahora con las diferencias al cuadrado Fiacutejateen el pareacutentesis para garantizar que elevamos al cuadrado la diferencia Si no incluyeacuteramosel pareacutentesis iquestqueacute calculariacuteamos

20

3 A continuacioacuten sumamos todas esas diferencias al cuadrado usando la funcioacuten sum

sum( ( vectorEdades - mediaEdades )^2)

De nuevo el pareacutentesis es fundamental para que el cuadrado del vector de diferencias secalcule antes que la suma En este paso el resultado ya no es un vector sino un nuacutemero

4 Por uacuteltimo dividimos esa suma por n el nuacutemero de elementos de vectorEdades que seobtiene con la funcioacuten length

sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades)

El resultado de estos pasos se puede condensar en un soacutelo comando de R en el que a la vezcalculamos la varianza y la asignamos a una variable

gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades) )[1] 19875

Ejercicio 9

1 Calcula la desviacioacuten tiacutepica (poblacional) de vectorEdades

2 Calcula la cuasivarianza y cuasidesviacioacuten tiacutepica (muestrales) de vectorEdades

3 iquestQueacute sucede si en el tercer paso ejecutas el siguiente comandosum( vectorEdades - mediaEdades )^2iquestPor queacute sucede esto

Solucioacuten en la paacutegina 48

Con estos caacutelculos hemos empezado a hacer Estadiacutestica con R Naturalmente nos queda muchiacutesimoque aprender sobre los vectores de R Por ejemplo como se accede a una componente individualdel vector para responder a preguntas como ldquoiquestCuaacutento vale el quinto elemento del vectorrdquo Maacutesen general aprenderemos a extraer aquellos elementos del vector que cumplan alguna condicioacutenrespondiendo a preguntas como ldquoiquestQueacute elementos del vector son mayores que 7rdquo

42 Y por fin hagamos Estadiacutestica DescriptivaEn esta seccioacuten vamos a trabajar con un vector de datos contenido en este fichero adjunto

Este vector contiene los datos de la variable var3 del fichero Tut01-PracticaConCalccsv queya hemos utilizado en el Tutorial-00 para aprender a hacer Estadiacutestica Descriptiva con Calc Enesta seccioacuten vamos a reproducir los resultados que obtuvimos alliacute pero esta vez usando R Parapreparar el terreno vamos a hacer limpieza

Ejercicio 10

1 Cierra Rstudio y vuelve a abrirlo para limpiar la memora del sistema El trabajo que hemoshecho hasta ahora se perderaacute (aunque los comandos siguen en el Historial de Comandos queya vimos)

2 Establece el Directorio de Trabajo (por ejemplo el Escritorio) y aseguacuterate de que Tut02-var3csvestaacute guardado en la subcarpeta datos de ese directorio

3 Carga de nuevo el contenido de ese fichero en un vector var3 de R

Solucioacuten en la paacutegina 48

Veraacutes en lo que sigue que siempre que calculamos un objeto le asignamos una variable Eso permiteahorrarse la repeticioacuten innecesaria de caacutelculos si maacutes adelante volvemos a necesitar ese objeto Yen algunos casos como veremos maacutes adelante al hacer esto podemos acceder a propiedades delobjeto calculado que R no muestra en su respuesta por defecto

21

4 138 134 134 135 135 133 136 136 132 134 134 133 133 133 132 136 134 135 132 135 136 135 132 136 134 135 133 134 134 134 1310 136 138 134 135 137 133 135 138 136 137 135 134 137 135 136 138 137 134 133 135 135 134 131 135 137 133 133 137 136 135 135 132 138 135 135 135 136 135 133 1311 136 1310 134 131 133 138 139 135 134 1310 134 134 137 135 134 133 132 135 132 136 135 134 133 139 136 135 134 135 132 132 138 134 133 136 138 134 134 134 138 134 132 135 1310 136 1312 135 139 135 138 138 135 132 135 1310 136 135 136 135 135 137 134 133 134 133 133 134 133 133 133 133 137 138 135 134 135 134 135 137 135 133 134 134 137 133 132 135 137 135 134 136 132 135 132 136 1310 134 132 139 134 136 136 132 137 134 138 135 135 134 134 137 134 136 136 135 134 133 135 133 133 136 132 133 134 138 138 137 137 136 135 1310 134 134 134 138 136 134 136 137 135 135 136 138 134 138 134 135 137 136 134 137 137 135 137 132 136 135 133 135 136 130 133 135 135 137 134 137 131 135 136 135 138 132 134 136 139 137 1310 134 135 136 132 135 135 135 1313 133 136 133 136 135 130 1310 134 136 136 134 131 133 135 137 136 133 135 133 134 132 132 138 138 134 136 135 135 134 133 139 134 139 136 1311 133 132 132 136 138 1310 133 137 133 134 135 139 133 135 133 134 138 139 132 138 133 133 137 138 136 133 135 134 132 1311 137 137 136 134 133 135 1310 135 134 135 133 135 136 135 139 135 134 135 135 134 133 137 134 1310 135 134 132 139 134 137 133 135 134 131 136 135 136 134 138 135 135 138 138 134 132 135 133 134 138 138 135 138 132 1311 135 134 134 136 139 1310 137 134 137 132 133 135 1310 135 135 133 135 136 134 134 136 135 137 136 136 134 133 134 135 132 134 136 139 133 135 133 136 133 133 135 134 134 134 137 135 139 1310 133 134 136 131 137 138 135 133 133 135 133 133 137 136 135 135 138 134 139 136 135 135 138 134 130 133 137 133 134 1311 132 137 133 136 135 133 134 133 133 132 138 133 134 134 134 134 138 138 137 136 132 132 137 135 133 135 138 135 134 135 134 135 134 1312 133 135 133 133 133 132 134 131 139 135 135 135 138 138 135 138 133 134 133 136 136 135 134 133 133 135 133 137 135 132 133 133 132 131 132 136 137 130 136 133 134 1310 132 136 137 134 133 132 138 133 135 133 135 136 132 134 134 133 135 135 135 134 134 136 133 132 138 1310 135 135 132 132 137 136 134 135 134 134 136 134 136 135 133 137 137 136 137 134 134 137 133 130 134 136 135 137 136 136 135 137 134 134 135 136 136 135 136 132 134 133 139 135 133 137 135 136 137 136 136 136 134 135 137 137 133 134 137 137 136 133 134 137 131 135 136 133 137 133 135 133 137 138 133 137 132 135 134 133 132 135 134 134 135 133 134 139 135 134 139 137 133 132 133 134 133 134 135 135 138 134 135 134 135 139 137 133 133 132 136 132 138 135 132 137 134 135 136 132 134 135 135 133 135 136 137 135 138 132 131 137 135 135 138 134 137 136 139 1310 137 134 131 136 132 136 137 133 135 137 135 132 135 135 133 133 137 134 133 133 131 138 139 132 134 138 135 136 138 137 1310 138 133 134 134 135 134 134 135 136 135 134 134 135 133 136 135 137 132 133 139 132 133 137 136 134 137 131 135 134 132 134 138 135 134 131 132 134 135 136 133 134 138 134 132 135 134 132 134 133 136 135 138 133 139 1310 134 133 133 137 137 136 137 133 133 133 135 139 136 136 137 136 135 132 132 139 136 132 139 132 137 135 133 138 137 135 134 136 131 133 135 133 134 137 135 134 132 136 136 136 137 133 132 135 134 135 134 137 134 133 133 134 132 134 135 134 134 136 134 135 138 133 135 135 138 133 135 134 135 135 138 1311 132 134 134 136 133 135 133 136 132 131 136 134 136 132 136 136 136 136 130 136 134 134 131 138 131 1310 135 139 136 132 136 138 135 138 134 132 134 133 136 137 133 133 133 133 137 136 135 133 139 133 132 135 136 136 134 132 132 135 137 136 136 136 138 137 137 135 135 131 136 133 136 135 133 134 130 133 135 136 137 138 136 134 135 132 137 132 137 132 133 134 135 138 134 136 133 135 135 139 134 134 136 134 134 134 135 134 133 135 135 138 133 136 136 134 135 134 134 138 136 133 137 132 134 137 136 135 133 134 133 135 134 134 136 134 133 137 133 135 135 136 135 138 134 136 132 137 136 138 134 136 136 137 136 136 135 136 1310 138 133 137 135 136 137 134 136 133 134 133 132 132 134 137 132 132 133 132 138 134 134 135 135 139 135 134 132 134 135 134 139 137 133 134 134 135 133 133 137 138 135 139 133 138 136 136 134 133 136 135 1314 137 133 137 135 136 134 134 136 133 135 134 135 136 136 135 133 135 131 135 137 135 136 133 137 135 134 133 134 134 134 134 134 136 132 134 136 136 137 139 134 138 133 133 132 135 131 134 133 137 133 133 134 139 138 134 134 137 137 135 136 134 139 137 138 134 133 134 134 135 137 134 135 138 133 132 134 1310 133 135 134 132 138 137 136 135 138 1314 139 135 135 131 134 135 134 135 135 135 133 136 135 135 132 136 139 133 133 136 134 132 132 137 136 131 137 135 135 134 1313 1310 132 134 134 133 138 135 134 133 136 136 136 1310 134 137 136 138 139 137 135 134 134 137 137 138 133 134 135 137 135 136 1310 136 136 138 133 136 133 134 135 135 134 136 133 136 136 137 134 135 1316 136 136 132 136 136 133 134 133 137 134 135 134 133 138 134 1310 136 136 136 137 134 136 137 132 138 136 131 132 134 135 130 134 135 135 137 130 136 135 131 136 137 133 137 135 139 138 135 139 133 137 139 133 136 137 136 138 134 1310 136 134 133 139 136 137 133 13713

Rango maacuteximo y miacutenimo

Para empezar vamos a aprender tres nuevas funciones de R que nos permiten calcular esos tresvalores

gt (minimo = min(var3) )[1] 0gt (maximo = max(var3) )[1] 16gt (rango = range(var3) )[1] 0 16

El funcionamiento de las dos primeras es evidente La funcioacuten range devuelve un vector formadopor el maacuteximo y el miacutenimo

Tablas de frecuencia Clases de objetos en R

La tabla de frecuencia absoluta de var3 se obtiene usando la funcioacuten table de esta forma tansencilla

gt ( tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

La primera fila contiene los elementos de var3 y en la segunda aparece la frecuencia de cada unode ellos Puedes comprobar que son los mismos resultados que obtuvimos con Calc en la paacutegina10 del Tutorial01 Aunque alliacute desde luego el proceso fue maacutes laborioso

A lo mejor te has dado cuenta de que el formato de la respuesta es diferente de los que hemosobtenido hasta ahora Para empezar la respuesta no empieza con el [1] al que ya nos vamosacostumbrando El motivo de esto es que el objeto que hemos obtenido como respuesta no es unvector sino una tabla Ya dijimos que R utiliza distintos tipos de objetos con fines distintosiquestCoacutemo podemos saber de queacute clase es un objeto Pues usando una funcioacuten de R oportunamentellamada class Si la usamos con el vector var3 y con su tabla de frecuencias obtenemos

gt class(var3)[1] numericgt class(tablaFrecAbs)[1] table

El vector var3 es de clase numeric porque es un vector de nuacutemeros Y la tabla de frecuencias esde clase table Veremos a lo largo del curso otros objetos de tipo tabular como las matrices (clasematrix) los conjuntos de datos (clase dataframe) y los arraysAunque las tablas son objetos distintos de los vectores tienen algunas propiedades en comuacuten yalgunas de las funciones que hemos usado con vectores tambieacuten se pueden usar con tablas

Ejercicio 11Aplica las funciones length sum min max y range a la tabla tablaFrecAbs Solucioacuten en la paacutegina48

Siguiendo con los parecidos entre tablas y vectores puedes multiplicar (o dividir) una tabla porun nuacutemero y la operacioacuten se haraacute elemento a elemento

gt 2 tablaFrecAbsvar30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1618 50 200 376 488 492 372 262 174 86 56 12 4 4 4 2

Como ves cada frecuencia se multiplica por 2 Esta propiedad de las tablas permite obtener deforma muy sencilla la tabla de frecuencias relativa de var3 Como primer paso vamos a guardarla longitud de var3 en la variable n

22

gt ( n = length( var3 ) )[1] 1300

Y ahora podemos dividir la tabla por n para conseguir la tabla de frecuencias relativas (hemosestrechado la Consola de Comandos para que el resultado cupiera en esta paacutegina)

gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 400069230769 00192307692 00769230769 01446153846 01876923077

5 6 7 8 901892307692 01430769231 01007692308 00669230769 00330769231

10 11 12 13 1400215384615 00046153846 00015384615 00015384615 00015384615

1600007692308

Ejercicio 12Ya sabemos cuanto debe sumar esta tabla de frecuencias relativas Comprueacutebalo Solucioacuten en lapaacutegina 48

Si lo que queremos es una tabla de frecuencias acumuladas debemos emplear la funcioacuten cumsum

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Ejercicio 13La uacuteltima tabla que falta es la de frecuencias relativas acumuladas pero ya tienes todos los ingre-dientes para obtenerla de dos maneras diferentes Hazlo y comprueba si dan el mismo resultadoSi no es asiacute iquesta queacute crees que se debe y cuaacutel es la mejor opcioacuten Asigna el resultado a la variabletablaFrecRelAcu Solucioacuten en la paacutegina 49

Graacuteficos de columnas y diagramas de caja (boxplot) Argumentos con nombre

Vamos a fabricar nuestros primeros graacuteficos con R En concreto vamos a dibujar un graacutefico debarras a partir de la tabla de frecuencias de var3 usando la funcioacuten barplot de R

gt barplot(tablaFrecAbs)

Al ejecutar este comando no debes ver ninguna salida en la Consola de Comandos En su lugaren el panel inferior derecho de RStudio concretamente en la ventana Plots apareceraacute el graacuteficodeseado El resultado puede variar dependiendo de la anchura de tu ventana de RStudio

23

Hemos destacado ademaacutes en la figura los dos botones Zoom y Export que te permiten respecti-vamente ver una versioacuten ampliada de la Figura (que se redimensiona dinaacutemicamente si cambiasla ventana) y guardar esa figura como un fichero de graacuteficos que puedes insertar en cualquierdocumento editar con un programa de manipulacioacuten de graacuteficos etceacuteteraLos graacuteficos de R se pueden controlar hasta en sus detalles maacutes miacutenimos Como aperitivo miacutenimovamos a antildeadir algo de color al graacutefico

gt barplot(tablaFrecAbs col = heatcolors(15))

El resultado es esta figura

Las posibilidades de control de los graacuteficos de R son como decimos inmensas y pueden llegar aser abrumadoras Hay libros de cientos de paacuteginas dedicados a este tema como el R GraphicsCookbook de W Chang (ver las referencias del curso) Nosotros a lo largo de los tutoriales delcurso vamos a aprender algo maacutes aunque a penas nos podremos limitar a rozar la superficie delo que se puede llegar a hacerEn la Seccioacuten 231 del libro hemos descrito los diagramas de cajas o boxplots (recuerda la Figura22 de la paacuteg 36 del libro) Y en el Tutorial-01 dijimos que con Calc no es faacutecil dibujar ese tipode diagramas En cambio con R no podriacutea ser maacutes faacutecil

gt boxplot(var3)

Y el resultado es esta figura

24

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

gt 3^2[1] 9gt sqrt(9)[1] 3gt 2+3[1] 5gt 15-7[1] 8gt 46[1] 24gt 135[1] 26gt 135[1] 2gt 135[1] 3gt 13+15[1] 05333333gt sqrt(25)[1] 5gt sqrt(26)[1] 509902gt sin(pi)[1] 1224606e-16gt sin(314)[1] 0001592653

Tabla 1 Resultados del Ejercicio 1

Por ejemplo para distinguir entre las dos interpretaciones que hemos dado puedes escribir

(13)+(15)

o por el contrario

1 ( (3+1)5 )

Un uso prudente de pareacutentesis y espacios en las operaciones es una marca caracteriacutestica delbuen hacer cuando se escribe coacutedigo en un ordenador Si alguna vez esto llega a ser unproblema para ti habraacute llegado el momento de aprender algo maacutes sobre esa prioridad deoperadores

La funcioacuten sin es la funcioacuten seno de la Trigonometriacutea Ademaacutes R utiliza el siacutembolo pi parareferirse a la constante matemaacutetica π asymp 3141593 Y el caraacutecter numeacuterico de R se refleja denuevo en el hecho de que al ejecutar sin(pi) no has obtenido 0 (que es la respuesta exacta)sino

gt sin(pi)[1] 1224606e-16

La notacioacuten que se usa en la respuesta es la forma tiacutepica de traducir la notacioacuten cientiacutefica alos lenguajes de ordenador y calculadoras El siacutembolo 1224606e-16 representa el nuacutemero

1224606 middot 10minus16

de manera que el nuacutemero -16 que sigue a la letra e en esta representacioacuten es el exponentede 10 (tambieacuten llamado orden de magnitud) mientras que el nuacutemero 1224606 se denominaa veces mantisa Puedes leer maacutes sobre la notacioacuten cientiacutefica en este artiacuteculo de la Wikipedia

5

httpeswikipediaorgwikiNotacioacuten_cientiacutefica

En cualquier caso el exponente -16 nos indica que se trata de un nuacutemero extremadamentecercano a 0 Fiacutejate en cambio que si usas 314 como aproximacioacuten de π la respuesta aunquepequentildea es todaviacutea del orden de mileacutesimas

11 Algunos detalles de la interfaz de RStudioAntes de avanzar maacutes queremos ocuparnos de algunos aspectos del trabajo con RStudio que amenudo causan algunos quebraderos de cabeza a quienes se inician en el uso del programa

Comandos incompletos

Para ver un ejemplo prueba a escribir en el prompt activo esta operacioacuten evidentemente incom-pleta

3

y pulsa Entrar La respuesta de R es un siacutembolo +

gt 3+

que en este caso no tiene nada que ver con la suma Es la forma que tiene R de decirnos ldquonecesitoalgo maacutesrdquo Cuando R se encuentra con una expresioacuten que considera no erroacutenea sino incompleta(por ejemplo con un pareacutentesis abierto al que corresponde un pareacutentesis cerrado) entonces nos locomunica con este siacutembolo + Y al hacerlo nos da la oportunidad en casos como este de corregirel error completando la expresioacuten incompleta Asiacute que si ahora junto al siacutembolo + escribes 2 deesta forma

gt 3+ 2

y pulsas Entrar veraacutes que R ha entendido la expresioacuten completa 32 y nso devuelve la respuesta

gt 3+ 2[1] 6

En alguacuten momento no obstante ese siacutembolo + de los comandos incompletos se convertiraacute en uninconveniente Imagiacutenate por ejemplo que queriacuteas multiplicar 5 middot7 pero que por error has tecleadola expresioacuten

57-

y has pulsado Entrar antes de darte cuenta del error En tal caso R piensa que esa expresioacuten estaacuteincompleta y vuelve a aparecer el signo +

gt 57-+

iexclPero ahora no queremos antildeadir nada En este caso podriacuteas antildeadir un 0 sin que eso afectara elresultado pero habraacute maacutes adelante muchos casos en los que no hay una solucioacuten sencilla evidenteiquestCoacutemo salimos del paso Simplemente pulsamos la tecla Esc (escape) con lo que R interrumpe elcomando y nos devuelve a un nuevo prompt activo sin calcular nada

Navegando el historial de comandos

En un caso como el que hemos descrito no supone un problema volver a teclear la expresioacutenevitando el error que habiacuteamos cometido Pero en ocasiones si hemos escrito una expresioacuten real-mente complicada y por ejemplo hemos tecleado un pareacutentesis de maacutes en medio de la expresioacutenseguramente prefeririacuteamos no tener que volver a teclear la expresioacuten completa Un remedio ldquocaserordquoconsiste en seleccionar y copiar la expresioacuten erroacutenea pegarla en el prompt activo y editarla ahiacutepara corregir el errorHay una segunda manera de conseguir el mismo efecto Otra caracteriacutestica interesante de la Consolade Comandos es que si te situacuteas en el prompt activo y pulsas las teclas con flechas arriba o abajoveraacutes pasar la lista completa de comandos que has ejecutado desde el principio de la sesioacuten detrabajo Prueba a hacerlo ahora para ver como funciona Si has ejecutado todos los comandosque hemos ido describiendo en este tutorial puedes pulsar la flecha uarr repetidamente e iraacutes viendopasar todos esos comandos hasta llegar al

6

3^2

con el que hemos empezado Y con la flecha hacia abajo recorres la lista en sentido contrario hastael comando de ejecucioacuten maacutes reciente Esa lista de comandos es el Historial de Comandos Usandolas flechas arriba y abajo puedes recorrer el Historial de Comandos detenerte en cualquier puntomodificar ese comando si lo deseas y despueacutes ejecutarlo (con o sin modificaciones) Al principiopuede que te cueste un poco acostumbrarte pero una vez que te habituacutees a esta herramientala encontraraacutes sin duda muy uacutetil El Historial de Comandos que puedes recorrer con las flechasarriba y abajo se limita a la sesioacuten de trabajo actual Pero si miras en el panel superior derecho deRStudio veraacutes una pestantildea titulada History que se muestra en esta figura

El Historial de Comandos que aparece en ese panel refleja tus comandos de esta y anterioressesiones Si esta es tu primera sesioacuten de trabajo con R ambos coincidiraacuten claro estaacute Pero a medidaque vayas abriendo RStudio en diacuteas sucesivos te puede resultar muy uacutetil localizar por ejemploun comando que usaste hace dos sesiones pero que no recuerdas exactamente Los comandos queaparecen en ese panel se pueden copiar y pegar en la Consola de Comandos o de forma maacutes directapuedes seleccionar uno de ellos con el ratoacuten y pulsar en el botoacuten To Console que hemos destacadoen la Figura

111 Errores

Los errores son inevitables y nos conviene estar preparados para su aparicioacuten Dependiendo delmotivo del error R nos informaraacute con distintos tipos de mensajes Asiacute que vamos a ver algunosejemplos para conocer la terminologiacutea asociadaPara empezar este es el mensaje de error que obtenemos tras ejecutar una expresioacuten sin sentido

gt 43Error unexpected rsquorsquo in 4

Los mensajes de error aparecen en color rojo en RStudio Este mensaje de error en particulares bastante faacutecil de entender R simplemente se queja de que esta expresioacuten es defectuosa Noincompleta como alguna que hemos visto antes Es imposible completar esta expresioacuten de formacorrectaVeamos otro tipo de mensaje de error Ya sabes que no se puede dividir por 0 Si lo intentamos enR

gt 20[1] Inf

7

el siacutembolo Inf (de infinito) nos avisa del problema Ese siacutembolo tambieacuten puede aparecer con signomenos si por ejemplo tratas de calcular el logaritmo neperiano de 0 En R el logaritmo neperianoes la funcioacuten log asiacute que seriacutea

gt log(0)[1] -Inf

En ambos casos R no lanza un mensaje de error pero utiliza el siacutembolo de infinito porque asiacute nosproporciona maacutes informacioacuten matemaacutetica sobre lo que ha ocurrido Tambieacuten puede suceder queel siacutembolo Inf aparezca como resultado intermedio en una expresioacuten En ese caso R aplica unasreglas sencillas de aritmeacutetica con infinitos para tratar de darnos la respuesta maacutes coherente desdeel punto de vista matemaacutetico Por ejemplo si calculas

3(-5(4-2^2))

Entonces R empieza calculando el resultado del pareacutentesis 4-2ˆ2 que es 0 Asiacute que al dividir minus5entre 0 R obtiene -Inf y finalmente al calcular 3(-Inf) se obtiene -Inf como valor de laexpresioacuten Comprobeacutemoslo

gt 3(-5(4-2^2))[1] -Inf

A pesar de que R no lanza mensajes de error estaacute claro que en la mayoriacutea de los casos no esdeseable que nuestros caacutelculos produzcan Inf como resultado en ninguna etapaEn otros casos el problema es diferente Por ejemplo si tratas de calcular la raiacutez cuadrada de unnuacutemero negativo

gt sqrt(-4)[1] NaNWarning messageIn sqrt(-4) NaNs produced

En este caso obtenemos una respuesta NaN y ademaacutes una advertencia (warning) sobre la aparicioacutende esa respuesta El siacutembolo NaN es la abreviatura de Not a Number es decir ldquono es un nuacutemerordquo Estaes la respuesta que obtendremos cuando tratamos de hacer operaciones como esta que producencomo resultado un nuacutemero complejo R es capaz de trabajar con los nuacutemeros complejos pero comono los vamos a necesitar en el curso no nos ocuparemos de esto Para que veas otro ejemplo esarespuesta NaN aparece tambieacuten si tratamos de ir demasiado lejos con la aritmeacutetica con infinitos

gt (10)+log(0)[1] NaN

En este caso R se ha encontrado en un paso intermedio con Inf - Inf y su respuesta ha sido NaN

En cualquier caso y como resumen final tenemos que tratar de evitar que nuestros caacutelculos con-duzcan a este tipo de expresiones

Haciendo limpieza en la Consola de Comandos

Si has seguido todas las instrucciones hasta aquiacute tu Consola de Comandos seguramente empiezaa estar llena de comandos y algunos pueden quedar ocultos en la parte superior Naturalmentepuedes usar las barras de desplazamiento para moverte por la Consola Pero en sesiones largas detrabajo o cuando hemos terminado de hacer pruebas y queremos ejecutar una versioacuten definitivade nuestro trabajo es normal que queramos hacer limpieza en la Consola Eso se consigue con lacombinacioacuten de teclas Ctrl + L iexclCuidado Es un proceso no reversible podraacutes seguir navegandoel Historial de Comandos con las teclas arriba y abajo pero para recuperar los resultados tendraacutesque ejecutar de nuevo los comandosMaacutes adelante aprenderemos formas de guardar nuestro trabajo de una manera maacutes eficiente Perote podemos adelantar que puesto R se maneja escribiendo comandos bastaraacute con guardar esoscomandos en ficheros de texto plano Ahora vamos a cambiar de tema y para empezar desde cerovamos a cerrar RStudio para eliminar las trazas del trabajo que hemos hecho

2 Variables y vectoresVuelve a abrir RStudio para continuar el trabajo En la seccioacuten previa hemos usado R como unacalculadora Pero para ir maacutes allaacute tenemos que disponer de estructuras de datos Ese teacutermino

8

describe en Computacioacuten las herramientas que nos permiten almacenar y procesar informacioacutenLas estructuras de datos maacutes baacutesicas de R son las variables y los vectores En proacuteximos tutorialesnos iremos encontrando con otras estructuras de datos matrices dataframes listas entre otras

21 Variables en RUna variable en R es un siacutembolo que usamos para referirnos a un valor Por ejemplo si te situacuteasen la Consola de Comandos tecleas

a = 2

y ejecutas esa instruccioacuten entonces aunque aparentemente no ha sucedido nada (porque no hayrespuesta) a partir de ese momento R ha asignado el valor 2 al siacutembolo a Asiacute que si por ejemplotecleas y ejecutas

a + 1

obtendraacutes como respuesta 3

Ejercicio 2iquestQueacute se obtiene al ejecutar estos comandos uno detraacutes de otro iquestCuaacutento valen las variables a by c al final

a = 2b = 3c = a + ba = b cb = (c - a)^2c = a b

La solucioacuten estaacute en la paacutegina 47 iexclNo la mires antes de intentar pensar el ejercicio por ti mismo

En el Capiacutetulo 1 del libro hemos hablado de variables cualitativas y cuantitativas Estas uacuteltimastoman siempre valores numeacutericos y las variables de R sirven desde luego para almacenar esa clasede valores Pero como iremos viendo en sucesivos tutoriales tambieacuten se pueden utilizar variablesde R para guardar valores de variables cualitativas (factores) y otros tipos de objetos que iremosconociendo a lo largo del curso De momento para que veas a que nos referimos recordaremos elEjemplo 111 del libro (paacuteg 6) en el que teniacuteamos una variable cualitativa ordenada que representael pronoacutestico de un paciente que ingresa en un hospital Prueba a ejecutar este coacutedigo

pronostico = Leve

simplemente para que de momento veas que

R no protesta El valor Leve es un valor perfectamente aceptable

En R los valores que representan palabras frases o como las llamaremos teacutecnicamente cadenasalfanumeacutericas se escriben siempre entre comillas Puedes usar comillas simples o dobles perote aconsejamos que uses dobles comillas

La relacioacuten entre factores y valores alfanumeacutericos en R es algo maacutes complicada de lo que estesencillo ejemplo parece sugerir Pero ya tendremos ocasioacuten en futuros tutoriales de extendernossobre eso

Asignaciones

Las instrucciones como

a = 2

o como

b = (c - a)^2

se denominan asignaciones En la primera por ejemplo decimos que hemos asignado el valor 2a la variable aQueremos advertir al lector de que en R hay otra forma esencialmente equivalente de escribir lasinstrucciones y que de hecho se usa mayoritariamente En lugar del siacutembolo = puedes conseguirel mismo efecto escribiendo lt- (el signo ldquomenorrdquo seguido sin espacios de un signo ldquomenosrdquo) Asiacuteque si ejecutas

9

a lt- 2

el resultado seraacute el mismo que antes con = Las dos notaciones tienen ventajas e inconvenientes peronosotros preferimos = porque se parece maacutes a lo que se utiliza en muchos lenguajes de programacioacuten

Coacutemo ver los resultados de un caacutelculo a la vez que lo hacemos

Ya habraacutes notado que al hacer una asignacioacuten R no produce ninguna respuesta y se limita aguardar el valor en la variable En una asignacioacuten como a=2 esto no genera ninguna duda Perosi el miembro derecho de la asignacioacuten es una expresioacuten maacutes complicada puede ser convenientepedirle a R que nos muestre el resultado de esa expresioacuten a la vez que se hace la asignacioacutenImagiacutenate por ejemplo esta situacioacuten

b = 2c = -2d = -4a = b c^2 d + 3

iquestCuaacutel es el valor que se asigna a la variable a Una forma de averiguarlo es simplemente ejecutaruna liacutenea adicional en la que aparece soacutelo el nombre de la variable que queremos inspeccionar Alejecutar esta sentencia R nos devuelve como respuesta

gt a[1] 1

Pero hay otra manera de conseguir que R nos muestre el resultado de la asignacioacuten que es maacutesinteresante porque produce coacutedigo maacutes simple Basta con encerrar toda la asignacioacuten entre pareacuten-tesis El resultado es

gt ( a = b c^2 d + 3 )[1] 1

como antes Este ejemplo es desde luego bastante artificial Te recordamos en cualquier caso laconveniencia de utilizar pareacutentesis para hacer maacutes legibles las expresiones y evitar posibles erroresPero a la vez la posibilidad de comprobar el resultado de las asignaciones aumenta la fiabilidaddel coacutedigo que escribimos

Nombres de las variables

Aunque hasta ahora hemos usado letras como nombres de las variables puedes utilizar nombresmaacutes descriptivos Y muchas veces es una buena idea hacerlo Por ejemplo puede que hace unasemana hayas escrito estas instrucciones para resolver un problema

a = 2b = 3c = a b

Pero si las vuelves a ver pasada una semana es posible que no recuerdes queacute era lo que estabastratando de conseguir al hacer esto En cambio al ver estas instrucciones

espacio = 2tiempo = 3velocidad = espacio tiempo

es mucho maacutes faacutecil reconocer el objetivo que persiguen A lo largo de los tutoriales del curso vamos ainsistir muchas veces en la necesidad de que el coacutedigo esteacute bien organizado y esteacute bien documentadoUn primer paso en esa direccioacuten es tratar de elegir nombres descriptivos para las variables En Rlas reglas para los nombres de variables son muy flexibles esencialmente que empiecen por unaletra y no contengan espacios ni caracteres especiales como + pareacutentesis etceacutetera Pero cuidadocon los excesos Es cierto que puedes usar nombres de variables arbitrariamente largos Pero si usascomo nombre

Estavariablealmacenaelresultadodelaoperaciontaninteresantequeacabamosdehacer

tu trabajo resultaraacute ilegible Como siempre se necesita un equilibrio y con la praacutectica encontraraacutesel tuyo (consejo zen gratuito del tutorial de hoy) Para empezar es una buena idea combinarmayuacutesculas y minuacutesculas en los nombres de las variables Si vas a usar una variable para representarla temperatura final de un proceso el nombre temperaturafinalproceso es menos legible y maacuteslargo que tempFinal Es mucho maacutes faacutecil por otra parte que te equivoques tecleando el primerode esos nombres

10

22 VectoresEn Estadiacutestica lo habitual es trabajar con colecciones o muestras de datos Y para almacenar esascolecciones de datos la estructura maacutes baacutesica de R son los vectores En este apartado vamos aempezar nuestro trabajo con ellos aunque a lo largo del curso auacuten tendremos ocasioacuten de aprenderbastante maacutes sobre el manejo de los vectores de RPara empezar vamos a trabajar con vectores que contienen una coleccioacuten de nuacutemeros que puedenser las edades de los alumnos de una clase

22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19

En R las listas de nuacutemeros como esta se almacenan en vectores El vector que corresponde a esasedades se construye en R mediante un comando como este

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19)

En realidad en esa expresioacuten hemos hecho dos cosas

1 Hemos creado el vector con los datos en la parte derecha de la expresioacuten

c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19)

Los datos estaacuten separados por comas y rodeados por pareacutentesis Hasta aquiacute todo es bastantetiacutepico pero fiacutejate especialmente en la letra c que precede al primer pareacutentesis Esa letra ces el nombre de una nueva funcioacuten de R y es la forma maacutes sencilla que existe en R paracrear un vector de datos Podriacutea pensarse que la c es de crear pero en realidad proviene deconcatenar Enseguida entenderemos porque es asiacute

2 Una vez creado el vector lo hemos asignado a la variable edades Hasta ahora soacutelo habiacuteamosusado variables para identificar un uacutenico valor (un nuacutemero o una cadena alfanumeacuterica)Pero una variable puede usarse para identificar un vector o como veremos maacutes adelanteestructuras mucho maacutes complejas

Una observacioacuten maacutes los vectores de R se usan para almacenar valores de una variable Y enparticular todos los datos de un vector son del mismo tipo de variable No se puede mezclar en unvector nuacutemeros y cadenas alfanumeacutericas (aparentemente R te dejaraacute hacerlo pero internamentehabraacute convertido todos los nuacutemeros en cadenas alfanumeacutericas)

Manos a la obra Prueba a copiar el comando anterior en tu Consola de comandos (puedes usarcopiar y pegar desde este fichero) y ejecuacutetalo Si las cosas van bien no esperes ninguna respuestacomo ya hemos dicho R no te muestra el resultado de las asignaciones Recuerda que si quieresver el resultado de una asignacioacuten puedes rodear toda liacutenea con pareacutentesis como en

(edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19))

Otra opcioacuten naturalmente es preguntarle a R por el valor de edades despueacutes de la asignacioacutenEscribe simplemente edades en la Consola de Comandos y ejecuacutetalo Veraacutes de nuevo el contenidode esa variable

Vamos a hacer algunas operaciones con este vector Imagiacutenate que como sucede a menudo despueacutesde haber creado nuestra lista de edades de alumnos desde la administracioacuten nos avisan de que haycinco alumnos nuevos recieacuten matriculados y debemos incorporar sus edades que son

22 18 20 21 20

a nuestro vector de datos Naturalmente podemos empezar de nuevo pero es preferible reutilizarel vector edades que ya habiacuteamos creado Vamos a ver esto como primer ejemplo para empezar aaprender coacutemo se manipulan vectores en R Una forma de antildeadir los datos es empezar creando unnuevo vector (con la funcioacuten c de R)

(edades2 = c(22 18 20 21 20))

Y a continuacioacuten concatenamos los vectores usando de nuevo la misma funcioacuten c de una maneradistinta

(edades = c( edades edades2))

11

Hemos rodeado toda la liacutenea con pareacutentesis para ver el resultado y poder observar coacutemo hacambiado el vector edadesVamos a analizar paso a paso lo que ha ocurrido

La instruccioacuten c( edades edades2) toma los datos contenidos en edades y edades2 y losconcatena en ese orden para fabricar un nuevo vector que todaviacutea no estaacute guardado enninguna variable

La asignacioacuten edades = c( edades edades2) toma ese vector y lo guarda en la propiavariable edades Al hacer esto como era de esperar el anterior vector edades es reemplazadocon la nueva lista y su contenido anterior se pierde (cuidado con esto las reasignaciones sonuna de las formas habituales de cometer errores)

El nombre de la funcioacuten c proviene en realidad de concatenate concatenar en ingleacutesLa siguiente figura resume lo que hemos venido haciendo con estos datos

Los nuacutemeros entre corchetes al principio de cada fila como el [1] y el [16] de este ejemploson soacutelo ayudas para que podamos localizar los elementos del vector En mi pantalla la primerafila muestra los primeros 15 nuacutemeros del vector Pero en la tuya si la ventana de RStudio es dedistinta anchura los nuacutemeros entre corchetes pueden ser distintos Hasta ahora soacutelo habiacuteamos vistoejemplos con [1] que es lo que sucede cuando la respuesta es un vector que cabe en una uacutenicaliacutenea

3 Ficheros csv con REn esta seccioacuten vamos a aprender a utilizar ficheros csv con R En el Tutorial-01 hemos vistoalgunos ejemplos de ese tipo de ficheros y el manejo baacutesico con una hoja de caacutelculo como CalcComo vimos alliacute un fichero csv tiacutepico contiene una tabla de datos con varias columnas Esaestructura de tabla se haraacute imprescindible maacutes adelante Pero durante una buena parte del cursonosotros nos vamos a limitar a problemas en los que interviene una uacutenica variable En tal casopara almacenar los datos de esa variable nos podemos a limitar a considerar un tipo de ficheroscsv muy baacutesico como el fichero adjunto

Guaacuterdalo en la subcarpeta datos de tu directorio de trabajo (el que contiene este pdf) Si lo abrescon un editor de texto (como el Bloc de Notas en Windows) veraacutes como muestra esta figura

12

61371381381381391391351381371381371371361361371351381391341371351371371351391341371371371381351381391371341361361361391381361371361371361361381361351351361361381351381351391371361391351371381381371310137138137135136138138137133135136137135137137135138134138138138136137136136138135136135138136139137

que el fichero contiene soacutelo una columna de datos que en este ejemplo corresponde a valores deuna variable cuantitativa discreta En la figura soacutelo se muestra una parte de los datos

Ejercicio 3iquestCuaacutentos datos hay en ese vector Usa Calc para averiguarlo pronto aprenderemos a hacerlo conR Solucioacuten en la paacutegina 47

Queremos utilizar esos datos en R y para eso vamos a (1) leerlos desde el fichero y (2)guardarlos enun vector El resultado seraacute como si nosotros hubieacuteramos creado ese vector tecleaacutendo sus elementosdirectamentePara el primer paso (la lectura del fichero csv) vamos a tener que empezar por explicarle a R(usando RStudio como intermediario) donde estaacute el fichero que contiene esos datos Cuando tra-bajamos con ficheros R utiliza un directorio de nuestro ordenador como directorio de trabajo Acontinuacioacuten vamos a aprender a elegir un directorio de trabajo Puedes usar cualquier carpeta yen lo que sigue vamos a suponer que hemos elegido el Escritorio Lo maacutes importante es que esacarpeta debe contener a su vez una subcarpeta llamada datos Y aseguacuterate de que los ficheroscsv que vas a usar estaacuten almacenados en esa subcarpeta llamada datos

Usamos el menuacute Session rarr Set Working Directory rarr Choose Directory

Se abre un cuadro de diaacutelogo del sistema y navegamos hasta la carpeta que contiene el ficherocsv que en mi caso es el Escritorio Cuando selecciono el Escritorio veo aparecer en la Consolade Comandos de R un comando que RStudio ha escrito y ejecutado por nosotros

13

setwd(CUsersFernandoDesktop)

Este es el resultado en mi ordenador (de ahiacute el nombre de usuario) usando Windows 10 Enversiones maacutes antiguas de Windows o en una maacutequina con Linux o un Mac el comando seraacuteligeramente distinto Cuando tengamos maacutes praacutectica aprenderemos otras formas de seleccionar eldirectorio de trabajo o incluso de utilizar ficheros situados fuera de ese directorio de trabajo Peropor el momento resulta maacutes coacutemodo dejar que RStudio haga ese trabajo para nosotrosAhora R ya sabe doacutende estaacute el fichero que nos interesa pero todaviacutea no sabe cual es Para ello vamosa utilizar la funcioacuten readtable de R Aunque esta funcioacuten tiene muchas opciones disponiblesnuestro primer uso de ella seraacute bastante sencillo Copia y ejecuta el siguiente coacutedigo en RStudio

(vectorEdades = readtable(datosTut02-Edadescsvheader = FALSE)[1])

En esta instruccioacuten le decimos a R que use la funcioacuten readtable para leer el contenido del ficheroTut02-Edadescsv y que almacene lo que ha leiacutedo en un vector que hemos decidido llamarvectorEdades Y aunque no es necesario entender en detalle el funcionamiento de readtable eneste momento vamos a explicar un poco maacutes lo que hemos hecho A medida que el curso avanceiraacutes teniendo maacutes ocasiones de practicar esto e iraacute quedando cada vez maacutes claroLa opcioacuten header = FALSE sirver para indicarle a R que la tabla almacenada en el fichero no tieneuna liacutenea de cabecera (en ingleacutes header) que cuando existe suele contener los nombres de lasvariables de la tabla Ademaacutes la funcioacuten readtable sirve para leer tablas con varias columnasobteniendo como resultado un objeto de R de tipo dataframe Pero nuestro primer ejemplo esmuy sencillo y la tabla soacutelo tiene una columna Asiacute que usamos la notacioacuten [1] para indicarle aR que soacutelo queremos la primera columna de esa tabla considerada como un vectorAl ejecutar esa orden habraacutes obtenido una respuesta como esta

gt gt (vectorEdades = readtable(datosTut02-Edadescsv header = FALSE)[1])[1] 6 7 8 8 8 9 9 5 8 7 8 7 7 6 6 7 5 8 9 4 7 5 7[24] 7 5 9 4 7 7 7 8 5 8 9 7 4 6 6 6 9 8 6 7 6 7 6[47] 6 8 6 5 5 6 6 8 5 8 5 9 7 6 9 5 7 8 8 7 10 7 8[70] 7 5 6 8 8 7 3 5 6 7 5 7 7 5 8 4 8 8 8 6 7 6 6[93] 8 5 6 5 8 6 9 7

Como hemos dicho antes los nuacutemeros entre corchetes al principio de cada fila que en mi casoson [1] [24] [47] [70] y [93] son soacutelo ayudas para que podamos localizar los elementos delvector En mi pantalla cada primera fila muestra 23 nuacutemeros del vector Pero en la tuya si laventana de RStudio es de distinta anchura los nuacutemeros entre corchetes pueden ser distintos

En cualquier caso ahora el vector vectorEdades contiene la informacioacuten del fichero csv con el quehemos empezado En la Seccioacuten 4 vamos a empezar a hacer Estadiacutestica Descriptiva Pero antes tepedimos un poco maacutes de paciencia porque vamos a entretenernos un poco maacutes en los detalles delmanejo de ficheros csv con R No pretendemos ser exhaustivos ni mucho menos pero siacute queremosaprender lo suficiente como para evitarnos los problemas maacutes habituales en los casos maacutes sencillosPara cerrar este apartado es conveniente haber visto el error que se produce cuando el fichero quetratamos de leer desde R no existe o no estaacute en el directorio de trabajo

Ejercicio 4Prueba a ejecutar

errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)

y fiacutejate en el mensaje de error Solucioacuten en la paacutegina 47

Otra variante del fichero de entrada

Los ficheros csv que contienen un uacutenico vector (en lugar de una tabla de datos) pueden adoptarformatos distintos del que acabamos de ver Por ejemplo el fichero adjunto

contiene los mismos datos que Tut02-Edadescsv pero ahora los datos del vector estaacuten todos enuna fila y separados por comas Guaacuterdalo como antes en la subcarpeta datos El aspecto delfichero visto a traveacutes de un editor de texto es este (soacutelo son visibles una parte de los datos)

14

67888995878776675894757759477785897466698676766865566858597695788710787568873567577584888676685658697

Desde luego no nos podemos plantear transformar a mano este vector en uno como el anteriorLa solucioacuten que te proponemos pasa por la hoja de caacutelculo y la opcioacuten de trasponer una tablaque hemos visto en el Tutorial-00 lo leeriacuteamos en una fila de la hoja y luego habriacutea que usar elPegado especial para trasponerlo -es decir girarlo- para finalmente volver a guardarlo Alterna-tivamente hay otras soluciones sin salir de R usando una funcioacuten llamada scan o usando de nuevoreadtable y trasponiendo la tabla dentro de R Esos meacutetodos son sencillos cuando se aprendeun poco maacutes sobre R pero por el momento y para los ejemplos sencillos que encontraremos nosvamos a conformar con ese enfoque baacutesico que usa la hoja de Caacutelculo si es necesario

31 Coacutemo obtener ayuda y usar el tabulador en RStudioVamos a aprovechar estos ejemplos de lectura de ficheros csv para aprender a obtener ayuda sobrelas funciones de R La mayoriacutea de las funciones de R como la funcioacuten readtable o la funcioacutenscan que hemos mencionado al final del anterior apartado tienen muchos argumentos opcionalesY hay muchiacutesimas funciones en R (cada vez maacutes porque como veremos maacutes adelante usuarios detodo el mundo antildeaden constantemente funciones nuevas a R cuando las necesitan) No es posiblerecordar todos esas funciones cada una con sus opciones asiacute que es muy importante aprender aobtener esa informacioacuten cuando la necesitamosPara ver como obtener esa informacioacuten en RStudio vamos a usar por ejemplo la funcioacuten scanSituacuteate en una liacutenea vaciacutea de la Consola de Comandos escribe scan y a continuacioacuten mientras elcursor parpadea junto a la n final de scan pulsa la tecla del tabulador (si esto no funciona usa latecla F1 y mira el panel ayuda de RStudio) Veraacutes aparecer una ventana emergente con informacioacutensobre la funcioacuten scan como en esta figura

15

Como ves se muestra un resumen sobre la funcioacuten scan que a veces seraacute suficiente Si necesitasmaacutes detalles haz caso a la indicacioacuten que aparece al final de esa ventana y pulsa la tecla F1 Alhacerlo veraacutes que en el panel inferior derecho de RStudio aparece el fichero de ayuda de la funcioacutenscan como en esta figura

Esos ficheros de ayuda son muy uacutetiles aunque al principio pueden resultar un poco intimidatoriosya sea por un exceso de informacioacuten ya sea porque se da por supuesto que el usuario ya entiendealgunos conceptos baacutesicos de R Podemos garantizar al lector que a medida que se progresa en Rla utilidad de estos ficheros aumentaPero la utilidad de la tecla tabulador en RStudio no se acaba ahiacute Supongamos que quieres aplicarreadtable para leer el fichero Tut02-Edadescsv Pero te da pereza escribir un nombre tan largoo no recuerdas exactamente el nombre o dudas entre dos nombres no importa cual sea el motivoEmpiezas a escribir la orden tecleas

(vectorEdades2 = readtable(datos

y de nuevo justo en este punto pulsas el tabulador Entonces RStudio te ofrece en una nuevaventana emergente todos los ficheros disponibles en la carpeta datos

Y ahora puedes usar esa lista seleccionar el fichero que quieras utilizar Puedes tambieacuten teclearalguna letra maacutes del nombre para acotar auacuten maacutes la buacutesqueda cuando la carpeta contiene muchosficherosEn general la idea es que en RStudio el tabulador es tu amigo Como tendremos ocasioacuten decomprobar RStudio nos ofrece bastante ayuda para hacer maacutes coacutemodo nuestro trabajo con R yel tabulador es una de las herramientas maacutes versaacutetiles y uacutetiles

16

32 El camino contrario escribir un vector a un fichero de tipo csvHemos aprendido a leer con R vectores de datos a partir de ficheros de tipo csv Pero muchasveces despueacutes de hacer operaciones en R obtendremos como resultados nuevos vectores (y maacutesadelante en el curso otro tipo de objetos) Lo natural entonces es aprender a guardar ese vectoren un fichero de tipo csv como el fichero con el que empezamos De esa forma por ejemplo puedescompartir tus resultados con otras personas que utilicen programas distintos de R Para ello siantes usaacutebamos la funcioacuten readtable ahora vamos a usar la funcioacuten writetable de R

Como ejemplo vamos a utilizar este vector de nuacutemeros enteros

29 17 63 31 55 9 92 61 10 16 63 6 61 59 66 41 68 6 99 21 87 68 52 83 66 98 45 5024 100 83 37 44 4 97 67 56 74 75 71 55 22 86 22 93 65 38 84 54 83 100 71 99 1963 11 11 62 91 20 79 42 59 95 70 74 8 25 45 58 57 75 81 34 70 68 39 12 14 21

Ejercicio 5Usa copiar y pegar a partir de este documento pdf para crear un vector de R llamado muestraque contenga esos datos

Para guardar ese vector muestra en un fichero csv (dentro de la subcarpeta datos del directoriode trabajo) podemos utilizar la funcioacuten writetable usando como argumentos

El nombre del vector que queremos guardar que es muestra

Y el nombre del fichero en el que lo guardamos Vamos llamarlo por ejemplo Tut02-muestracsvLe indicamos a R ademaacutes que lo ponga en la subcarpeta datos

La opcioacuten colnames = FALSE o colnames = TRUE para decidir si queremos que R incluyauna liacutenea de cabecera con el nombre de la variable que en este caso es muestra (y que novamos a incluir)

La opcioacuten rownames = FALSE para evitar que R incluya nuacutemeros de fila en el fichero desalida (normalmente no querremos esos nuacutemeros)

Es decir que ejecutamos

writetable(muestrafile = datosTut02-muestracsv colnames=FALSE rownames=FALSE)

Al ejecutar esa orden el fichero que obtenemos tiene la forma deseada (de nuevo soacutelo es visible elcomienzo del fichero)

17

Puedes probar a abrirlo en Calc para ver que es un fichero de datos como los que hemos visto hastaahora

Naturalmente apenas hemos rozado el tema de la entradasalida de datos en R Pero con lo quehemos aprendido en este apartado estamos listos para empezar a hacer Estadiacutestica Descriptivausando ejemplos que no sean demasiado triviales

4 Estadiacutestica descriptiva de una variable cuantitativa condatos no agrupados

Para seguir adelante tenemos que empezar por aprender un poco maacutes sobre la forma en la que Rpermite operar con los vectores Vamos a hacerlo a traveacutes de una serie de ejercicios-ejemplos

Ejercicio 6

1 Vamos a definir dos vectores cada uno de ellos con 12 nuacutemeros enteros El primero al quellamaremos vector1 estaacute formado por

8 5 19 9 17 2 28 18 3 4 19 1

Usa copiar y pegar a partir de este fichero pdf para definir el vector1 en R

2 El segundo vector al que en un rapto de originalidad llamaremos vector2 estaacute almacenadoen el fichero

Guaacuterdalo en datos y examiacutenalo primero con un editor de texto (como el Bloc de Notas)para ver coacutemo estaacuten almacenados los datos en ese fichero Una vez hecho esto usa Calc yla funcioacuten readtable para almacenar el contenido de ese fichero csv en el vector2 de REn alguacuten momento del proceso puede que tengas que usar el pegado especial de Calc paratrasponer los datos

Solucioacuten en la paacutegina 47

41 Aritmeacutetica vectorial en RAhora vamos a sumar los dos vectores Ejecuta el comando

vector1 + vector2

para comprobar que el resultado es la suma componente a componente de los dos vectores

gt vector1 + vector2[1] 26 23 39 21 37 3 58 24 29 24 34 26

Este resultado es bastante previsible Lo que quizaacute resulteacute un poco maacutes inesperado es que simultiplicas los dos vectores tambieacuten se obtienen los productos componente a componente el primerelemento de vector1 se multiplica por el primero de vector2 el segundo por el segundo etc

gt vector1 vector2[1] 144 90 380 108 340 2 840 108 78 80 285 25

Esta forma de operar de R como veremos pronto es muy uacutetil Si lo piensas un momento cadavector numeacuterico de R se corresponde con una columna de una hoja de caacutelculo como las queusaacutebamos en el Tutorial01 Alliacute vimos que para algunas operaciones era necesario multiplicar doscolumnas elemento a elemento En Calc esa operacioacuten no es complicada pero en R es auacuten maacutes faacutecilBasta con un comando como vector1 vector2 para conseguir el objetivo Veremos muchos maacutesejemplos a lo largo del curso en los que una operacioacuten que en Calc requeririacutea bastantes pasosen R se reduce a ejecutar un uacutenico comandoEn R las operaciones con vectores siguen en general este esquema de funcionamiento componentea componente Si por ejemplo ejecutas

18

1818201220130626201525

gt vector1 + 5[1] 13 10 24 14 22 7 33 23 8 9 24 6gt 2 vector1[1] 16 10 38 18 34 4 56 36 6 8 38 2

veraacutes que en el primer caso cada uno de los elementos de vector1 se ha incrementado en 5mientras que en el segundo caso cada uno se ha multiplicado por 2 Sucede lo mismo con otrasoperaciones como elevar al cuadrado

gt vector1^2[1] 64 25 361 81 289 4 784 324 9 16 361 1

Y podemos aplicar funciones en un solo paso Por ejemplo podemos calcular el logaritmo neperianode todos los elementos de un vector en un soacutelo paso

gt log(vector1)[1] 20794415 16094379 29444390 21972246 28332133 06931472[7] 33322045 28903718 10986123 13862944 29444390 00000000

Los resultados de todas estas operaciones son de nuevo vectores Y por tanto se pueden asignara nuevas variables para utilizarlos en nuestras operaciones Por ejemplo si luego vas a necesitar loslogaritmos de vector1 puedes definir una variable para identificar ese vector llamada logVector1(e el nombre que tuacute quieras) haciendo

gt logVector1 = log(vector1)

Recuerda que si ademaacutes de la asignacioacuten quieres ver el resultado puedes rodear toda esta senten-cia con pareacutentesis De lo contrario R la ejecuta pero no imprime ninguna respuesta como ya sabes

Aunque al principio puede parecer complicado cuando te acostumbres a esta forma de trabajarcon vectores veraacutes que resulta muy coacutemoda y eficiente

Generando vectores de nuacutemeros enteros consecutivos

Hay muchas ocasiones en que para alguna operacioacuten necesitamos un vector que contenga losnuacutemeros enteros consecutivos del 1 al n o del 0 al n etc En R esto es muy faacutecil de hacer Porejemplo para conseguir un vector con los nuacutemeros del 1 al 15 basta con ejecutar

gt 115[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Esa notacioacuten con los dos puntos permite generar vectores en los que cada elemento es igual alanterior maacutes 1 Otro ejemplo

gt -713[1] -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13

O incluso cuando los puntos de partida no son enteros

gt 1575[1] 15 25 35 45 55 65 75gt 1574[1] 15 25 35 45 55 65

iquestVes la diferencia entre estos dos casos

Es muy posible que te esteacutes preguntando iquesty si quiero ir avanzando de 2 en 2 o quiero ir hacia atraacutes(ldquoavanzandordquo de minus2 en minus2 por ejemplo) Pronto cuando hayamos aprendido un poco maacutes volve-remos sobre esto y comprobaremos que R nos ofrece un cataacutelogo de herramientas extremadamentepotentes para fabricar vectores de acuerdo con nuestros deseos y necesidadesLos vectores fabricados con este meacutetodo son vectores iguales que los demaacutes y se pueden asignar avariables operar con ellos etc

19

Ejercicio 7

1 Fabrica un vector con los cuadrados de los nuacutemeros del 1 al 10 y asiacutegnalo a la variablecuadrados Usa los pareacutentesis para ver el resultado de la asignacioacuten

2 Haz lo mismo con los cuadrados de los nuacutemeros del 2 al 11 y un vector cuadrados2

3 Resta los vectores cuadrados2 - cuadrados iquestObservas algo interesante

Solucioacuten en la paacutegina 47

Funciones vectoriales

Hemos visto antes que se puede aplicar una funcioacuten como la raiacutez cuadrada a un vector y seobtiene como resultado otro vector con las raiacuteces cuadradas elemento a elemento Pero hay otrotipo de funciones que permiten hacer caacutelculos con el vector en conjunto Por ejemplo antes hemosfabricado el vector -713 y la funcioacuten length nos dice cuantos elementos tiene ese vector

gt length(-713)[1] 21

En el Ejercicio 3 (paacuteg 13) nos preguntaacutebamos cuantos elementos teniacutea el vector vectorEdades quehabiacuteamos cargado desde el fichero csv Puedes obtener la respuesta con length(vectorEdades)Para comprobarlo aseguacuterate de que has creado el vector llamado vectorEdades y ejecuta estaorden

gt length(vectorEdades)[1] 100

Como ves el resultado de length es el esperado

Vamos a conocer otra funcioacuten llamada sum que sirve para calcular la suma de todos los elementosde un vector

gt sum(vectorEdades)[1] 675

Ejercicio 8iquestCuaacutento vale la suma de los cuadrados de los nuacutemeros del 1 al 100 Solucioacuten en la paacutegina 47

A lo mejor te ha pasado desapercibido pero con las funciones length y sum estamos por fin encondiciones de empezar a hacer Estadiacutestica Descriptiva Por ejemplo podemos calcular la mediaaritmeacutetica de vectorEdades

gt ( mediaEdades = sum(vectorEdades) length(vectorEdades) )[1] 675

Y una vez que tenemos la media podemos calcular la varianza poblacional Para que resulte maacutesclaro vamos a mostrarte el proceso paso a paso aunque al final lo ejecutaremos en un soacutelo paso

1 Empezamos restando la media que estaacute en la variable mediaEdades de cada uno de loselementos de vectorEdades

vectorEdades - mediaEdades

El resultado es un vector de diferencias

2 Ahora elevamos cada una de esas diferencias al cuadrado

( vectorEdades - mediaEdades )^2

El resultado de este paso es de nuevo un vector ahora con las diferencias al cuadrado Fiacutejateen el pareacutentesis para garantizar que elevamos al cuadrado la diferencia Si no incluyeacuteramosel pareacutentesis iquestqueacute calculariacuteamos

20

3 A continuacioacuten sumamos todas esas diferencias al cuadrado usando la funcioacuten sum

sum( ( vectorEdades - mediaEdades )^2)

De nuevo el pareacutentesis es fundamental para que el cuadrado del vector de diferencias secalcule antes que la suma En este paso el resultado ya no es un vector sino un nuacutemero

4 Por uacuteltimo dividimos esa suma por n el nuacutemero de elementos de vectorEdades que seobtiene con la funcioacuten length

sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades)

El resultado de estos pasos se puede condensar en un soacutelo comando de R en el que a la vezcalculamos la varianza y la asignamos a una variable

gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades) )[1] 19875

Ejercicio 9

1 Calcula la desviacioacuten tiacutepica (poblacional) de vectorEdades

2 Calcula la cuasivarianza y cuasidesviacioacuten tiacutepica (muestrales) de vectorEdades

3 iquestQueacute sucede si en el tercer paso ejecutas el siguiente comandosum( vectorEdades - mediaEdades )^2iquestPor queacute sucede esto

Solucioacuten en la paacutegina 48

Con estos caacutelculos hemos empezado a hacer Estadiacutestica con R Naturalmente nos queda muchiacutesimoque aprender sobre los vectores de R Por ejemplo como se accede a una componente individualdel vector para responder a preguntas como ldquoiquestCuaacutento vale el quinto elemento del vectorrdquo Maacutesen general aprenderemos a extraer aquellos elementos del vector que cumplan alguna condicioacutenrespondiendo a preguntas como ldquoiquestQueacute elementos del vector son mayores que 7rdquo

42 Y por fin hagamos Estadiacutestica DescriptivaEn esta seccioacuten vamos a trabajar con un vector de datos contenido en este fichero adjunto

Este vector contiene los datos de la variable var3 del fichero Tut01-PracticaConCalccsv queya hemos utilizado en el Tutorial-00 para aprender a hacer Estadiacutestica Descriptiva con Calc Enesta seccioacuten vamos a reproducir los resultados que obtuvimos alliacute pero esta vez usando R Parapreparar el terreno vamos a hacer limpieza

Ejercicio 10

1 Cierra Rstudio y vuelve a abrirlo para limpiar la memora del sistema El trabajo que hemoshecho hasta ahora se perderaacute (aunque los comandos siguen en el Historial de Comandos queya vimos)

2 Establece el Directorio de Trabajo (por ejemplo el Escritorio) y aseguacuterate de que Tut02-var3csvestaacute guardado en la subcarpeta datos de ese directorio

3 Carga de nuevo el contenido de ese fichero en un vector var3 de R

Solucioacuten en la paacutegina 48

Veraacutes en lo que sigue que siempre que calculamos un objeto le asignamos una variable Eso permiteahorrarse la repeticioacuten innecesaria de caacutelculos si maacutes adelante volvemos a necesitar ese objeto Yen algunos casos como veremos maacutes adelante al hacer esto podemos acceder a propiedades delobjeto calculado que R no muestra en su respuesta por defecto

21

4 138 134 134 135 135 133 136 136 132 134 134 133 133 133 132 136 134 135 132 135 136 135 132 136 134 135 133 134 134 134 1310 136 138 134 135 137 133 135 138 136 137 135 134 137 135 136 138 137 134 133 135 135 134 131 135 137 133 133 137 136 135 135 132 138 135 135 135 136 135 133 1311 136 1310 134 131 133 138 139 135 134 1310 134 134 137 135 134 133 132 135 132 136 135 134 133 139 136 135 134 135 132 132 138 134 133 136 138 134 134 134 138 134 132 135 1310 136 1312 135 139 135 138 138 135 132 135 1310 136 135 136 135 135 137 134 133 134 133 133 134 133 133 133 133 137 138 135 134 135 134 135 137 135 133 134 134 137 133 132 135 137 135 134 136 132 135 132 136 1310 134 132 139 134 136 136 132 137 134 138 135 135 134 134 137 134 136 136 135 134 133 135 133 133 136 132 133 134 138 138 137 137 136 135 1310 134 134 134 138 136 134 136 137 135 135 136 138 134 138 134 135 137 136 134 137 137 135 137 132 136 135 133 135 136 130 133 135 135 137 134 137 131 135 136 135 138 132 134 136 139 137 1310 134 135 136 132 135 135 135 1313 133 136 133 136 135 130 1310 134 136 136 134 131 133 135 137 136 133 135 133 134 132 132 138 138 134 136 135 135 134 133 139 134 139 136 1311 133 132 132 136 138 1310 133 137 133 134 135 139 133 135 133 134 138 139 132 138 133 133 137 138 136 133 135 134 132 1311 137 137 136 134 133 135 1310 135 134 135 133 135 136 135 139 135 134 135 135 134 133 137 134 1310 135 134 132 139 134 137 133 135 134 131 136 135 136 134 138 135 135 138 138 134 132 135 133 134 138 138 135 138 132 1311 135 134 134 136 139 1310 137 134 137 132 133 135 1310 135 135 133 135 136 134 134 136 135 137 136 136 134 133 134 135 132 134 136 139 133 135 133 136 133 133 135 134 134 134 137 135 139 1310 133 134 136 131 137 138 135 133 133 135 133 133 137 136 135 135 138 134 139 136 135 135 138 134 130 133 137 133 134 1311 132 137 133 136 135 133 134 133 133 132 138 133 134 134 134 134 138 138 137 136 132 132 137 135 133 135 138 135 134 135 134 135 134 1312 133 135 133 133 133 132 134 131 139 135 135 135 138 138 135 138 133 134 133 136 136 135 134 133 133 135 133 137 135 132 133 133 132 131 132 136 137 130 136 133 134 1310 132 136 137 134 133 132 138 133 135 133 135 136 132 134 134 133 135 135 135 134 134 136 133 132 138 1310 135 135 132 132 137 136 134 135 134 134 136 134 136 135 133 137 137 136 137 134 134 137 133 130 134 136 135 137 136 136 135 137 134 134 135 136 136 135 136 132 134 133 139 135 133 137 135 136 137 136 136 136 134 135 137 137 133 134 137 137 136 133 134 137 131 135 136 133 137 133 135 133 137 138 133 137 132 135 134 133 132 135 134 134 135 133 134 139 135 134 139 137 133 132 133 134 133 134 135 135 138 134 135 134 135 139 137 133 133 132 136 132 138 135 132 137 134 135 136 132 134 135 135 133 135 136 137 135 138 132 131 137 135 135 138 134 137 136 139 1310 137 134 131 136 132 136 137 133 135 137 135 132 135 135 133 133 137 134 133 133 131 138 139 132 134 138 135 136 138 137 1310 138 133 134 134 135 134 134 135 136 135 134 134 135 133 136 135 137 132 133 139 132 133 137 136 134 137 131 135 134 132 134 138 135 134 131 132 134 135 136 133 134 138 134 132 135 134 132 134 133 136 135 138 133 139 1310 134 133 133 137 137 136 137 133 133 133 135 139 136 136 137 136 135 132 132 139 136 132 139 132 137 135 133 138 137 135 134 136 131 133 135 133 134 137 135 134 132 136 136 136 137 133 132 135 134 135 134 137 134 133 133 134 132 134 135 134 134 136 134 135 138 133 135 135 138 133 135 134 135 135 138 1311 132 134 134 136 133 135 133 136 132 131 136 134 136 132 136 136 136 136 130 136 134 134 131 138 131 1310 135 139 136 132 136 138 135 138 134 132 134 133 136 137 133 133 133 133 137 136 135 133 139 133 132 135 136 136 134 132 132 135 137 136 136 136 138 137 137 135 135 131 136 133 136 135 133 134 130 133 135 136 137 138 136 134 135 132 137 132 137 132 133 134 135 138 134 136 133 135 135 139 134 134 136 134 134 134 135 134 133 135 135 138 133 136 136 134 135 134 134 138 136 133 137 132 134 137 136 135 133 134 133 135 134 134 136 134 133 137 133 135 135 136 135 138 134 136 132 137 136 138 134 136 136 137 136 136 135 136 1310 138 133 137 135 136 137 134 136 133 134 133 132 132 134 137 132 132 133 132 138 134 134 135 135 139 135 134 132 134 135 134 139 137 133 134 134 135 133 133 137 138 135 139 133 138 136 136 134 133 136 135 1314 137 133 137 135 136 134 134 136 133 135 134 135 136 136 135 133 135 131 135 137 135 136 133 137 135 134 133 134 134 134 134 134 136 132 134 136 136 137 139 134 138 133 133 132 135 131 134 133 137 133 133 134 139 138 134 134 137 137 135 136 134 139 137 138 134 133 134 134 135 137 134 135 138 133 132 134 1310 133 135 134 132 138 137 136 135 138 1314 139 135 135 131 134 135 134 135 135 135 133 136 135 135 132 136 139 133 133 136 134 132 132 137 136 131 137 135 135 134 1313 1310 132 134 134 133 138 135 134 133 136 136 136 1310 134 137 136 138 139 137 135 134 134 137 137 138 133 134 135 137 135 136 1310 136 136 138 133 136 133 134 135 135 134 136 133 136 136 137 134 135 1316 136 136 132 136 136 133 134 133 137 134 135 134 133 138 134 1310 136 136 136 137 134 136 137 132 138 136 131 132 134 135 130 134 135 135 137 130 136 135 131 136 137 133 137 135 139 138 135 139 133 137 139 133 136 137 136 138 134 1310 136 134 133 139 136 137 133 13713

Rango maacuteximo y miacutenimo

Para empezar vamos a aprender tres nuevas funciones de R que nos permiten calcular esos tresvalores

gt (minimo = min(var3) )[1] 0gt (maximo = max(var3) )[1] 16gt (rango = range(var3) )[1] 0 16

El funcionamiento de las dos primeras es evidente La funcioacuten range devuelve un vector formadopor el maacuteximo y el miacutenimo

Tablas de frecuencia Clases de objetos en R

La tabla de frecuencia absoluta de var3 se obtiene usando la funcioacuten table de esta forma tansencilla

gt ( tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

La primera fila contiene los elementos de var3 y en la segunda aparece la frecuencia de cada unode ellos Puedes comprobar que son los mismos resultados que obtuvimos con Calc en la paacutegina10 del Tutorial01 Aunque alliacute desde luego el proceso fue maacutes laborioso

A lo mejor te has dado cuenta de que el formato de la respuesta es diferente de los que hemosobtenido hasta ahora Para empezar la respuesta no empieza con el [1] al que ya nos vamosacostumbrando El motivo de esto es que el objeto que hemos obtenido como respuesta no es unvector sino una tabla Ya dijimos que R utiliza distintos tipos de objetos con fines distintosiquestCoacutemo podemos saber de queacute clase es un objeto Pues usando una funcioacuten de R oportunamentellamada class Si la usamos con el vector var3 y con su tabla de frecuencias obtenemos

gt class(var3)[1] numericgt class(tablaFrecAbs)[1] table

El vector var3 es de clase numeric porque es un vector de nuacutemeros Y la tabla de frecuencias esde clase table Veremos a lo largo del curso otros objetos de tipo tabular como las matrices (clasematrix) los conjuntos de datos (clase dataframe) y los arraysAunque las tablas son objetos distintos de los vectores tienen algunas propiedades en comuacuten yalgunas de las funciones que hemos usado con vectores tambieacuten se pueden usar con tablas

Ejercicio 11Aplica las funciones length sum min max y range a la tabla tablaFrecAbs Solucioacuten en la paacutegina48

Siguiendo con los parecidos entre tablas y vectores puedes multiplicar (o dividir) una tabla porun nuacutemero y la operacioacuten se haraacute elemento a elemento

gt 2 tablaFrecAbsvar30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1618 50 200 376 488 492 372 262 174 86 56 12 4 4 4 2

Como ves cada frecuencia se multiplica por 2 Esta propiedad de las tablas permite obtener deforma muy sencilla la tabla de frecuencias relativa de var3 Como primer paso vamos a guardarla longitud de var3 en la variable n

22

gt ( n = length( var3 ) )[1] 1300

Y ahora podemos dividir la tabla por n para conseguir la tabla de frecuencias relativas (hemosestrechado la Consola de Comandos para que el resultado cupiera en esta paacutegina)

gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 400069230769 00192307692 00769230769 01446153846 01876923077

5 6 7 8 901892307692 01430769231 01007692308 00669230769 00330769231

10 11 12 13 1400215384615 00046153846 00015384615 00015384615 00015384615

1600007692308

Ejercicio 12Ya sabemos cuanto debe sumar esta tabla de frecuencias relativas Comprueacutebalo Solucioacuten en lapaacutegina 48

Si lo que queremos es una tabla de frecuencias acumuladas debemos emplear la funcioacuten cumsum

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Ejercicio 13La uacuteltima tabla que falta es la de frecuencias relativas acumuladas pero ya tienes todos los ingre-dientes para obtenerla de dos maneras diferentes Hazlo y comprueba si dan el mismo resultadoSi no es asiacute iquesta queacute crees que se debe y cuaacutel es la mejor opcioacuten Asigna el resultado a la variabletablaFrecRelAcu Solucioacuten en la paacutegina 49

Graacuteficos de columnas y diagramas de caja (boxplot) Argumentos con nombre

Vamos a fabricar nuestros primeros graacuteficos con R En concreto vamos a dibujar un graacutefico debarras a partir de la tabla de frecuencias de var3 usando la funcioacuten barplot de R

gt barplot(tablaFrecAbs)

Al ejecutar este comando no debes ver ninguna salida en la Consola de Comandos En su lugaren el panel inferior derecho de RStudio concretamente en la ventana Plots apareceraacute el graacuteficodeseado El resultado puede variar dependiendo de la anchura de tu ventana de RStudio

23

Hemos destacado ademaacutes en la figura los dos botones Zoom y Export que te permiten respecti-vamente ver una versioacuten ampliada de la Figura (que se redimensiona dinaacutemicamente si cambiasla ventana) y guardar esa figura como un fichero de graacuteficos que puedes insertar en cualquierdocumento editar con un programa de manipulacioacuten de graacuteficos etceacuteteraLos graacuteficos de R se pueden controlar hasta en sus detalles maacutes miacutenimos Como aperitivo miacutenimovamos a antildeadir algo de color al graacutefico

gt barplot(tablaFrecAbs col = heatcolors(15))

El resultado es esta figura

Las posibilidades de control de los graacuteficos de R son como decimos inmensas y pueden llegar aser abrumadoras Hay libros de cientos de paacuteginas dedicados a este tema como el R GraphicsCookbook de W Chang (ver las referencias del curso) Nosotros a lo largo de los tutoriales delcurso vamos a aprender algo maacutes aunque a penas nos podremos limitar a rozar la superficie delo que se puede llegar a hacerEn la Seccioacuten 231 del libro hemos descrito los diagramas de cajas o boxplots (recuerda la Figura22 de la paacuteg 36 del libro) Y en el Tutorial-01 dijimos que con Calc no es faacutecil dibujar ese tipode diagramas En cambio con R no podriacutea ser maacutes faacutecil

gt boxplot(var3)

Y el resultado es esta figura

24

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

httpeswikipediaorgwikiNotacioacuten_cientiacutefica

En cualquier caso el exponente -16 nos indica que se trata de un nuacutemero extremadamentecercano a 0 Fiacutejate en cambio que si usas 314 como aproximacioacuten de π la respuesta aunquepequentildea es todaviacutea del orden de mileacutesimas

11 Algunos detalles de la interfaz de RStudioAntes de avanzar maacutes queremos ocuparnos de algunos aspectos del trabajo con RStudio que amenudo causan algunos quebraderos de cabeza a quienes se inician en el uso del programa

Comandos incompletos

Para ver un ejemplo prueba a escribir en el prompt activo esta operacioacuten evidentemente incom-pleta

3

y pulsa Entrar La respuesta de R es un siacutembolo +

gt 3+

que en este caso no tiene nada que ver con la suma Es la forma que tiene R de decirnos ldquonecesitoalgo maacutesrdquo Cuando R se encuentra con una expresioacuten que considera no erroacutenea sino incompleta(por ejemplo con un pareacutentesis abierto al que corresponde un pareacutentesis cerrado) entonces nos locomunica con este siacutembolo + Y al hacerlo nos da la oportunidad en casos como este de corregirel error completando la expresioacuten incompleta Asiacute que si ahora junto al siacutembolo + escribes 2 deesta forma

gt 3+ 2

y pulsas Entrar veraacutes que R ha entendido la expresioacuten completa 32 y nso devuelve la respuesta

gt 3+ 2[1] 6

En alguacuten momento no obstante ese siacutembolo + de los comandos incompletos se convertiraacute en uninconveniente Imagiacutenate por ejemplo que queriacuteas multiplicar 5 middot7 pero que por error has tecleadola expresioacuten

57-

y has pulsado Entrar antes de darte cuenta del error En tal caso R piensa que esa expresioacuten estaacuteincompleta y vuelve a aparecer el signo +

gt 57-+

iexclPero ahora no queremos antildeadir nada En este caso podriacuteas antildeadir un 0 sin que eso afectara elresultado pero habraacute maacutes adelante muchos casos en los que no hay una solucioacuten sencilla evidenteiquestCoacutemo salimos del paso Simplemente pulsamos la tecla Esc (escape) con lo que R interrumpe elcomando y nos devuelve a un nuevo prompt activo sin calcular nada

Navegando el historial de comandos

En un caso como el que hemos descrito no supone un problema volver a teclear la expresioacutenevitando el error que habiacuteamos cometido Pero en ocasiones si hemos escrito una expresioacuten real-mente complicada y por ejemplo hemos tecleado un pareacutentesis de maacutes en medio de la expresioacutenseguramente prefeririacuteamos no tener que volver a teclear la expresioacuten completa Un remedio ldquocaserordquoconsiste en seleccionar y copiar la expresioacuten erroacutenea pegarla en el prompt activo y editarla ahiacutepara corregir el errorHay una segunda manera de conseguir el mismo efecto Otra caracteriacutestica interesante de la Consolade Comandos es que si te situacuteas en el prompt activo y pulsas las teclas con flechas arriba o abajoveraacutes pasar la lista completa de comandos que has ejecutado desde el principio de la sesioacuten detrabajo Prueba a hacerlo ahora para ver como funciona Si has ejecutado todos los comandosque hemos ido describiendo en este tutorial puedes pulsar la flecha uarr repetidamente e iraacutes viendopasar todos esos comandos hasta llegar al

6

3^2

con el que hemos empezado Y con la flecha hacia abajo recorres la lista en sentido contrario hastael comando de ejecucioacuten maacutes reciente Esa lista de comandos es el Historial de Comandos Usandolas flechas arriba y abajo puedes recorrer el Historial de Comandos detenerte en cualquier puntomodificar ese comando si lo deseas y despueacutes ejecutarlo (con o sin modificaciones) Al principiopuede que te cueste un poco acostumbrarte pero una vez que te habituacutees a esta herramientala encontraraacutes sin duda muy uacutetil El Historial de Comandos que puedes recorrer con las flechasarriba y abajo se limita a la sesioacuten de trabajo actual Pero si miras en el panel superior derecho deRStudio veraacutes una pestantildea titulada History que se muestra en esta figura

El Historial de Comandos que aparece en ese panel refleja tus comandos de esta y anterioressesiones Si esta es tu primera sesioacuten de trabajo con R ambos coincidiraacuten claro estaacute Pero a medidaque vayas abriendo RStudio en diacuteas sucesivos te puede resultar muy uacutetil localizar por ejemploun comando que usaste hace dos sesiones pero que no recuerdas exactamente Los comandos queaparecen en ese panel se pueden copiar y pegar en la Consola de Comandos o de forma maacutes directapuedes seleccionar uno de ellos con el ratoacuten y pulsar en el botoacuten To Console que hemos destacadoen la Figura

111 Errores

Los errores son inevitables y nos conviene estar preparados para su aparicioacuten Dependiendo delmotivo del error R nos informaraacute con distintos tipos de mensajes Asiacute que vamos a ver algunosejemplos para conocer la terminologiacutea asociadaPara empezar este es el mensaje de error que obtenemos tras ejecutar una expresioacuten sin sentido

gt 43Error unexpected rsquorsquo in 4

Los mensajes de error aparecen en color rojo en RStudio Este mensaje de error en particulares bastante faacutecil de entender R simplemente se queja de que esta expresioacuten es defectuosa Noincompleta como alguna que hemos visto antes Es imposible completar esta expresioacuten de formacorrectaVeamos otro tipo de mensaje de error Ya sabes que no se puede dividir por 0 Si lo intentamos enR

gt 20[1] Inf

7

el siacutembolo Inf (de infinito) nos avisa del problema Ese siacutembolo tambieacuten puede aparecer con signomenos si por ejemplo tratas de calcular el logaritmo neperiano de 0 En R el logaritmo neperianoes la funcioacuten log asiacute que seriacutea

gt log(0)[1] -Inf

En ambos casos R no lanza un mensaje de error pero utiliza el siacutembolo de infinito porque asiacute nosproporciona maacutes informacioacuten matemaacutetica sobre lo que ha ocurrido Tambieacuten puede suceder queel siacutembolo Inf aparezca como resultado intermedio en una expresioacuten En ese caso R aplica unasreglas sencillas de aritmeacutetica con infinitos para tratar de darnos la respuesta maacutes coherente desdeel punto de vista matemaacutetico Por ejemplo si calculas

3(-5(4-2^2))

Entonces R empieza calculando el resultado del pareacutentesis 4-2ˆ2 que es 0 Asiacute que al dividir minus5entre 0 R obtiene -Inf y finalmente al calcular 3(-Inf) se obtiene -Inf como valor de laexpresioacuten Comprobeacutemoslo

gt 3(-5(4-2^2))[1] -Inf

A pesar de que R no lanza mensajes de error estaacute claro que en la mayoriacutea de los casos no esdeseable que nuestros caacutelculos produzcan Inf como resultado en ninguna etapaEn otros casos el problema es diferente Por ejemplo si tratas de calcular la raiacutez cuadrada de unnuacutemero negativo

gt sqrt(-4)[1] NaNWarning messageIn sqrt(-4) NaNs produced

En este caso obtenemos una respuesta NaN y ademaacutes una advertencia (warning) sobre la aparicioacutende esa respuesta El siacutembolo NaN es la abreviatura de Not a Number es decir ldquono es un nuacutemerordquo Estaes la respuesta que obtendremos cuando tratamos de hacer operaciones como esta que producencomo resultado un nuacutemero complejo R es capaz de trabajar con los nuacutemeros complejos pero comono los vamos a necesitar en el curso no nos ocuparemos de esto Para que veas otro ejemplo esarespuesta NaN aparece tambieacuten si tratamos de ir demasiado lejos con la aritmeacutetica con infinitos

gt (10)+log(0)[1] NaN

En este caso R se ha encontrado en un paso intermedio con Inf - Inf y su respuesta ha sido NaN

En cualquier caso y como resumen final tenemos que tratar de evitar que nuestros caacutelculos con-duzcan a este tipo de expresiones

Haciendo limpieza en la Consola de Comandos

Si has seguido todas las instrucciones hasta aquiacute tu Consola de Comandos seguramente empiezaa estar llena de comandos y algunos pueden quedar ocultos en la parte superior Naturalmentepuedes usar las barras de desplazamiento para moverte por la Consola Pero en sesiones largas detrabajo o cuando hemos terminado de hacer pruebas y queremos ejecutar una versioacuten definitivade nuestro trabajo es normal que queramos hacer limpieza en la Consola Eso se consigue con lacombinacioacuten de teclas Ctrl + L iexclCuidado Es un proceso no reversible podraacutes seguir navegandoel Historial de Comandos con las teclas arriba y abajo pero para recuperar los resultados tendraacutesque ejecutar de nuevo los comandosMaacutes adelante aprenderemos formas de guardar nuestro trabajo de una manera maacutes eficiente Perote podemos adelantar que puesto R se maneja escribiendo comandos bastaraacute con guardar esoscomandos en ficheros de texto plano Ahora vamos a cambiar de tema y para empezar desde cerovamos a cerrar RStudio para eliminar las trazas del trabajo que hemos hecho

2 Variables y vectoresVuelve a abrir RStudio para continuar el trabajo En la seccioacuten previa hemos usado R como unacalculadora Pero para ir maacutes allaacute tenemos que disponer de estructuras de datos Ese teacutermino

8

describe en Computacioacuten las herramientas que nos permiten almacenar y procesar informacioacutenLas estructuras de datos maacutes baacutesicas de R son las variables y los vectores En proacuteximos tutorialesnos iremos encontrando con otras estructuras de datos matrices dataframes listas entre otras

21 Variables en RUna variable en R es un siacutembolo que usamos para referirnos a un valor Por ejemplo si te situacuteasen la Consola de Comandos tecleas

a = 2

y ejecutas esa instruccioacuten entonces aunque aparentemente no ha sucedido nada (porque no hayrespuesta) a partir de ese momento R ha asignado el valor 2 al siacutembolo a Asiacute que si por ejemplotecleas y ejecutas

a + 1

obtendraacutes como respuesta 3

Ejercicio 2iquestQueacute se obtiene al ejecutar estos comandos uno detraacutes de otro iquestCuaacutento valen las variables a by c al final

a = 2b = 3c = a + ba = b cb = (c - a)^2c = a b

La solucioacuten estaacute en la paacutegina 47 iexclNo la mires antes de intentar pensar el ejercicio por ti mismo

En el Capiacutetulo 1 del libro hemos hablado de variables cualitativas y cuantitativas Estas uacuteltimastoman siempre valores numeacutericos y las variables de R sirven desde luego para almacenar esa clasede valores Pero como iremos viendo en sucesivos tutoriales tambieacuten se pueden utilizar variablesde R para guardar valores de variables cualitativas (factores) y otros tipos de objetos que iremosconociendo a lo largo del curso De momento para que veas a que nos referimos recordaremos elEjemplo 111 del libro (paacuteg 6) en el que teniacuteamos una variable cualitativa ordenada que representael pronoacutestico de un paciente que ingresa en un hospital Prueba a ejecutar este coacutedigo

pronostico = Leve

simplemente para que de momento veas que

R no protesta El valor Leve es un valor perfectamente aceptable

En R los valores que representan palabras frases o como las llamaremos teacutecnicamente cadenasalfanumeacutericas se escriben siempre entre comillas Puedes usar comillas simples o dobles perote aconsejamos que uses dobles comillas

La relacioacuten entre factores y valores alfanumeacutericos en R es algo maacutes complicada de lo que estesencillo ejemplo parece sugerir Pero ya tendremos ocasioacuten en futuros tutoriales de extendernossobre eso

Asignaciones

Las instrucciones como

a = 2

o como

b = (c - a)^2

se denominan asignaciones En la primera por ejemplo decimos que hemos asignado el valor 2a la variable aQueremos advertir al lector de que en R hay otra forma esencialmente equivalente de escribir lasinstrucciones y que de hecho se usa mayoritariamente En lugar del siacutembolo = puedes conseguirel mismo efecto escribiendo lt- (el signo ldquomenorrdquo seguido sin espacios de un signo ldquomenosrdquo) Asiacuteque si ejecutas

9

a lt- 2

el resultado seraacute el mismo que antes con = Las dos notaciones tienen ventajas e inconvenientes peronosotros preferimos = porque se parece maacutes a lo que se utiliza en muchos lenguajes de programacioacuten

Coacutemo ver los resultados de un caacutelculo a la vez que lo hacemos

Ya habraacutes notado que al hacer una asignacioacuten R no produce ninguna respuesta y se limita aguardar el valor en la variable En una asignacioacuten como a=2 esto no genera ninguna duda Perosi el miembro derecho de la asignacioacuten es una expresioacuten maacutes complicada puede ser convenientepedirle a R que nos muestre el resultado de esa expresioacuten a la vez que se hace la asignacioacutenImagiacutenate por ejemplo esta situacioacuten

b = 2c = -2d = -4a = b c^2 d + 3

iquestCuaacutel es el valor que se asigna a la variable a Una forma de averiguarlo es simplemente ejecutaruna liacutenea adicional en la que aparece soacutelo el nombre de la variable que queremos inspeccionar Alejecutar esta sentencia R nos devuelve como respuesta

gt a[1] 1

Pero hay otra manera de conseguir que R nos muestre el resultado de la asignacioacuten que es maacutesinteresante porque produce coacutedigo maacutes simple Basta con encerrar toda la asignacioacuten entre pareacuten-tesis El resultado es

gt ( a = b c^2 d + 3 )[1] 1

como antes Este ejemplo es desde luego bastante artificial Te recordamos en cualquier caso laconveniencia de utilizar pareacutentesis para hacer maacutes legibles las expresiones y evitar posibles erroresPero a la vez la posibilidad de comprobar el resultado de las asignaciones aumenta la fiabilidaddel coacutedigo que escribimos

Nombres de las variables

Aunque hasta ahora hemos usado letras como nombres de las variables puedes utilizar nombresmaacutes descriptivos Y muchas veces es una buena idea hacerlo Por ejemplo puede que hace unasemana hayas escrito estas instrucciones para resolver un problema

a = 2b = 3c = a b

Pero si las vuelves a ver pasada una semana es posible que no recuerdes queacute era lo que estabastratando de conseguir al hacer esto En cambio al ver estas instrucciones

espacio = 2tiempo = 3velocidad = espacio tiempo

es mucho maacutes faacutecil reconocer el objetivo que persiguen A lo largo de los tutoriales del curso vamos ainsistir muchas veces en la necesidad de que el coacutedigo esteacute bien organizado y esteacute bien documentadoUn primer paso en esa direccioacuten es tratar de elegir nombres descriptivos para las variables En Rlas reglas para los nombres de variables son muy flexibles esencialmente que empiecen por unaletra y no contengan espacios ni caracteres especiales como + pareacutentesis etceacutetera Pero cuidadocon los excesos Es cierto que puedes usar nombres de variables arbitrariamente largos Pero si usascomo nombre

Estavariablealmacenaelresultadodelaoperaciontaninteresantequeacabamosdehacer

tu trabajo resultaraacute ilegible Como siempre se necesita un equilibrio y con la praacutectica encontraraacutesel tuyo (consejo zen gratuito del tutorial de hoy) Para empezar es una buena idea combinarmayuacutesculas y minuacutesculas en los nombres de las variables Si vas a usar una variable para representarla temperatura final de un proceso el nombre temperaturafinalproceso es menos legible y maacuteslargo que tempFinal Es mucho maacutes faacutecil por otra parte que te equivoques tecleando el primerode esos nombres

10

22 VectoresEn Estadiacutestica lo habitual es trabajar con colecciones o muestras de datos Y para almacenar esascolecciones de datos la estructura maacutes baacutesica de R son los vectores En este apartado vamos aempezar nuestro trabajo con ellos aunque a lo largo del curso auacuten tendremos ocasioacuten de aprenderbastante maacutes sobre el manejo de los vectores de RPara empezar vamos a trabajar con vectores que contienen una coleccioacuten de nuacutemeros que puedenser las edades de los alumnos de una clase

22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19

En R las listas de nuacutemeros como esta se almacenan en vectores El vector que corresponde a esasedades se construye en R mediante un comando como este

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19)

En realidad en esa expresioacuten hemos hecho dos cosas

1 Hemos creado el vector con los datos en la parte derecha de la expresioacuten

c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19)

Los datos estaacuten separados por comas y rodeados por pareacutentesis Hasta aquiacute todo es bastantetiacutepico pero fiacutejate especialmente en la letra c que precede al primer pareacutentesis Esa letra ces el nombre de una nueva funcioacuten de R y es la forma maacutes sencilla que existe en R paracrear un vector de datos Podriacutea pensarse que la c es de crear pero en realidad proviene deconcatenar Enseguida entenderemos porque es asiacute

2 Una vez creado el vector lo hemos asignado a la variable edades Hasta ahora soacutelo habiacuteamosusado variables para identificar un uacutenico valor (un nuacutemero o una cadena alfanumeacuterica)Pero una variable puede usarse para identificar un vector o como veremos maacutes adelanteestructuras mucho maacutes complejas

Una observacioacuten maacutes los vectores de R se usan para almacenar valores de una variable Y enparticular todos los datos de un vector son del mismo tipo de variable No se puede mezclar en unvector nuacutemeros y cadenas alfanumeacutericas (aparentemente R te dejaraacute hacerlo pero internamentehabraacute convertido todos los nuacutemeros en cadenas alfanumeacutericas)

Manos a la obra Prueba a copiar el comando anterior en tu Consola de comandos (puedes usarcopiar y pegar desde este fichero) y ejecuacutetalo Si las cosas van bien no esperes ninguna respuestacomo ya hemos dicho R no te muestra el resultado de las asignaciones Recuerda que si quieresver el resultado de una asignacioacuten puedes rodear toda liacutenea con pareacutentesis como en

(edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19))

Otra opcioacuten naturalmente es preguntarle a R por el valor de edades despueacutes de la asignacioacutenEscribe simplemente edades en la Consola de Comandos y ejecuacutetalo Veraacutes de nuevo el contenidode esa variable

Vamos a hacer algunas operaciones con este vector Imagiacutenate que como sucede a menudo despueacutesde haber creado nuestra lista de edades de alumnos desde la administracioacuten nos avisan de que haycinco alumnos nuevos recieacuten matriculados y debemos incorporar sus edades que son

22 18 20 21 20

a nuestro vector de datos Naturalmente podemos empezar de nuevo pero es preferible reutilizarel vector edades que ya habiacuteamos creado Vamos a ver esto como primer ejemplo para empezar aaprender coacutemo se manipulan vectores en R Una forma de antildeadir los datos es empezar creando unnuevo vector (con la funcioacuten c de R)

(edades2 = c(22 18 20 21 20))

Y a continuacioacuten concatenamos los vectores usando de nuevo la misma funcioacuten c de una maneradistinta

(edades = c( edades edades2))

11

Hemos rodeado toda la liacutenea con pareacutentesis para ver el resultado y poder observar coacutemo hacambiado el vector edadesVamos a analizar paso a paso lo que ha ocurrido

La instruccioacuten c( edades edades2) toma los datos contenidos en edades y edades2 y losconcatena en ese orden para fabricar un nuevo vector que todaviacutea no estaacute guardado enninguna variable

La asignacioacuten edades = c( edades edades2) toma ese vector y lo guarda en la propiavariable edades Al hacer esto como era de esperar el anterior vector edades es reemplazadocon la nueva lista y su contenido anterior se pierde (cuidado con esto las reasignaciones sonuna de las formas habituales de cometer errores)

El nombre de la funcioacuten c proviene en realidad de concatenate concatenar en ingleacutesLa siguiente figura resume lo que hemos venido haciendo con estos datos

Los nuacutemeros entre corchetes al principio de cada fila como el [1] y el [16] de este ejemploson soacutelo ayudas para que podamos localizar los elementos del vector En mi pantalla la primerafila muestra los primeros 15 nuacutemeros del vector Pero en la tuya si la ventana de RStudio es dedistinta anchura los nuacutemeros entre corchetes pueden ser distintos Hasta ahora soacutelo habiacuteamos vistoejemplos con [1] que es lo que sucede cuando la respuesta es un vector que cabe en una uacutenicaliacutenea

3 Ficheros csv con REn esta seccioacuten vamos a aprender a utilizar ficheros csv con R En el Tutorial-01 hemos vistoalgunos ejemplos de ese tipo de ficheros y el manejo baacutesico con una hoja de caacutelculo como CalcComo vimos alliacute un fichero csv tiacutepico contiene una tabla de datos con varias columnas Esaestructura de tabla se haraacute imprescindible maacutes adelante Pero durante una buena parte del cursonosotros nos vamos a limitar a problemas en los que interviene una uacutenica variable En tal casopara almacenar los datos de esa variable nos podemos a limitar a considerar un tipo de ficheroscsv muy baacutesico como el fichero adjunto

Guaacuterdalo en la subcarpeta datos de tu directorio de trabajo (el que contiene este pdf) Si lo abrescon un editor de texto (como el Bloc de Notas en Windows) veraacutes como muestra esta figura

12

61371381381381391391351381371381371371361361371351381391341371351371371351391341371371371381351381391371341361361361391381361371361371361361381361351351361361381351381351391371361391351371381381371310137138137135136138138137133135136137135137137135138134138138138136137136136138135136135138136139137

que el fichero contiene soacutelo una columna de datos que en este ejemplo corresponde a valores deuna variable cuantitativa discreta En la figura soacutelo se muestra una parte de los datos

Ejercicio 3iquestCuaacutentos datos hay en ese vector Usa Calc para averiguarlo pronto aprenderemos a hacerlo conR Solucioacuten en la paacutegina 47

Queremos utilizar esos datos en R y para eso vamos a (1) leerlos desde el fichero y (2)guardarlos enun vector El resultado seraacute como si nosotros hubieacuteramos creado ese vector tecleaacutendo sus elementosdirectamentePara el primer paso (la lectura del fichero csv) vamos a tener que empezar por explicarle a R(usando RStudio como intermediario) donde estaacute el fichero que contiene esos datos Cuando tra-bajamos con ficheros R utiliza un directorio de nuestro ordenador como directorio de trabajo Acontinuacioacuten vamos a aprender a elegir un directorio de trabajo Puedes usar cualquier carpeta yen lo que sigue vamos a suponer que hemos elegido el Escritorio Lo maacutes importante es que esacarpeta debe contener a su vez una subcarpeta llamada datos Y aseguacuterate de que los ficheroscsv que vas a usar estaacuten almacenados en esa subcarpeta llamada datos

Usamos el menuacute Session rarr Set Working Directory rarr Choose Directory

Se abre un cuadro de diaacutelogo del sistema y navegamos hasta la carpeta que contiene el ficherocsv que en mi caso es el Escritorio Cuando selecciono el Escritorio veo aparecer en la Consolade Comandos de R un comando que RStudio ha escrito y ejecutado por nosotros

13

setwd(CUsersFernandoDesktop)

Este es el resultado en mi ordenador (de ahiacute el nombre de usuario) usando Windows 10 Enversiones maacutes antiguas de Windows o en una maacutequina con Linux o un Mac el comando seraacuteligeramente distinto Cuando tengamos maacutes praacutectica aprenderemos otras formas de seleccionar eldirectorio de trabajo o incluso de utilizar ficheros situados fuera de ese directorio de trabajo Peropor el momento resulta maacutes coacutemodo dejar que RStudio haga ese trabajo para nosotrosAhora R ya sabe doacutende estaacute el fichero que nos interesa pero todaviacutea no sabe cual es Para ello vamosa utilizar la funcioacuten readtable de R Aunque esta funcioacuten tiene muchas opciones disponiblesnuestro primer uso de ella seraacute bastante sencillo Copia y ejecuta el siguiente coacutedigo en RStudio

(vectorEdades = readtable(datosTut02-Edadescsvheader = FALSE)[1])

En esta instruccioacuten le decimos a R que use la funcioacuten readtable para leer el contenido del ficheroTut02-Edadescsv y que almacene lo que ha leiacutedo en un vector que hemos decidido llamarvectorEdades Y aunque no es necesario entender en detalle el funcionamiento de readtable eneste momento vamos a explicar un poco maacutes lo que hemos hecho A medida que el curso avanceiraacutes teniendo maacutes ocasiones de practicar esto e iraacute quedando cada vez maacutes claroLa opcioacuten header = FALSE sirver para indicarle a R que la tabla almacenada en el fichero no tieneuna liacutenea de cabecera (en ingleacutes header) que cuando existe suele contener los nombres de lasvariables de la tabla Ademaacutes la funcioacuten readtable sirve para leer tablas con varias columnasobteniendo como resultado un objeto de R de tipo dataframe Pero nuestro primer ejemplo esmuy sencillo y la tabla soacutelo tiene una columna Asiacute que usamos la notacioacuten [1] para indicarle aR que soacutelo queremos la primera columna de esa tabla considerada como un vectorAl ejecutar esa orden habraacutes obtenido una respuesta como esta

gt gt (vectorEdades = readtable(datosTut02-Edadescsv header = FALSE)[1])[1] 6 7 8 8 8 9 9 5 8 7 8 7 7 6 6 7 5 8 9 4 7 5 7[24] 7 5 9 4 7 7 7 8 5 8 9 7 4 6 6 6 9 8 6 7 6 7 6[47] 6 8 6 5 5 6 6 8 5 8 5 9 7 6 9 5 7 8 8 7 10 7 8[70] 7 5 6 8 8 7 3 5 6 7 5 7 7 5 8 4 8 8 8 6 7 6 6[93] 8 5 6 5 8 6 9 7

Como hemos dicho antes los nuacutemeros entre corchetes al principio de cada fila que en mi casoson [1] [24] [47] [70] y [93] son soacutelo ayudas para que podamos localizar los elementos delvector En mi pantalla cada primera fila muestra 23 nuacutemeros del vector Pero en la tuya si laventana de RStudio es de distinta anchura los nuacutemeros entre corchetes pueden ser distintos

En cualquier caso ahora el vector vectorEdades contiene la informacioacuten del fichero csv con el quehemos empezado En la Seccioacuten 4 vamos a empezar a hacer Estadiacutestica Descriptiva Pero antes tepedimos un poco maacutes de paciencia porque vamos a entretenernos un poco maacutes en los detalles delmanejo de ficheros csv con R No pretendemos ser exhaustivos ni mucho menos pero siacute queremosaprender lo suficiente como para evitarnos los problemas maacutes habituales en los casos maacutes sencillosPara cerrar este apartado es conveniente haber visto el error que se produce cuando el fichero quetratamos de leer desde R no existe o no estaacute en el directorio de trabajo

Ejercicio 4Prueba a ejecutar

errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)

y fiacutejate en el mensaje de error Solucioacuten en la paacutegina 47

Otra variante del fichero de entrada

Los ficheros csv que contienen un uacutenico vector (en lugar de una tabla de datos) pueden adoptarformatos distintos del que acabamos de ver Por ejemplo el fichero adjunto

contiene los mismos datos que Tut02-Edadescsv pero ahora los datos del vector estaacuten todos enuna fila y separados por comas Guaacuterdalo como antes en la subcarpeta datos El aspecto delfichero visto a traveacutes de un editor de texto es este (soacutelo son visibles una parte de los datos)

14

67888995878776675894757759477785897466698676766865566858597695788710787568873567577584888676685658697

Desde luego no nos podemos plantear transformar a mano este vector en uno como el anteriorLa solucioacuten que te proponemos pasa por la hoja de caacutelculo y la opcioacuten de trasponer una tablaque hemos visto en el Tutorial-00 lo leeriacuteamos en una fila de la hoja y luego habriacutea que usar elPegado especial para trasponerlo -es decir girarlo- para finalmente volver a guardarlo Alterna-tivamente hay otras soluciones sin salir de R usando una funcioacuten llamada scan o usando de nuevoreadtable y trasponiendo la tabla dentro de R Esos meacutetodos son sencillos cuando se aprendeun poco maacutes sobre R pero por el momento y para los ejemplos sencillos que encontraremos nosvamos a conformar con ese enfoque baacutesico que usa la hoja de Caacutelculo si es necesario

31 Coacutemo obtener ayuda y usar el tabulador en RStudioVamos a aprovechar estos ejemplos de lectura de ficheros csv para aprender a obtener ayuda sobrelas funciones de R La mayoriacutea de las funciones de R como la funcioacuten readtable o la funcioacutenscan que hemos mencionado al final del anterior apartado tienen muchos argumentos opcionalesY hay muchiacutesimas funciones en R (cada vez maacutes porque como veremos maacutes adelante usuarios detodo el mundo antildeaden constantemente funciones nuevas a R cuando las necesitan) No es posiblerecordar todos esas funciones cada una con sus opciones asiacute que es muy importante aprender aobtener esa informacioacuten cuando la necesitamosPara ver como obtener esa informacioacuten en RStudio vamos a usar por ejemplo la funcioacuten scanSituacuteate en una liacutenea vaciacutea de la Consola de Comandos escribe scan y a continuacioacuten mientras elcursor parpadea junto a la n final de scan pulsa la tecla del tabulador (si esto no funciona usa latecla F1 y mira el panel ayuda de RStudio) Veraacutes aparecer una ventana emergente con informacioacutensobre la funcioacuten scan como en esta figura

15

Como ves se muestra un resumen sobre la funcioacuten scan que a veces seraacute suficiente Si necesitasmaacutes detalles haz caso a la indicacioacuten que aparece al final de esa ventana y pulsa la tecla F1 Alhacerlo veraacutes que en el panel inferior derecho de RStudio aparece el fichero de ayuda de la funcioacutenscan como en esta figura

Esos ficheros de ayuda son muy uacutetiles aunque al principio pueden resultar un poco intimidatoriosya sea por un exceso de informacioacuten ya sea porque se da por supuesto que el usuario ya entiendealgunos conceptos baacutesicos de R Podemos garantizar al lector que a medida que se progresa en Rla utilidad de estos ficheros aumentaPero la utilidad de la tecla tabulador en RStudio no se acaba ahiacute Supongamos que quieres aplicarreadtable para leer el fichero Tut02-Edadescsv Pero te da pereza escribir un nombre tan largoo no recuerdas exactamente el nombre o dudas entre dos nombres no importa cual sea el motivoEmpiezas a escribir la orden tecleas

(vectorEdades2 = readtable(datos

y de nuevo justo en este punto pulsas el tabulador Entonces RStudio te ofrece en una nuevaventana emergente todos los ficheros disponibles en la carpeta datos

Y ahora puedes usar esa lista seleccionar el fichero que quieras utilizar Puedes tambieacuten teclearalguna letra maacutes del nombre para acotar auacuten maacutes la buacutesqueda cuando la carpeta contiene muchosficherosEn general la idea es que en RStudio el tabulador es tu amigo Como tendremos ocasioacuten decomprobar RStudio nos ofrece bastante ayuda para hacer maacutes coacutemodo nuestro trabajo con R yel tabulador es una de las herramientas maacutes versaacutetiles y uacutetiles

16

32 El camino contrario escribir un vector a un fichero de tipo csvHemos aprendido a leer con R vectores de datos a partir de ficheros de tipo csv Pero muchasveces despueacutes de hacer operaciones en R obtendremos como resultados nuevos vectores (y maacutesadelante en el curso otro tipo de objetos) Lo natural entonces es aprender a guardar ese vectoren un fichero de tipo csv como el fichero con el que empezamos De esa forma por ejemplo puedescompartir tus resultados con otras personas que utilicen programas distintos de R Para ello siantes usaacutebamos la funcioacuten readtable ahora vamos a usar la funcioacuten writetable de R

Como ejemplo vamos a utilizar este vector de nuacutemeros enteros

29 17 63 31 55 9 92 61 10 16 63 6 61 59 66 41 68 6 99 21 87 68 52 83 66 98 45 5024 100 83 37 44 4 97 67 56 74 75 71 55 22 86 22 93 65 38 84 54 83 100 71 99 1963 11 11 62 91 20 79 42 59 95 70 74 8 25 45 58 57 75 81 34 70 68 39 12 14 21

Ejercicio 5Usa copiar y pegar a partir de este documento pdf para crear un vector de R llamado muestraque contenga esos datos

Para guardar ese vector muestra en un fichero csv (dentro de la subcarpeta datos del directoriode trabajo) podemos utilizar la funcioacuten writetable usando como argumentos

El nombre del vector que queremos guardar que es muestra

Y el nombre del fichero en el que lo guardamos Vamos llamarlo por ejemplo Tut02-muestracsvLe indicamos a R ademaacutes que lo ponga en la subcarpeta datos

La opcioacuten colnames = FALSE o colnames = TRUE para decidir si queremos que R incluyauna liacutenea de cabecera con el nombre de la variable que en este caso es muestra (y que novamos a incluir)

La opcioacuten rownames = FALSE para evitar que R incluya nuacutemeros de fila en el fichero desalida (normalmente no querremos esos nuacutemeros)

Es decir que ejecutamos

writetable(muestrafile = datosTut02-muestracsv colnames=FALSE rownames=FALSE)

Al ejecutar esa orden el fichero que obtenemos tiene la forma deseada (de nuevo soacutelo es visible elcomienzo del fichero)

17

Puedes probar a abrirlo en Calc para ver que es un fichero de datos como los que hemos visto hastaahora

Naturalmente apenas hemos rozado el tema de la entradasalida de datos en R Pero con lo quehemos aprendido en este apartado estamos listos para empezar a hacer Estadiacutestica Descriptivausando ejemplos que no sean demasiado triviales

4 Estadiacutestica descriptiva de una variable cuantitativa condatos no agrupados

Para seguir adelante tenemos que empezar por aprender un poco maacutes sobre la forma en la que Rpermite operar con los vectores Vamos a hacerlo a traveacutes de una serie de ejercicios-ejemplos

Ejercicio 6

1 Vamos a definir dos vectores cada uno de ellos con 12 nuacutemeros enteros El primero al quellamaremos vector1 estaacute formado por

8 5 19 9 17 2 28 18 3 4 19 1

Usa copiar y pegar a partir de este fichero pdf para definir el vector1 en R

2 El segundo vector al que en un rapto de originalidad llamaremos vector2 estaacute almacenadoen el fichero

Guaacuterdalo en datos y examiacutenalo primero con un editor de texto (como el Bloc de Notas)para ver coacutemo estaacuten almacenados los datos en ese fichero Una vez hecho esto usa Calc yla funcioacuten readtable para almacenar el contenido de ese fichero csv en el vector2 de REn alguacuten momento del proceso puede que tengas que usar el pegado especial de Calc paratrasponer los datos

Solucioacuten en la paacutegina 47

41 Aritmeacutetica vectorial en RAhora vamos a sumar los dos vectores Ejecuta el comando

vector1 + vector2

para comprobar que el resultado es la suma componente a componente de los dos vectores

gt vector1 + vector2[1] 26 23 39 21 37 3 58 24 29 24 34 26

Este resultado es bastante previsible Lo que quizaacute resulteacute un poco maacutes inesperado es que simultiplicas los dos vectores tambieacuten se obtienen los productos componente a componente el primerelemento de vector1 se multiplica por el primero de vector2 el segundo por el segundo etc

gt vector1 vector2[1] 144 90 380 108 340 2 840 108 78 80 285 25

Esta forma de operar de R como veremos pronto es muy uacutetil Si lo piensas un momento cadavector numeacuterico de R se corresponde con una columna de una hoja de caacutelculo como las queusaacutebamos en el Tutorial01 Alliacute vimos que para algunas operaciones era necesario multiplicar doscolumnas elemento a elemento En Calc esa operacioacuten no es complicada pero en R es auacuten maacutes faacutecilBasta con un comando como vector1 vector2 para conseguir el objetivo Veremos muchos maacutesejemplos a lo largo del curso en los que una operacioacuten que en Calc requeririacutea bastantes pasosen R se reduce a ejecutar un uacutenico comandoEn R las operaciones con vectores siguen en general este esquema de funcionamiento componentea componente Si por ejemplo ejecutas

18

1818201220130626201525

gt vector1 + 5[1] 13 10 24 14 22 7 33 23 8 9 24 6gt 2 vector1[1] 16 10 38 18 34 4 56 36 6 8 38 2

veraacutes que en el primer caso cada uno de los elementos de vector1 se ha incrementado en 5mientras que en el segundo caso cada uno se ha multiplicado por 2 Sucede lo mismo con otrasoperaciones como elevar al cuadrado

gt vector1^2[1] 64 25 361 81 289 4 784 324 9 16 361 1

Y podemos aplicar funciones en un solo paso Por ejemplo podemos calcular el logaritmo neperianode todos los elementos de un vector en un soacutelo paso

gt log(vector1)[1] 20794415 16094379 29444390 21972246 28332133 06931472[7] 33322045 28903718 10986123 13862944 29444390 00000000

Los resultados de todas estas operaciones son de nuevo vectores Y por tanto se pueden asignara nuevas variables para utilizarlos en nuestras operaciones Por ejemplo si luego vas a necesitar loslogaritmos de vector1 puedes definir una variable para identificar ese vector llamada logVector1(e el nombre que tuacute quieras) haciendo

gt logVector1 = log(vector1)

Recuerda que si ademaacutes de la asignacioacuten quieres ver el resultado puedes rodear toda esta senten-cia con pareacutentesis De lo contrario R la ejecuta pero no imprime ninguna respuesta como ya sabes

Aunque al principio puede parecer complicado cuando te acostumbres a esta forma de trabajarcon vectores veraacutes que resulta muy coacutemoda y eficiente

Generando vectores de nuacutemeros enteros consecutivos

Hay muchas ocasiones en que para alguna operacioacuten necesitamos un vector que contenga losnuacutemeros enteros consecutivos del 1 al n o del 0 al n etc En R esto es muy faacutecil de hacer Porejemplo para conseguir un vector con los nuacutemeros del 1 al 15 basta con ejecutar

gt 115[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Esa notacioacuten con los dos puntos permite generar vectores en los que cada elemento es igual alanterior maacutes 1 Otro ejemplo

gt -713[1] -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13

O incluso cuando los puntos de partida no son enteros

gt 1575[1] 15 25 35 45 55 65 75gt 1574[1] 15 25 35 45 55 65

iquestVes la diferencia entre estos dos casos

Es muy posible que te esteacutes preguntando iquesty si quiero ir avanzando de 2 en 2 o quiero ir hacia atraacutes(ldquoavanzandordquo de minus2 en minus2 por ejemplo) Pronto cuando hayamos aprendido un poco maacutes volve-remos sobre esto y comprobaremos que R nos ofrece un cataacutelogo de herramientas extremadamentepotentes para fabricar vectores de acuerdo con nuestros deseos y necesidadesLos vectores fabricados con este meacutetodo son vectores iguales que los demaacutes y se pueden asignar avariables operar con ellos etc

19

Ejercicio 7

1 Fabrica un vector con los cuadrados de los nuacutemeros del 1 al 10 y asiacutegnalo a la variablecuadrados Usa los pareacutentesis para ver el resultado de la asignacioacuten

2 Haz lo mismo con los cuadrados de los nuacutemeros del 2 al 11 y un vector cuadrados2

3 Resta los vectores cuadrados2 - cuadrados iquestObservas algo interesante

Solucioacuten en la paacutegina 47

Funciones vectoriales

Hemos visto antes que se puede aplicar una funcioacuten como la raiacutez cuadrada a un vector y seobtiene como resultado otro vector con las raiacuteces cuadradas elemento a elemento Pero hay otrotipo de funciones que permiten hacer caacutelculos con el vector en conjunto Por ejemplo antes hemosfabricado el vector -713 y la funcioacuten length nos dice cuantos elementos tiene ese vector

gt length(-713)[1] 21

En el Ejercicio 3 (paacuteg 13) nos preguntaacutebamos cuantos elementos teniacutea el vector vectorEdades quehabiacuteamos cargado desde el fichero csv Puedes obtener la respuesta con length(vectorEdades)Para comprobarlo aseguacuterate de que has creado el vector llamado vectorEdades y ejecuta estaorden

gt length(vectorEdades)[1] 100

Como ves el resultado de length es el esperado

Vamos a conocer otra funcioacuten llamada sum que sirve para calcular la suma de todos los elementosde un vector

gt sum(vectorEdades)[1] 675

Ejercicio 8iquestCuaacutento vale la suma de los cuadrados de los nuacutemeros del 1 al 100 Solucioacuten en la paacutegina 47

A lo mejor te ha pasado desapercibido pero con las funciones length y sum estamos por fin encondiciones de empezar a hacer Estadiacutestica Descriptiva Por ejemplo podemos calcular la mediaaritmeacutetica de vectorEdades

gt ( mediaEdades = sum(vectorEdades) length(vectorEdades) )[1] 675

Y una vez que tenemos la media podemos calcular la varianza poblacional Para que resulte maacutesclaro vamos a mostrarte el proceso paso a paso aunque al final lo ejecutaremos en un soacutelo paso

1 Empezamos restando la media que estaacute en la variable mediaEdades de cada uno de loselementos de vectorEdades

vectorEdades - mediaEdades

El resultado es un vector de diferencias

2 Ahora elevamos cada una de esas diferencias al cuadrado

( vectorEdades - mediaEdades )^2

El resultado de este paso es de nuevo un vector ahora con las diferencias al cuadrado Fiacutejateen el pareacutentesis para garantizar que elevamos al cuadrado la diferencia Si no incluyeacuteramosel pareacutentesis iquestqueacute calculariacuteamos

20

3 A continuacioacuten sumamos todas esas diferencias al cuadrado usando la funcioacuten sum

sum( ( vectorEdades - mediaEdades )^2)

De nuevo el pareacutentesis es fundamental para que el cuadrado del vector de diferencias secalcule antes que la suma En este paso el resultado ya no es un vector sino un nuacutemero

4 Por uacuteltimo dividimos esa suma por n el nuacutemero de elementos de vectorEdades que seobtiene con la funcioacuten length

sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades)

El resultado de estos pasos se puede condensar en un soacutelo comando de R en el que a la vezcalculamos la varianza y la asignamos a una variable

gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades) )[1] 19875

Ejercicio 9

1 Calcula la desviacioacuten tiacutepica (poblacional) de vectorEdades

2 Calcula la cuasivarianza y cuasidesviacioacuten tiacutepica (muestrales) de vectorEdades

3 iquestQueacute sucede si en el tercer paso ejecutas el siguiente comandosum( vectorEdades - mediaEdades )^2iquestPor queacute sucede esto

Solucioacuten en la paacutegina 48

Con estos caacutelculos hemos empezado a hacer Estadiacutestica con R Naturalmente nos queda muchiacutesimoque aprender sobre los vectores de R Por ejemplo como se accede a una componente individualdel vector para responder a preguntas como ldquoiquestCuaacutento vale el quinto elemento del vectorrdquo Maacutesen general aprenderemos a extraer aquellos elementos del vector que cumplan alguna condicioacutenrespondiendo a preguntas como ldquoiquestQueacute elementos del vector son mayores que 7rdquo

42 Y por fin hagamos Estadiacutestica DescriptivaEn esta seccioacuten vamos a trabajar con un vector de datos contenido en este fichero adjunto

Este vector contiene los datos de la variable var3 del fichero Tut01-PracticaConCalccsv queya hemos utilizado en el Tutorial-00 para aprender a hacer Estadiacutestica Descriptiva con Calc Enesta seccioacuten vamos a reproducir los resultados que obtuvimos alliacute pero esta vez usando R Parapreparar el terreno vamos a hacer limpieza

Ejercicio 10

1 Cierra Rstudio y vuelve a abrirlo para limpiar la memora del sistema El trabajo que hemoshecho hasta ahora se perderaacute (aunque los comandos siguen en el Historial de Comandos queya vimos)

2 Establece el Directorio de Trabajo (por ejemplo el Escritorio) y aseguacuterate de que Tut02-var3csvestaacute guardado en la subcarpeta datos de ese directorio

3 Carga de nuevo el contenido de ese fichero en un vector var3 de R

Solucioacuten en la paacutegina 48

Veraacutes en lo que sigue que siempre que calculamos un objeto le asignamos una variable Eso permiteahorrarse la repeticioacuten innecesaria de caacutelculos si maacutes adelante volvemos a necesitar ese objeto Yen algunos casos como veremos maacutes adelante al hacer esto podemos acceder a propiedades delobjeto calculado que R no muestra en su respuesta por defecto

21

4 138 134 134 135 135 133 136 136 132 134 134 133 133 133 132 136 134 135 132 135 136 135 132 136 134 135 133 134 134 134 1310 136 138 134 135 137 133 135 138 136 137 135 134 137 135 136 138 137 134 133 135 135 134 131 135 137 133 133 137 136 135 135 132 138 135 135 135 136 135 133 1311 136 1310 134 131 133 138 139 135 134 1310 134 134 137 135 134 133 132 135 132 136 135 134 133 139 136 135 134 135 132 132 138 134 133 136 138 134 134 134 138 134 132 135 1310 136 1312 135 139 135 138 138 135 132 135 1310 136 135 136 135 135 137 134 133 134 133 133 134 133 133 133 133 137 138 135 134 135 134 135 137 135 133 134 134 137 133 132 135 137 135 134 136 132 135 132 136 1310 134 132 139 134 136 136 132 137 134 138 135 135 134 134 137 134 136 136 135 134 133 135 133 133 136 132 133 134 138 138 137 137 136 135 1310 134 134 134 138 136 134 136 137 135 135 136 138 134 138 134 135 137 136 134 137 137 135 137 132 136 135 133 135 136 130 133 135 135 137 134 137 131 135 136 135 138 132 134 136 139 137 1310 134 135 136 132 135 135 135 1313 133 136 133 136 135 130 1310 134 136 136 134 131 133 135 137 136 133 135 133 134 132 132 138 138 134 136 135 135 134 133 139 134 139 136 1311 133 132 132 136 138 1310 133 137 133 134 135 139 133 135 133 134 138 139 132 138 133 133 137 138 136 133 135 134 132 1311 137 137 136 134 133 135 1310 135 134 135 133 135 136 135 139 135 134 135 135 134 133 137 134 1310 135 134 132 139 134 137 133 135 134 131 136 135 136 134 138 135 135 138 138 134 132 135 133 134 138 138 135 138 132 1311 135 134 134 136 139 1310 137 134 137 132 133 135 1310 135 135 133 135 136 134 134 136 135 137 136 136 134 133 134 135 132 134 136 139 133 135 133 136 133 133 135 134 134 134 137 135 139 1310 133 134 136 131 137 138 135 133 133 135 133 133 137 136 135 135 138 134 139 136 135 135 138 134 130 133 137 133 134 1311 132 137 133 136 135 133 134 133 133 132 138 133 134 134 134 134 138 138 137 136 132 132 137 135 133 135 138 135 134 135 134 135 134 1312 133 135 133 133 133 132 134 131 139 135 135 135 138 138 135 138 133 134 133 136 136 135 134 133 133 135 133 137 135 132 133 133 132 131 132 136 137 130 136 133 134 1310 132 136 137 134 133 132 138 133 135 133 135 136 132 134 134 133 135 135 135 134 134 136 133 132 138 1310 135 135 132 132 137 136 134 135 134 134 136 134 136 135 133 137 137 136 137 134 134 137 133 130 134 136 135 137 136 136 135 137 134 134 135 136 136 135 136 132 134 133 139 135 133 137 135 136 137 136 136 136 134 135 137 137 133 134 137 137 136 133 134 137 131 135 136 133 137 133 135 133 137 138 133 137 132 135 134 133 132 135 134 134 135 133 134 139 135 134 139 137 133 132 133 134 133 134 135 135 138 134 135 134 135 139 137 133 133 132 136 132 138 135 132 137 134 135 136 132 134 135 135 133 135 136 137 135 138 132 131 137 135 135 138 134 137 136 139 1310 137 134 131 136 132 136 137 133 135 137 135 132 135 135 133 133 137 134 133 133 131 138 139 132 134 138 135 136 138 137 1310 138 133 134 134 135 134 134 135 136 135 134 134 135 133 136 135 137 132 133 139 132 133 137 136 134 137 131 135 134 132 134 138 135 134 131 132 134 135 136 133 134 138 134 132 135 134 132 134 133 136 135 138 133 139 1310 134 133 133 137 137 136 137 133 133 133 135 139 136 136 137 136 135 132 132 139 136 132 139 132 137 135 133 138 137 135 134 136 131 133 135 133 134 137 135 134 132 136 136 136 137 133 132 135 134 135 134 137 134 133 133 134 132 134 135 134 134 136 134 135 138 133 135 135 138 133 135 134 135 135 138 1311 132 134 134 136 133 135 133 136 132 131 136 134 136 132 136 136 136 136 130 136 134 134 131 138 131 1310 135 139 136 132 136 138 135 138 134 132 134 133 136 137 133 133 133 133 137 136 135 133 139 133 132 135 136 136 134 132 132 135 137 136 136 136 138 137 137 135 135 131 136 133 136 135 133 134 130 133 135 136 137 138 136 134 135 132 137 132 137 132 133 134 135 138 134 136 133 135 135 139 134 134 136 134 134 134 135 134 133 135 135 138 133 136 136 134 135 134 134 138 136 133 137 132 134 137 136 135 133 134 133 135 134 134 136 134 133 137 133 135 135 136 135 138 134 136 132 137 136 138 134 136 136 137 136 136 135 136 1310 138 133 137 135 136 137 134 136 133 134 133 132 132 134 137 132 132 133 132 138 134 134 135 135 139 135 134 132 134 135 134 139 137 133 134 134 135 133 133 137 138 135 139 133 138 136 136 134 133 136 135 1314 137 133 137 135 136 134 134 136 133 135 134 135 136 136 135 133 135 131 135 137 135 136 133 137 135 134 133 134 134 134 134 134 136 132 134 136 136 137 139 134 138 133 133 132 135 131 134 133 137 133 133 134 139 138 134 134 137 137 135 136 134 139 137 138 134 133 134 134 135 137 134 135 138 133 132 134 1310 133 135 134 132 138 137 136 135 138 1314 139 135 135 131 134 135 134 135 135 135 133 136 135 135 132 136 139 133 133 136 134 132 132 137 136 131 137 135 135 134 1313 1310 132 134 134 133 138 135 134 133 136 136 136 1310 134 137 136 138 139 137 135 134 134 137 137 138 133 134 135 137 135 136 1310 136 136 138 133 136 133 134 135 135 134 136 133 136 136 137 134 135 1316 136 136 132 136 136 133 134 133 137 134 135 134 133 138 134 1310 136 136 136 137 134 136 137 132 138 136 131 132 134 135 130 134 135 135 137 130 136 135 131 136 137 133 137 135 139 138 135 139 133 137 139 133 136 137 136 138 134 1310 136 134 133 139 136 137 133 13713

Rango maacuteximo y miacutenimo

Para empezar vamos a aprender tres nuevas funciones de R que nos permiten calcular esos tresvalores

gt (minimo = min(var3) )[1] 0gt (maximo = max(var3) )[1] 16gt (rango = range(var3) )[1] 0 16

El funcionamiento de las dos primeras es evidente La funcioacuten range devuelve un vector formadopor el maacuteximo y el miacutenimo

Tablas de frecuencia Clases de objetos en R

La tabla de frecuencia absoluta de var3 se obtiene usando la funcioacuten table de esta forma tansencilla

gt ( tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

La primera fila contiene los elementos de var3 y en la segunda aparece la frecuencia de cada unode ellos Puedes comprobar que son los mismos resultados que obtuvimos con Calc en la paacutegina10 del Tutorial01 Aunque alliacute desde luego el proceso fue maacutes laborioso

A lo mejor te has dado cuenta de que el formato de la respuesta es diferente de los que hemosobtenido hasta ahora Para empezar la respuesta no empieza con el [1] al que ya nos vamosacostumbrando El motivo de esto es que el objeto que hemos obtenido como respuesta no es unvector sino una tabla Ya dijimos que R utiliza distintos tipos de objetos con fines distintosiquestCoacutemo podemos saber de queacute clase es un objeto Pues usando una funcioacuten de R oportunamentellamada class Si la usamos con el vector var3 y con su tabla de frecuencias obtenemos

gt class(var3)[1] numericgt class(tablaFrecAbs)[1] table

El vector var3 es de clase numeric porque es un vector de nuacutemeros Y la tabla de frecuencias esde clase table Veremos a lo largo del curso otros objetos de tipo tabular como las matrices (clasematrix) los conjuntos de datos (clase dataframe) y los arraysAunque las tablas son objetos distintos de los vectores tienen algunas propiedades en comuacuten yalgunas de las funciones que hemos usado con vectores tambieacuten se pueden usar con tablas

Ejercicio 11Aplica las funciones length sum min max y range a la tabla tablaFrecAbs Solucioacuten en la paacutegina48

Siguiendo con los parecidos entre tablas y vectores puedes multiplicar (o dividir) una tabla porun nuacutemero y la operacioacuten se haraacute elemento a elemento

gt 2 tablaFrecAbsvar30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1618 50 200 376 488 492 372 262 174 86 56 12 4 4 4 2

Como ves cada frecuencia se multiplica por 2 Esta propiedad de las tablas permite obtener deforma muy sencilla la tabla de frecuencias relativa de var3 Como primer paso vamos a guardarla longitud de var3 en la variable n

22

gt ( n = length( var3 ) )[1] 1300

Y ahora podemos dividir la tabla por n para conseguir la tabla de frecuencias relativas (hemosestrechado la Consola de Comandos para que el resultado cupiera en esta paacutegina)

gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 400069230769 00192307692 00769230769 01446153846 01876923077

5 6 7 8 901892307692 01430769231 01007692308 00669230769 00330769231

10 11 12 13 1400215384615 00046153846 00015384615 00015384615 00015384615

1600007692308

Ejercicio 12Ya sabemos cuanto debe sumar esta tabla de frecuencias relativas Comprueacutebalo Solucioacuten en lapaacutegina 48

Si lo que queremos es una tabla de frecuencias acumuladas debemos emplear la funcioacuten cumsum

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Ejercicio 13La uacuteltima tabla que falta es la de frecuencias relativas acumuladas pero ya tienes todos los ingre-dientes para obtenerla de dos maneras diferentes Hazlo y comprueba si dan el mismo resultadoSi no es asiacute iquesta queacute crees que se debe y cuaacutel es la mejor opcioacuten Asigna el resultado a la variabletablaFrecRelAcu Solucioacuten en la paacutegina 49

Graacuteficos de columnas y diagramas de caja (boxplot) Argumentos con nombre

Vamos a fabricar nuestros primeros graacuteficos con R En concreto vamos a dibujar un graacutefico debarras a partir de la tabla de frecuencias de var3 usando la funcioacuten barplot de R

gt barplot(tablaFrecAbs)

Al ejecutar este comando no debes ver ninguna salida en la Consola de Comandos En su lugaren el panel inferior derecho de RStudio concretamente en la ventana Plots apareceraacute el graacuteficodeseado El resultado puede variar dependiendo de la anchura de tu ventana de RStudio

23

Hemos destacado ademaacutes en la figura los dos botones Zoom y Export que te permiten respecti-vamente ver una versioacuten ampliada de la Figura (que se redimensiona dinaacutemicamente si cambiasla ventana) y guardar esa figura como un fichero de graacuteficos que puedes insertar en cualquierdocumento editar con un programa de manipulacioacuten de graacuteficos etceacuteteraLos graacuteficos de R se pueden controlar hasta en sus detalles maacutes miacutenimos Como aperitivo miacutenimovamos a antildeadir algo de color al graacutefico

gt barplot(tablaFrecAbs col = heatcolors(15))

El resultado es esta figura

Las posibilidades de control de los graacuteficos de R son como decimos inmensas y pueden llegar aser abrumadoras Hay libros de cientos de paacuteginas dedicados a este tema como el R GraphicsCookbook de W Chang (ver las referencias del curso) Nosotros a lo largo de los tutoriales delcurso vamos a aprender algo maacutes aunque a penas nos podremos limitar a rozar la superficie delo que se puede llegar a hacerEn la Seccioacuten 231 del libro hemos descrito los diagramas de cajas o boxplots (recuerda la Figura22 de la paacuteg 36 del libro) Y en el Tutorial-01 dijimos que con Calc no es faacutecil dibujar ese tipode diagramas En cambio con R no podriacutea ser maacutes faacutecil

gt boxplot(var3)

Y el resultado es esta figura

24

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

3^2

con el que hemos empezado Y con la flecha hacia abajo recorres la lista en sentido contrario hastael comando de ejecucioacuten maacutes reciente Esa lista de comandos es el Historial de Comandos Usandolas flechas arriba y abajo puedes recorrer el Historial de Comandos detenerte en cualquier puntomodificar ese comando si lo deseas y despueacutes ejecutarlo (con o sin modificaciones) Al principiopuede que te cueste un poco acostumbrarte pero una vez que te habituacutees a esta herramientala encontraraacutes sin duda muy uacutetil El Historial de Comandos que puedes recorrer con las flechasarriba y abajo se limita a la sesioacuten de trabajo actual Pero si miras en el panel superior derecho deRStudio veraacutes una pestantildea titulada History que se muestra en esta figura

El Historial de Comandos que aparece en ese panel refleja tus comandos de esta y anterioressesiones Si esta es tu primera sesioacuten de trabajo con R ambos coincidiraacuten claro estaacute Pero a medidaque vayas abriendo RStudio en diacuteas sucesivos te puede resultar muy uacutetil localizar por ejemploun comando que usaste hace dos sesiones pero que no recuerdas exactamente Los comandos queaparecen en ese panel se pueden copiar y pegar en la Consola de Comandos o de forma maacutes directapuedes seleccionar uno de ellos con el ratoacuten y pulsar en el botoacuten To Console que hemos destacadoen la Figura

111 Errores

Los errores son inevitables y nos conviene estar preparados para su aparicioacuten Dependiendo delmotivo del error R nos informaraacute con distintos tipos de mensajes Asiacute que vamos a ver algunosejemplos para conocer la terminologiacutea asociadaPara empezar este es el mensaje de error que obtenemos tras ejecutar una expresioacuten sin sentido

gt 43Error unexpected rsquorsquo in 4

Los mensajes de error aparecen en color rojo en RStudio Este mensaje de error en particulares bastante faacutecil de entender R simplemente se queja de que esta expresioacuten es defectuosa Noincompleta como alguna que hemos visto antes Es imposible completar esta expresioacuten de formacorrectaVeamos otro tipo de mensaje de error Ya sabes que no se puede dividir por 0 Si lo intentamos enR

gt 20[1] Inf

7

el siacutembolo Inf (de infinito) nos avisa del problema Ese siacutembolo tambieacuten puede aparecer con signomenos si por ejemplo tratas de calcular el logaritmo neperiano de 0 En R el logaritmo neperianoes la funcioacuten log asiacute que seriacutea

gt log(0)[1] -Inf

En ambos casos R no lanza un mensaje de error pero utiliza el siacutembolo de infinito porque asiacute nosproporciona maacutes informacioacuten matemaacutetica sobre lo que ha ocurrido Tambieacuten puede suceder queel siacutembolo Inf aparezca como resultado intermedio en una expresioacuten En ese caso R aplica unasreglas sencillas de aritmeacutetica con infinitos para tratar de darnos la respuesta maacutes coherente desdeel punto de vista matemaacutetico Por ejemplo si calculas

3(-5(4-2^2))

Entonces R empieza calculando el resultado del pareacutentesis 4-2ˆ2 que es 0 Asiacute que al dividir minus5entre 0 R obtiene -Inf y finalmente al calcular 3(-Inf) se obtiene -Inf como valor de laexpresioacuten Comprobeacutemoslo

gt 3(-5(4-2^2))[1] -Inf

A pesar de que R no lanza mensajes de error estaacute claro que en la mayoriacutea de los casos no esdeseable que nuestros caacutelculos produzcan Inf como resultado en ninguna etapaEn otros casos el problema es diferente Por ejemplo si tratas de calcular la raiacutez cuadrada de unnuacutemero negativo

gt sqrt(-4)[1] NaNWarning messageIn sqrt(-4) NaNs produced

En este caso obtenemos una respuesta NaN y ademaacutes una advertencia (warning) sobre la aparicioacutende esa respuesta El siacutembolo NaN es la abreviatura de Not a Number es decir ldquono es un nuacutemerordquo Estaes la respuesta que obtendremos cuando tratamos de hacer operaciones como esta que producencomo resultado un nuacutemero complejo R es capaz de trabajar con los nuacutemeros complejos pero comono los vamos a necesitar en el curso no nos ocuparemos de esto Para que veas otro ejemplo esarespuesta NaN aparece tambieacuten si tratamos de ir demasiado lejos con la aritmeacutetica con infinitos

gt (10)+log(0)[1] NaN

En este caso R se ha encontrado en un paso intermedio con Inf - Inf y su respuesta ha sido NaN

En cualquier caso y como resumen final tenemos que tratar de evitar que nuestros caacutelculos con-duzcan a este tipo de expresiones

Haciendo limpieza en la Consola de Comandos

Si has seguido todas las instrucciones hasta aquiacute tu Consola de Comandos seguramente empiezaa estar llena de comandos y algunos pueden quedar ocultos en la parte superior Naturalmentepuedes usar las barras de desplazamiento para moverte por la Consola Pero en sesiones largas detrabajo o cuando hemos terminado de hacer pruebas y queremos ejecutar una versioacuten definitivade nuestro trabajo es normal que queramos hacer limpieza en la Consola Eso se consigue con lacombinacioacuten de teclas Ctrl + L iexclCuidado Es un proceso no reversible podraacutes seguir navegandoel Historial de Comandos con las teclas arriba y abajo pero para recuperar los resultados tendraacutesque ejecutar de nuevo los comandosMaacutes adelante aprenderemos formas de guardar nuestro trabajo de una manera maacutes eficiente Perote podemos adelantar que puesto R se maneja escribiendo comandos bastaraacute con guardar esoscomandos en ficheros de texto plano Ahora vamos a cambiar de tema y para empezar desde cerovamos a cerrar RStudio para eliminar las trazas del trabajo que hemos hecho

2 Variables y vectoresVuelve a abrir RStudio para continuar el trabajo En la seccioacuten previa hemos usado R como unacalculadora Pero para ir maacutes allaacute tenemos que disponer de estructuras de datos Ese teacutermino

8

describe en Computacioacuten las herramientas que nos permiten almacenar y procesar informacioacutenLas estructuras de datos maacutes baacutesicas de R son las variables y los vectores En proacuteximos tutorialesnos iremos encontrando con otras estructuras de datos matrices dataframes listas entre otras

21 Variables en RUna variable en R es un siacutembolo que usamos para referirnos a un valor Por ejemplo si te situacuteasen la Consola de Comandos tecleas

a = 2

y ejecutas esa instruccioacuten entonces aunque aparentemente no ha sucedido nada (porque no hayrespuesta) a partir de ese momento R ha asignado el valor 2 al siacutembolo a Asiacute que si por ejemplotecleas y ejecutas

a + 1

obtendraacutes como respuesta 3

Ejercicio 2iquestQueacute se obtiene al ejecutar estos comandos uno detraacutes de otro iquestCuaacutento valen las variables a by c al final

a = 2b = 3c = a + ba = b cb = (c - a)^2c = a b

La solucioacuten estaacute en la paacutegina 47 iexclNo la mires antes de intentar pensar el ejercicio por ti mismo

En el Capiacutetulo 1 del libro hemos hablado de variables cualitativas y cuantitativas Estas uacuteltimastoman siempre valores numeacutericos y las variables de R sirven desde luego para almacenar esa clasede valores Pero como iremos viendo en sucesivos tutoriales tambieacuten se pueden utilizar variablesde R para guardar valores de variables cualitativas (factores) y otros tipos de objetos que iremosconociendo a lo largo del curso De momento para que veas a que nos referimos recordaremos elEjemplo 111 del libro (paacuteg 6) en el que teniacuteamos una variable cualitativa ordenada que representael pronoacutestico de un paciente que ingresa en un hospital Prueba a ejecutar este coacutedigo

pronostico = Leve

simplemente para que de momento veas que

R no protesta El valor Leve es un valor perfectamente aceptable

En R los valores que representan palabras frases o como las llamaremos teacutecnicamente cadenasalfanumeacutericas se escriben siempre entre comillas Puedes usar comillas simples o dobles perote aconsejamos que uses dobles comillas

La relacioacuten entre factores y valores alfanumeacutericos en R es algo maacutes complicada de lo que estesencillo ejemplo parece sugerir Pero ya tendremos ocasioacuten en futuros tutoriales de extendernossobre eso

Asignaciones

Las instrucciones como

a = 2

o como

b = (c - a)^2

se denominan asignaciones En la primera por ejemplo decimos que hemos asignado el valor 2a la variable aQueremos advertir al lector de que en R hay otra forma esencialmente equivalente de escribir lasinstrucciones y que de hecho se usa mayoritariamente En lugar del siacutembolo = puedes conseguirel mismo efecto escribiendo lt- (el signo ldquomenorrdquo seguido sin espacios de un signo ldquomenosrdquo) Asiacuteque si ejecutas

9

a lt- 2

el resultado seraacute el mismo que antes con = Las dos notaciones tienen ventajas e inconvenientes peronosotros preferimos = porque se parece maacutes a lo que se utiliza en muchos lenguajes de programacioacuten

Coacutemo ver los resultados de un caacutelculo a la vez que lo hacemos

Ya habraacutes notado que al hacer una asignacioacuten R no produce ninguna respuesta y se limita aguardar el valor en la variable En una asignacioacuten como a=2 esto no genera ninguna duda Perosi el miembro derecho de la asignacioacuten es una expresioacuten maacutes complicada puede ser convenientepedirle a R que nos muestre el resultado de esa expresioacuten a la vez que se hace la asignacioacutenImagiacutenate por ejemplo esta situacioacuten

b = 2c = -2d = -4a = b c^2 d + 3

iquestCuaacutel es el valor que se asigna a la variable a Una forma de averiguarlo es simplemente ejecutaruna liacutenea adicional en la que aparece soacutelo el nombre de la variable que queremos inspeccionar Alejecutar esta sentencia R nos devuelve como respuesta

gt a[1] 1

Pero hay otra manera de conseguir que R nos muestre el resultado de la asignacioacuten que es maacutesinteresante porque produce coacutedigo maacutes simple Basta con encerrar toda la asignacioacuten entre pareacuten-tesis El resultado es

gt ( a = b c^2 d + 3 )[1] 1

como antes Este ejemplo es desde luego bastante artificial Te recordamos en cualquier caso laconveniencia de utilizar pareacutentesis para hacer maacutes legibles las expresiones y evitar posibles erroresPero a la vez la posibilidad de comprobar el resultado de las asignaciones aumenta la fiabilidaddel coacutedigo que escribimos

Nombres de las variables

Aunque hasta ahora hemos usado letras como nombres de las variables puedes utilizar nombresmaacutes descriptivos Y muchas veces es una buena idea hacerlo Por ejemplo puede que hace unasemana hayas escrito estas instrucciones para resolver un problema

a = 2b = 3c = a b

Pero si las vuelves a ver pasada una semana es posible que no recuerdes queacute era lo que estabastratando de conseguir al hacer esto En cambio al ver estas instrucciones

espacio = 2tiempo = 3velocidad = espacio tiempo

es mucho maacutes faacutecil reconocer el objetivo que persiguen A lo largo de los tutoriales del curso vamos ainsistir muchas veces en la necesidad de que el coacutedigo esteacute bien organizado y esteacute bien documentadoUn primer paso en esa direccioacuten es tratar de elegir nombres descriptivos para las variables En Rlas reglas para los nombres de variables son muy flexibles esencialmente que empiecen por unaletra y no contengan espacios ni caracteres especiales como + pareacutentesis etceacutetera Pero cuidadocon los excesos Es cierto que puedes usar nombres de variables arbitrariamente largos Pero si usascomo nombre

Estavariablealmacenaelresultadodelaoperaciontaninteresantequeacabamosdehacer

tu trabajo resultaraacute ilegible Como siempre se necesita un equilibrio y con la praacutectica encontraraacutesel tuyo (consejo zen gratuito del tutorial de hoy) Para empezar es una buena idea combinarmayuacutesculas y minuacutesculas en los nombres de las variables Si vas a usar una variable para representarla temperatura final de un proceso el nombre temperaturafinalproceso es menos legible y maacuteslargo que tempFinal Es mucho maacutes faacutecil por otra parte que te equivoques tecleando el primerode esos nombres

10

22 VectoresEn Estadiacutestica lo habitual es trabajar con colecciones o muestras de datos Y para almacenar esascolecciones de datos la estructura maacutes baacutesica de R son los vectores En este apartado vamos aempezar nuestro trabajo con ellos aunque a lo largo del curso auacuten tendremos ocasioacuten de aprenderbastante maacutes sobre el manejo de los vectores de RPara empezar vamos a trabajar con vectores que contienen una coleccioacuten de nuacutemeros que puedenser las edades de los alumnos de una clase

22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19

En R las listas de nuacutemeros como esta se almacenan en vectores El vector que corresponde a esasedades se construye en R mediante un comando como este

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19)

En realidad en esa expresioacuten hemos hecho dos cosas

1 Hemos creado el vector con los datos en la parte derecha de la expresioacuten

c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19)

Los datos estaacuten separados por comas y rodeados por pareacutentesis Hasta aquiacute todo es bastantetiacutepico pero fiacutejate especialmente en la letra c que precede al primer pareacutentesis Esa letra ces el nombre de una nueva funcioacuten de R y es la forma maacutes sencilla que existe en R paracrear un vector de datos Podriacutea pensarse que la c es de crear pero en realidad proviene deconcatenar Enseguida entenderemos porque es asiacute

2 Una vez creado el vector lo hemos asignado a la variable edades Hasta ahora soacutelo habiacuteamosusado variables para identificar un uacutenico valor (un nuacutemero o una cadena alfanumeacuterica)Pero una variable puede usarse para identificar un vector o como veremos maacutes adelanteestructuras mucho maacutes complejas

Una observacioacuten maacutes los vectores de R se usan para almacenar valores de una variable Y enparticular todos los datos de un vector son del mismo tipo de variable No se puede mezclar en unvector nuacutemeros y cadenas alfanumeacutericas (aparentemente R te dejaraacute hacerlo pero internamentehabraacute convertido todos los nuacutemeros en cadenas alfanumeacutericas)

Manos a la obra Prueba a copiar el comando anterior en tu Consola de comandos (puedes usarcopiar y pegar desde este fichero) y ejecuacutetalo Si las cosas van bien no esperes ninguna respuestacomo ya hemos dicho R no te muestra el resultado de las asignaciones Recuerda que si quieresver el resultado de una asignacioacuten puedes rodear toda liacutenea con pareacutentesis como en

(edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19))

Otra opcioacuten naturalmente es preguntarle a R por el valor de edades despueacutes de la asignacioacutenEscribe simplemente edades en la Consola de Comandos y ejecuacutetalo Veraacutes de nuevo el contenidode esa variable

Vamos a hacer algunas operaciones con este vector Imagiacutenate que como sucede a menudo despueacutesde haber creado nuestra lista de edades de alumnos desde la administracioacuten nos avisan de que haycinco alumnos nuevos recieacuten matriculados y debemos incorporar sus edades que son

22 18 20 21 20

a nuestro vector de datos Naturalmente podemos empezar de nuevo pero es preferible reutilizarel vector edades que ya habiacuteamos creado Vamos a ver esto como primer ejemplo para empezar aaprender coacutemo se manipulan vectores en R Una forma de antildeadir los datos es empezar creando unnuevo vector (con la funcioacuten c de R)

(edades2 = c(22 18 20 21 20))

Y a continuacioacuten concatenamos los vectores usando de nuevo la misma funcioacuten c de una maneradistinta

(edades = c( edades edades2))

11

Hemos rodeado toda la liacutenea con pareacutentesis para ver el resultado y poder observar coacutemo hacambiado el vector edadesVamos a analizar paso a paso lo que ha ocurrido

La instruccioacuten c( edades edades2) toma los datos contenidos en edades y edades2 y losconcatena en ese orden para fabricar un nuevo vector que todaviacutea no estaacute guardado enninguna variable

La asignacioacuten edades = c( edades edades2) toma ese vector y lo guarda en la propiavariable edades Al hacer esto como era de esperar el anterior vector edades es reemplazadocon la nueva lista y su contenido anterior se pierde (cuidado con esto las reasignaciones sonuna de las formas habituales de cometer errores)

El nombre de la funcioacuten c proviene en realidad de concatenate concatenar en ingleacutesLa siguiente figura resume lo que hemos venido haciendo con estos datos

Los nuacutemeros entre corchetes al principio de cada fila como el [1] y el [16] de este ejemploson soacutelo ayudas para que podamos localizar los elementos del vector En mi pantalla la primerafila muestra los primeros 15 nuacutemeros del vector Pero en la tuya si la ventana de RStudio es dedistinta anchura los nuacutemeros entre corchetes pueden ser distintos Hasta ahora soacutelo habiacuteamos vistoejemplos con [1] que es lo que sucede cuando la respuesta es un vector que cabe en una uacutenicaliacutenea

3 Ficheros csv con REn esta seccioacuten vamos a aprender a utilizar ficheros csv con R En el Tutorial-01 hemos vistoalgunos ejemplos de ese tipo de ficheros y el manejo baacutesico con una hoja de caacutelculo como CalcComo vimos alliacute un fichero csv tiacutepico contiene una tabla de datos con varias columnas Esaestructura de tabla se haraacute imprescindible maacutes adelante Pero durante una buena parte del cursonosotros nos vamos a limitar a problemas en los que interviene una uacutenica variable En tal casopara almacenar los datos de esa variable nos podemos a limitar a considerar un tipo de ficheroscsv muy baacutesico como el fichero adjunto

Guaacuterdalo en la subcarpeta datos de tu directorio de trabajo (el que contiene este pdf) Si lo abrescon un editor de texto (como el Bloc de Notas en Windows) veraacutes como muestra esta figura

12

61371381381381391391351381371381371371361361371351381391341371351371371351391341371371371381351381391371341361361361391381361371361371361361381361351351361361381351381351391371361391351371381381371310137138137135136138138137133135136137135137137135138134138138138136137136136138135136135138136139137

que el fichero contiene soacutelo una columna de datos que en este ejemplo corresponde a valores deuna variable cuantitativa discreta En la figura soacutelo se muestra una parte de los datos

Ejercicio 3iquestCuaacutentos datos hay en ese vector Usa Calc para averiguarlo pronto aprenderemos a hacerlo conR Solucioacuten en la paacutegina 47

Queremos utilizar esos datos en R y para eso vamos a (1) leerlos desde el fichero y (2)guardarlos enun vector El resultado seraacute como si nosotros hubieacuteramos creado ese vector tecleaacutendo sus elementosdirectamentePara el primer paso (la lectura del fichero csv) vamos a tener que empezar por explicarle a R(usando RStudio como intermediario) donde estaacute el fichero que contiene esos datos Cuando tra-bajamos con ficheros R utiliza un directorio de nuestro ordenador como directorio de trabajo Acontinuacioacuten vamos a aprender a elegir un directorio de trabajo Puedes usar cualquier carpeta yen lo que sigue vamos a suponer que hemos elegido el Escritorio Lo maacutes importante es que esacarpeta debe contener a su vez una subcarpeta llamada datos Y aseguacuterate de que los ficheroscsv que vas a usar estaacuten almacenados en esa subcarpeta llamada datos

Usamos el menuacute Session rarr Set Working Directory rarr Choose Directory

Se abre un cuadro de diaacutelogo del sistema y navegamos hasta la carpeta que contiene el ficherocsv que en mi caso es el Escritorio Cuando selecciono el Escritorio veo aparecer en la Consolade Comandos de R un comando que RStudio ha escrito y ejecutado por nosotros

13

setwd(CUsersFernandoDesktop)

Este es el resultado en mi ordenador (de ahiacute el nombre de usuario) usando Windows 10 Enversiones maacutes antiguas de Windows o en una maacutequina con Linux o un Mac el comando seraacuteligeramente distinto Cuando tengamos maacutes praacutectica aprenderemos otras formas de seleccionar eldirectorio de trabajo o incluso de utilizar ficheros situados fuera de ese directorio de trabajo Peropor el momento resulta maacutes coacutemodo dejar que RStudio haga ese trabajo para nosotrosAhora R ya sabe doacutende estaacute el fichero que nos interesa pero todaviacutea no sabe cual es Para ello vamosa utilizar la funcioacuten readtable de R Aunque esta funcioacuten tiene muchas opciones disponiblesnuestro primer uso de ella seraacute bastante sencillo Copia y ejecuta el siguiente coacutedigo en RStudio

(vectorEdades = readtable(datosTut02-Edadescsvheader = FALSE)[1])

En esta instruccioacuten le decimos a R que use la funcioacuten readtable para leer el contenido del ficheroTut02-Edadescsv y que almacene lo que ha leiacutedo en un vector que hemos decidido llamarvectorEdades Y aunque no es necesario entender en detalle el funcionamiento de readtable eneste momento vamos a explicar un poco maacutes lo que hemos hecho A medida que el curso avanceiraacutes teniendo maacutes ocasiones de practicar esto e iraacute quedando cada vez maacutes claroLa opcioacuten header = FALSE sirver para indicarle a R que la tabla almacenada en el fichero no tieneuna liacutenea de cabecera (en ingleacutes header) que cuando existe suele contener los nombres de lasvariables de la tabla Ademaacutes la funcioacuten readtable sirve para leer tablas con varias columnasobteniendo como resultado un objeto de R de tipo dataframe Pero nuestro primer ejemplo esmuy sencillo y la tabla soacutelo tiene una columna Asiacute que usamos la notacioacuten [1] para indicarle aR que soacutelo queremos la primera columna de esa tabla considerada como un vectorAl ejecutar esa orden habraacutes obtenido una respuesta como esta

gt gt (vectorEdades = readtable(datosTut02-Edadescsv header = FALSE)[1])[1] 6 7 8 8 8 9 9 5 8 7 8 7 7 6 6 7 5 8 9 4 7 5 7[24] 7 5 9 4 7 7 7 8 5 8 9 7 4 6 6 6 9 8 6 7 6 7 6[47] 6 8 6 5 5 6 6 8 5 8 5 9 7 6 9 5 7 8 8 7 10 7 8[70] 7 5 6 8 8 7 3 5 6 7 5 7 7 5 8 4 8 8 8 6 7 6 6[93] 8 5 6 5 8 6 9 7

Como hemos dicho antes los nuacutemeros entre corchetes al principio de cada fila que en mi casoson [1] [24] [47] [70] y [93] son soacutelo ayudas para que podamos localizar los elementos delvector En mi pantalla cada primera fila muestra 23 nuacutemeros del vector Pero en la tuya si laventana de RStudio es de distinta anchura los nuacutemeros entre corchetes pueden ser distintos

En cualquier caso ahora el vector vectorEdades contiene la informacioacuten del fichero csv con el quehemos empezado En la Seccioacuten 4 vamos a empezar a hacer Estadiacutestica Descriptiva Pero antes tepedimos un poco maacutes de paciencia porque vamos a entretenernos un poco maacutes en los detalles delmanejo de ficheros csv con R No pretendemos ser exhaustivos ni mucho menos pero siacute queremosaprender lo suficiente como para evitarnos los problemas maacutes habituales en los casos maacutes sencillosPara cerrar este apartado es conveniente haber visto el error que se produce cuando el fichero quetratamos de leer desde R no existe o no estaacute en el directorio de trabajo

Ejercicio 4Prueba a ejecutar

errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)

y fiacutejate en el mensaje de error Solucioacuten en la paacutegina 47

Otra variante del fichero de entrada

Los ficheros csv que contienen un uacutenico vector (en lugar de una tabla de datos) pueden adoptarformatos distintos del que acabamos de ver Por ejemplo el fichero adjunto

contiene los mismos datos que Tut02-Edadescsv pero ahora los datos del vector estaacuten todos enuna fila y separados por comas Guaacuterdalo como antes en la subcarpeta datos El aspecto delfichero visto a traveacutes de un editor de texto es este (soacutelo son visibles una parte de los datos)

14

67888995878776675894757759477785897466698676766865566858597695788710787568873567577584888676685658697

Desde luego no nos podemos plantear transformar a mano este vector en uno como el anteriorLa solucioacuten que te proponemos pasa por la hoja de caacutelculo y la opcioacuten de trasponer una tablaque hemos visto en el Tutorial-00 lo leeriacuteamos en una fila de la hoja y luego habriacutea que usar elPegado especial para trasponerlo -es decir girarlo- para finalmente volver a guardarlo Alterna-tivamente hay otras soluciones sin salir de R usando una funcioacuten llamada scan o usando de nuevoreadtable y trasponiendo la tabla dentro de R Esos meacutetodos son sencillos cuando se aprendeun poco maacutes sobre R pero por el momento y para los ejemplos sencillos que encontraremos nosvamos a conformar con ese enfoque baacutesico que usa la hoja de Caacutelculo si es necesario

31 Coacutemo obtener ayuda y usar el tabulador en RStudioVamos a aprovechar estos ejemplos de lectura de ficheros csv para aprender a obtener ayuda sobrelas funciones de R La mayoriacutea de las funciones de R como la funcioacuten readtable o la funcioacutenscan que hemos mencionado al final del anterior apartado tienen muchos argumentos opcionalesY hay muchiacutesimas funciones en R (cada vez maacutes porque como veremos maacutes adelante usuarios detodo el mundo antildeaden constantemente funciones nuevas a R cuando las necesitan) No es posiblerecordar todos esas funciones cada una con sus opciones asiacute que es muy importante aprender aobtener esa informacioacuten cuando la necesitamosPara ver como obtener esa informacioacuten en RStudio vamos a usar por ejemplo la funcioacuten scanSituacuteate en una liacutenea vaciacutea de la Consola de Comandos escribe scan y a continuacioacuten mientras elcursor parpadea junto a la n final de scan pulsa la tecla del tabulador (si esto no funciona usa latecla F1 y mira el panel ayuda de RStudio) Veraacutes aparecer una ventana emergente con informacioacutensobre la funcioacuten scan como en esta figura

15

Como ves se muestra un resumen sobre la funcioacuten scan que a veces seraacute suficiente Si necesitasmaacutes detalles haz caso a la indicacioacuten que aparece al final de esa ventana y pulsa la tecla F1 Alhacerlo veraacutes que en el panel inferior derecho de RStudio aparece el fichero de ayuda de la funcioacutenscan como en esta figura

Esos ficheros de ayuda son muy uacutetiles aunque al principio pueden resultar un poco intimidatoriosya sea por un exceso de informacioacuten ya sea porque se da por supuesto que el usuario ya entiendealgunos conceptos baacutesicos de R Podemos garantizar al lector que a medida que se progresa en Rla utilidad de estos ficheros aumentaPero la utilidad de la tecla tabulador en RStudio no se acaba ahiacute Supongamos que quieres aplicarreadtable para leer el fichero Tut02-Edadescsv Pero te da pereza escribir un nombre tan largoo no recuerdas exactamente el nombre o dudas entre dos nombres no importa cual sea el motivoEmpiezas a escribir la orden tecleas

(vectorEdades2 = readtable(datos

y de nuevo justo en este punto pulsas el tabulador Entonces RStudio te ofrece en una nuevaventana emergente todos los ficheros disponibles en la carpeta datos

Y ahora puedes usar esa lista seleccionar el fichero que quieras utilizar Puedes tambieacuten teclearalguna letra maacutes del nombre para acotar auacuten maacutes la buacutesqueda cuando la carpeta contiene muchosficherosEn general la idea es que en RStudio el tabulador es tu amigo Como tendremos ocasioacuten decomprobar RStudio nos ofrece bastante ayuda para hacer maacutes coacutemodo nuestro trabajo con R yel tabulador es una de las herramientas maacutes versaacutetiles y uacutetiles

16

32 El camino contrario escribir un vector a un fichero de tipo csvHemos aprendido a leer con R vectores de datos a partir de ficheros de tipo csv Pero muchasveces despueacutes de hacer operaciones en R obtendremos como resultados nuevos vectores (y maacutesadelante en el curso otro tipo de objetos) Lo natural entonces es aprender a guardar ese vectoren un fichero de tipo csv como el fichero con el que empezamos De esa forma por ejemplo puedescompartir tus resultados con otras personas que utilicen programas distintos de R Para ello siantes usaacutebamos la funcioacuten readtable ahora vamos a usar la funcioacuten writetable de R

Como ejemplo vamos a utilizar este vector de nuacutemeros enteros

29 17 63 31 55 9 92 61 10 16 63 6 61 59 66 41 68 6 99 21 87 68 52 83 66 98 45 5024 100 83 37 44 4 97 67 56 74 75 71 55 22 86 22 93 65 38 84 54 83 100 71 99 1963 11 11 62 91 20 79 42 59 95 70 74 8 25 45 58 57 75 81 34 70 68 39 12 14 21

Ejercicio 5Usa copiar y pegar a partir de este documento pdf para crear un vector de R llamado muestraque contenga esos datos

Para guardar ese vector muestra en un fichero csv (dentro de la subcarpeta datos del directoriode trabajo) podemos utilizar la funcioacuten writetable usando como argumentos

El nombre del vector que queremos guardar que es muestra

Y el nombre del fichero en el que lo guardamos Vamos llamarlo por ejemplo Tut02-muestracsvLe indicamos a R ademaacutes que lo ponga en la subcarpeta datos

La opcioacuten colnames = FALSE o colnames = TRUE para decidir si queremos que R incluyauna liacutenea de cabecera con el nombre de la variable que en este caso es muestra (y que novamos a incluir)

La opcioacuten rownames = FALSE para evitar que R incluya nuacutemeros de fila en el fichero desalida (normalmente no querremos esos nuacutemeros)

Es decir que ejecutamos

writetable(muestrafile = datosTut02-muestracsv colnames=FALSE rownames=FALSE)

Al ejecutar esa orden el fichero que obtenemos tiene la forma deseada (de nuevo soacutelo es visible elcomienzo del fichero)

17

Puedes probar a abrirlo en Calc para ver que es un fichero de datos como los que hemos visto hastaahora

Naturalmente apenas hemos rozado el tema de la entradasalida de datos en R Pero con lo quehemos aprendido en este apartado estamos listos para empezar a hacer Estadiacutestica Descriptivausando ejemplos que no sean demasiado triviales

4 Estadiacutestica descriptiva de una variable cuantitativa condatos no agrupados

Para seguir adelante tenemos que empezar por aprender un poco maacutes sobre la forma en la que Rpermite operar con los vectores Vamos a hacerlo a traveacutes de una serie de ejercicios-ejemplos

Ejercicio 6

1 Vamos a definir dos vectores cada uno de ellos con 12 nuacutemeros enteros El primero al quellamaremos vector1 estaacute formado por

8 5 19 9 17 2 28 18 3 4 19 1

Usa copiar y pegar a partir de este fichero pdf para definir el vector1 en R

2 El segundo vector al que en un rapto de originalidad llamaremos vector2 estaacute almacenadoen el fichero

Guaacuterdalo en datos y examiacutenalo primero con un editor de texto (como el Bloc de Notas)para ver coacutemo estaacuten almacenados los datos en ese fichero Una vez hecho esto usa Calc yla funcioacuten readtable para almacenar el contenido de ese fichero csv en el vector2 de REn alguacuten momento del proceso puede que tengas que usar el pegado especial de Calc paratrasponer los datos

Solucioacuten en la paacutegina 47

41 Aritmeacutetica vectorial en RAhora vamos a sumar los dos vectores Ejecuta el comando

vector1 + vector2

para comprobar que el resultado es la suma componente a componente de los dos vectores

gt vector1 + vector2[1] 26 23 39 21 37 3 58 24 29 24 34 26

Este resultado es bastante previsible Lo que quizaacute resulteacute un poco maacutes inesperado es que simultiplicas los dos vectores tambieacuten se obtienen los productos componente a componente el primerelemento de vector1 se multiplica por el primero de vector2 el segundo por el segundo etc

gt vector1 vector2[1] 144 90 380 108 340 2 840 108 78 80 285 25

Esta forma de operar de R como veremos pronto es muy uacutetil Si lo piensas un momento cadavector numeacuterico de R se corresponde con una columna de una hoja de caacutelculo como las queusaacutebamos en el Tutorial01 Alliacute vimos que para algunas operaciones era necesario multiplicar doscolumnas elemento a elemento En Calc esa operacioacuten no es complicada pero en R es auacuten maacutes faacutecilBasta con un comando como vector1 vector2 para conseguir el objetivo Veremos muchos maacutesejemplos a lo largo del curso en los que una operacioacuten que en Calc requeririacutea bastantes pasosen R se reduce a ejecutar un uacutenico comandoEn R las operaciones con vectores siguen en general este esquema de funcionamiento componentea componente Si por ejemplo ejecutas

18

1818201220130626201525

gt vector1 + 5[1] 13 10 24 14 22 7 33 23 8 9 24 6gt 2 vector1[1] 16 10 38 18 34 4 56 36 6 8 38 2

veraacutes que en el primer caso cada uno de los elementos de vector1 se ha incrementado en 5mientras que en el segundo caso cada uno se ha multiplicado por 2 Sucede lo mismo con otrasoperaciones como elevar al cuadrado

gt vector1^2[1] 64 25 361 81 289 4 784 324 9 16 361 1

Y podemos aplicar funciones en un solo paso Por ejemplo podemos calcular el logaritmo neperianode todos los elementos de un vector en un soacutelo paso

gt log(vector1)[1] 20794415 16094379 29444390 21972246 28332133 06931472[7] 33322045 28903718 10986123 13862944 29444390 00000000

Los resultados de todas estas operaciones son de nuevo vectores Y por tanto se pueden asignara nuevas variables para utilizarlos en nuestras operaciones Por ejemplo si luego vas a necesitar loslogaritmos de vector1 puedes definir una variable para identificar ese vector llamada logVector1(e el nombre que tuacute quieras) haciendo

gt logVector1 = log(vector1)

Recuerda que si ademaacutes de la asignacioacuten quieres ver el resultado puedes rodear toda esta senten-cia con pareacutentesis De lo contrario R la ejecuta pero no imprime ninguna respuesta como ya sabes

Aunque al principio puede parecer complicado cuando te acostumbres a esta forma de trabajarcon vectores veraacutes que resulta muy coacutemoda y eficiente

Generando vectores de nuacutemeros enteros consecutivos

Hay muchas ocasiones en que para alguna operacioacuten necesitamos un vector que contenga losnuacutemeros enteros consecutivos del 1 al n o del 0 al n etc En R esto es muy faacutecil de hacer Porejemplo para conseguir un vector con los nuacutemeros del 1 al 15 basta con ejecutar

gt 115[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Esa notacioacuten con los dos puntos permite generar vectores en los que cada elemento es igual alanterior maacutes 1 Otro ejemplo

gt -713[1] -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13

O incluso cuando los puntos de partida no son enteros

gt 1575[1] 15 25 35 45 55 65 75gt 1574[1] 15 25 35 45 55 65

iquestVes la diferencia entre estos dos casos

Es muy posible que te esteacutes preguntando iquesty si quiero ir avanzando de 2 en 2 o quiero ir hacia atraacutes(ldquoavanzandordquo de minus2 en minus2 por ejemplo) Pronto cuando hayamos aprendido un poco maacutes volve-remos sobre esto y comprobaremos que R nos ofrece un cataacutelogo de herramientas extremadamentepotentes para fabricar vectores de acuerdo con nuestros deseos y necesidadesLos vectores fabricados con este meacutetodo son vectores iguales que los demaacutes y se pueden asignar avariables operar con ellos etc

19

Ejercicio 7

1 Fabrica un vector con los cuadrados de los nuacutemeros del 1 al 10 y asiacutegnalo a la variablecuadrados Usa los pareacutentesis para ver el resultado de la asignacioacuten

2 Haz lo mismo con los cuadrados de los nuacutemeros del 2 al 11 y un vector cuadrados2

3 Resta los vectores cuadrados2 - cuadrados iquestObservas algo interesante

Solucioacuten en la paacutegina 47

Funciones vectoriales

Hemos visto antes que se puede aplicar una funcioacuten como la raiacutez cuadrada a un vector y seobtiene como resultado otro vector con las raiacuteces cuadradas elemento a elemento Pero hay otrotipo de funciones que permiten hacer caacutelculos con el vector en conjunto Por ejemplo antes hemosfabricado el vector -713 y la funcioacuten length nos dice cuantos elementos tiene ese vector

gt length(-713)[1] 21

En el Ejercicio 3 (paacuteg 13) nos preguntaacutebamos cuantos elementos teniacutea el vector vectorEdades quehabiacuteamos cargado desde el fichero csv Puedes obtener la respuesta con length(vectorEdades)Para comprobarlo aseguacuterate de que has creado el vector llamado vectorEdades y ejecuta estaorden

gt length(vectorEdades)[1] 100

Como ves el resultado de length es el esperado

Vamos a conocer otra funcioacuten llamada sum que sirve para calcular la suma de todos los elementosde un vector

gt sum(vectorEdades)[1] 675

Ejercicio 8iquestCuaacutento vale la suma de los cuadrados de los nuacutemeros del 1 al 100 Solucioacuten en la paacutegina 47

A lo mejor te ha pasado desapercibido pero con las funciones length y sum estamos por fin encondiciones de empezar a hacer Estadiacutestica Descriptiva Por ejemplo podemos calcular la mediaaritmeacutetica de vectorEdades

gt ( mediaEdades = sum(vectorEdades) length(vectorEdades) )[1] 675

Y una vez que tenemos la media podemos calcular la varianza poblacional Para que resulte maacutesclaro vamos a mostrarte el proceso paso a paso aunque al final lo ejecutaremos en un soacutelo paso

1 Empezamos restando la media que estaacute en la variable mediaEdades de cada uno de loselementos de vectorEdades

vectorEdades - mediaEdades

El resultado es un vector de diferencias

2 Ahora elevamos cada una de esas diferencias al cuadrado

( vectorEdades - mediaEdades )^2

El resultado de este paso es de nuevo un vector ahora con las diferencias al cuadrado Fiacutejateen el pareacutentesis para garantizar que elevamos al cuadrado la diferencia Si no incluyeacuteramosel pareacutentesis iquestqueacute calculariacuteamos

20

3 A continuacioacuten sumamos todas esas diferencias al cuadrado usando la funcioacuten sum

sum( ( vectorEdades - mediaEdades )^2)

De nuevo el pareacutentesis es fundamental para que el cuadrado del vector de diferencias secalcule antes que la suma En este paso el resultado ya no es un vector sino un nuacutemero

4 Por uacuteltimo dividimos esa suma por n el nuacutemero de elementos de vectorEdades que seobtiene con la funcioacuten length

sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades)

El resultado de estos pasos se puede condensar en un soacutelo comando de R en el que a la vezcalculamos la varianza y la asignamos a una variable

gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades) )[1] 19875

Ejercicio 9

1 Calcula la desviacioacuten tiacutepica (poblacional) de vectorEdades

2 Calcula la cuasivarianza y cuasidesviacioacuten tiacutepica (muestrales) de vectorEdades

3 iquestQueacute sucede si en el tercer paso ejecutas el siguiente comandosum( vectorEdades - mediaEdades )^2iquestPor queacute sucede esto

Solucioacuten en la paacutegina 48

Con estos caacutelculos hemos empezado a hacer Estadiacutestica con R Naturalmente nos queda muchiacutesimoque aprender sobre los vectores de R Por ejemplo como se accede a una componente individualdel vector para responder a preguntas como ldquoiquestCuaacutento vale el quinto elemento del vectorrdquo Maacutesen general aprenderemos a extraer aquellos elementos del vector que cumplan alguna condicioacutenrespondiendo a preguntas como ldquoiquestQueacute elementos del vector son mayores que 7rdquo

42 Y por fin hagamos Estadiacutestica DescriptivaEn esta seccioacuten vamos a trabajar con un vector de datos contenido en este fichero adjunto

Este vector contiene los datos de la variable var3 del fichero Tut01-PracticaConCalccsv queya hemos utilizado en el Tutorial-00 para aprender a hacer Estadiacutestica Descriptiva con Calc Enesta seccioacuten vamos a reproducir los resultados que obtuvimos alliacute pero esta vez usando R Parapreparar el terreno vamos a hacer limpieza

Ejercicio 10

1 Cierra Rstudio y vuelve a abrirlo para limpiar la memora del sistema El trabajo que hemoshecho hasta ahora se perderaacute (aunque los comandos siguen en el Historial de Comandos queya vimos)

2 Establece el Directorio de Trabajo (por ejemplo el Escritorio) y aseguacuterate de que Tut02-var3csvestaacute guardado en la subcarpeta datos de ese directorio

3 Carga de nuevo el contenido de ese fichero en un vector var3 de R

Solucioacuten en la paacutegina 48

Veraacutes en lo que sigue que siempre que calculamos un objeto le asignamos una variable Eso permiteahorrarse la repeticioacuten innecesaria de caacutelculos si maacutes adelante volvemos a necesitar ese objeto Yen algunos casos como veremos maacutes adelante al hacer esto podemos acceder a propiedades delobjeto calculado que R no muestra en su respuesta por defecto

21

4 138 134 134 135 135 133 136 136 132 134 134 133 133 133 132 136 134 135 132 135 136 135 132 136 134 135 133 134 134 134 1310 136 138 134 135 137 133 135 138 136 137 135 134 137 135 136 138 137 134 133 135 135 134 131 135 137 133 133 137 136 135 135 132 138 135 135 135 136 135 133 1311 136 1310 134 131 133 138 139 135 134 1310 134 134 137 135 134 133 132 135 132 136 135 134 133 139 136 135 134 135 132 132 138 134 133 136 138 134 134 134 138 134 132 135 1310 136 1312 135 139 135 138 138 135 132 135 1310 136 135 136 135 135 137 134 133 134 133 133 134 133 133 133 133 137 138 135 134 135 134 135 137 135 133 134 134 137 133 132 135 137 135 134 136 132 135 132 136 1310 134 132 139 134 136 136 132 137 134 138 135 135 134 134 137 134 136 136 135 134 133 135 133 133 136 132 133 134 138 138 137 137 136 135 1310 134 134 134 138 136 134 136 137 135 135 136 138 134 138 134 135 137 136 134 137 137 135 137 132 136 135 133 135 136 130 133 135 135 137 134 137 131 135 136 135 138 132 134 136 139 137 1310 134 135 136 132 135 135 135 1313 133 136 133 136 135 130 1310 134 136 136 134 131 133 135 137 136 133 135 133 134 132 132 138 138 134 136 135 135 134 133 139 134 139 136 1311 133 132 132 136 138 1310 133 137 133 134 135 139 133 135 133 134 138 139 132 138 133 133 137 138 136 133 135 134 132 1311 137 137 136 134 133 135 1310 135 134 135 133 135 136 135 139 135 134 135 135 134 133 137 134 1310 135 134 132 139 134 137 133 135 134 131 136 135 136 134 138 135 135 138 138 134 132 135 133 134 138 138 135 138 132 1311 135 134 134 136 139 1310 137 134 137 132 133 135 1310 135 135 133 135 136 134 134 136 135 137 136 136 134 133 134 135 132 134 136 139 133 135 133 136 133 133 135 134 134 134 137 135 139 1310 133 134 136 131 137 138 135 133 133 135 133 133 137 136 135 135 138 134 139 136 135 135 138 134 130 133 137 133 134 1311 132 137 133 136 135 133 134 133 133 132 138 133 134 134 134 134 138 138 137 136 132 132 137 135 133 135 138 135 134 135 134 135 134 1312 133 135 133 133 133 132 134 131 139 135 135 135 138 138 135 138 133 134 133 136 136 135 134 133 133 135 133 137 135 132 133 133 132 131 132 136 137 130 136 133 134 1310 132 136 137 134 133 132 138 133 135 133 135 136 132 134 134 133 135 135 135 134 134 136 133 132 138 1310 135 135 132 132 137 136 134 135 134 134 136 134 136 135 133 137 137 136 137 134 134 137 133 130 134 136 135 137 136 136 135 137 134 134 135 136 136 135 136 132 134 133 139 135 133 137 135 136 137 136 136 136 134 135 137 137 133 134 137 137 136 133 134 137 131 135 136 133 137 133 135 133 137 138 133 137 132 135 134 133 132 135 134 134 135 133 134 139 135 134 139 137 133 132 133 134 133 134 135 135 138 134 135 134 135 139 137 133 133 132 136 132 138 135 132 137 134 135 136 132 134 135 135 133 135 136 137 135 138 132 131 137 135 135 138 134 137 136 139 1310 137 134 131 136 132 136 137 133 135 137 135 132 135 135 133 133 137 134 133 133 131 138 139 132 134 138 135 136 138 137 1310 138 133 134 134 135 134 134 135 136 135 134 134 135 133 136 135 137 132 133 139 132 133 137 136 134 137 131 135 134 132 134 138 135 134 131 132 134 135 136 133 134 138 134 132 135 134 132 134 133 136 135 138 133 139 1310 134 133 133 137 137 136 137 133 133 133 135 139 136 136 137 136 135 132 132 139 136 132 139 132 137 135 133 138 137 135 134 136 131 133 135 133 134 137 135 134 132 136 136 136 137 133 132 135 134 135 134 137 134 133 133 134 132 134 135 134 134 136 134 135 138 133 135 135 138 133 135 134 135 135 138 1311 132 134 134 136 133 135 133 136 132 131 136 134 136 132 136 136 136 136 130 136 134 134 131 138 131 1310 135 139 136 132 136 138 135 138 134 132 134 133 136 137 133 133 133 133 137 136 135 133 139 133 132 135 136 136 134 132 132 135 137 136 136 136 138 137 137 135 135 131 136 133 136 135 133 134 130 133 135 136 137 138 136 134 135 132 137 132 137 132 133 134 135 138 134 136 133 135 135 139 134 134 136 134 134 134 135 134 133 135 135 138 133 136 136 134 135 134 134 138 136 133 137 132 134 137 136 135 133 134 133 135 134 134 136 134 133 137 133 135 135 136 135 138 134 136 132 137 136 138 134 136 136 137 136 136 135 136 1310 138 133 137 135 136 137 134 136 133 134 133 132 132 134 137 132 132 133 132 138 134 134 135 135 139 135 134 132 134 135 134 139 137 133 134 134 135 133 133 137 138 135 139 133 138 136 136 134 133 136 135 1314 137 133 137 135 136 134 134 136 133 135 134 135 136 136 135 133 135 131 135 137 135 136 133 137 135 134 133 134 134 134 134 134 136 132 134 136 136 137 139 134 138 133 133 132 135 131 134 133 137 133 133 134 139 138 134 134 137 137 135 136 134 139 137 138 134 133 134 134 135 137 134 135 138 133 132 134 1310 133 135 134 132 138 137 136 135 138 1314 139 135 135 131 134 135 134 135 135 135 133 136 135 135 132 136 139 133 133 136 134 132 132 137 136 131 137 135 135 134 1313 1310 132 134 134 133 138 135 134 133 136 136 136 1310 134 137 136 138 139 137 135 134 134 137 137 138 133 134 135 137 135 136 1310 136 136 138 133 136 133 134 135 135 134 136 133 136 136 137 134 135 1316 136 136 132 136 136 133 134 133 137 134 135 134 133 138 134 1310 136 136 136 137 134 136 137 132 138 136 131 132 134 135 130 134 135 135 137 130 136 135 131 136 137 133 137 135 139 138 135 139 133 137 139 133 136 137 136 138 134 1310 136 134 133 139 136 137 133 13713

Rango maacuteximo y miacutenimo

Para empezar vamos a aprender tres nuevas funciones de R que nos permiten calcular esos tresvalores

gt (minimo = min(var3) )[1] 0gt (maximo = max(var3) )[1] 16gt (rango = range(var3) )[1] 0 16

El funcionamiento de las dos primeras es evidente La funcioacuten range devuelve un vector formadopor el maacuteximo y el miacutenimo

Tablas de frecuencia Clases de objetos en R

La tabla de frecuencia absoluta de var3 se obtiene usando la funcioacuten table de esta forma tansencilla

gt ( tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

La primera fila contiene los elementos de var3 y en la segunda aparece la frecuencia de cada unode ellos Puedes comprobar que son los mismos resultados que obtuvimos con Calc en la paacutegina10 del Tutorial01 Aunque alliacute desde luego el proceso fue maacutes laborioso

A lo mejor te has dado cuenta de que el formato de la respuesta es diferente de los que hemosobtenido hasta ahora Para empezar la respuesta no empieza con el [1] al que ya nos vamosacostumbrando El motivo de esto es que el objeto que hemos obtenido como respuesta no es unvector sino una tabla Ya dijimos que R utiliza distintos tipos de objetos con fines distintosiquestCoacutemo podemos saber de queacute clase es un objeto Pues usando una funcioacuten de R oportunamentellamada class Si la usamos con el vector var3 y con su tabla de frecuencias obtenemos

gt class(var3)[1] numericgt class(tablaFrecAbs)[1] table

El vector var3 es de clase numeric porque es un vector de nuacutemeros Y la tabla de frecuencias esde clase table Veremos a lo largo del curso otros objetos de tipo tabular como las matrices (clasematrix) los conjuntos de datos (clase dataframe) y los arraysAunque las tablas son objetos distintos de los vectores tienen algunas propiedades en comuacuten yalgunas de las funciones que hemos usado con vectores tambieacuten se pueden usar con tablas

Ejercicio 11Aplica las funciones length sum min max y range a la tabla tablaFrecAbs Solucioacuten en la paacutegina48

Siguiendo con los parecidos entre tablas y vectores puedes multiplicar (o dividir) una tabla porun nuacutemero y la operacioacuten se haraacute elemento a elemento

gt 2 tablaFrecAbsvar30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1618 50 200 376 488 492 372 262 174 86 56 12 4 4 4 2

Como ves cada frecuencia se multiplica por 2 Esta propiedad de las tablas permite obtener deforma muy sencilla la tabla de frecuencias relativa de var3 Como primer paso vamos a guardarla longitud de var3 en la variable n

22

gt ( n = length( var3 ) )[1] 1300

Y ahora podemos dividir la tabla por n para conseguir la tabla de frecuencias relativas (hemosestrechado la Consola de Comandos para que el resultado cupiera en esta paacutegina)

gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 400069230769 00192307692 00769230769 01446153846 01876923077

5 6 7 8 901892307692 01430769231 01007692308 00669230769 00330769231

10 11 12 13 1400215384615 00046153846 00015384615 00015384615 00015384615

1600007692308

Ejercicio 12Ya sabemos cuanto debe sumar esta tabla de frecuencias relativas Comprueacutebalo Solucioacuten en lapaacutegina 48

Si lo que queremos es una tabla de frecuencias acumuladas debemos emplear la funcioacuten cumsum

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Ejercicio 13La uacuteltima tabla que falta es la de frecuencias relativas acumuladas pero ya tienes todos los ingre-dientes para obtenerla de dos maneras diferentes Hazlo y comprueba si dan el mismo resultadoSi no es asiacute iquesta queacute crees que se debe y cuaacutel es la mejor opcioacuten Asigna el resultado a la variabletablaFrecRelAcu Solucioacuten en la paacutegina 49

Graacuteficos de columnas y diagramas de caja (boxplot) Argumentos con nombre

Vamos a fabricar nuestros primeros graacuteficos con R En concreto vamos a dibujar un graacutefico debarras a partir de la tabla de frecuencias de var3 usando la funcioacuten barplot de R

gt barplot(tablaFrecAbs)

Al ejecutar este comando no debes ver ninguna salida en la Consola de Comandos En su lugaren el panel inferior derecho de RStudio concretamente en la ventana Plots apareceraacute el graacuteficodeseado El resultado puede variar dependiendo de la anchura de tu ventana de RStudio

23

Hemos destacado ademaacutes en la figura los dos botones Zoom y Export que te permiten respecti-vamente ver una versioacuten ampliada de la Figura (que se redimensiona dinaacutemicamente si cambiasla ventana) y guardar esa figura como un fichero de graacuteficos que puedes insertar en cualquierdocumento editar con un programa de manipulacioacuten de graacuteficos etceacuteteraLos graacuteficos de R se pueden controlar hasta en sus detalles maacutes miacutenimos Como aperitivo miacutenimovamos a antildeadir algo de color al graacutefico

gt barplot(tablaFrecAbs col = heatcolors(15))

El resultado es esta figura

Las posibilidades de control de los graacuteficos de R son como decimos inmensas y pueden llegar aser abrumadoras Hay libros de cientos de paacuteginas dedicados a este tema como el R GraphicsCookbook de W Chang (ver las referencias del curso) Nosotros a lo largo de los tutoriales delcurso vamos a aprender algo maacutes aunque a penas nos podremos limitar a rozar la superficie delo que se puede llegar a hacerEn la Seccioacuten 231 del libro hemos descrito los diagramas de cajas o boxplots (recuerda la Figura22 de la paacuteg 36 del libro) Y en el Tutorial-01 dijimos que con Calc no es faacutecil dibujar ese tipode diagramas En cambio con R no podriacutea ser maacutes faacutecil

gt boxplot(var3)

Y el resultado es esta figura

24

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

el siacutembolo Inf (de infinito) nos avisa del problema Ese siacutembolo tambieacuten puede aparecer con signomenos si por ejemplo tratas de calcular el logaritmo neperiano de 0 En R el logaritmo neperianoes la funcioacuten log asiacute que seriacutea

gt log(0)[1] -Inf

En ambos casos R no lanza un mensaje de error pero utiliza el siacutembolo de infinito porque asiacute nosproporciona maacutes informacioacuten matemaacutetica sobre lo que ha ocurrido Tambieacuten puede suceder queel siacutembolo Inf aparezca como resultado intermedio en una expresioacuten En ese caso R aplica unasreglas sencillas de aritmeacutetica con infinitos para tratar de darnos la respuesta maacutes coherente desdeel punto de vista matemaacutetico Por ejemplo si calculas

3(-5(4-2^2))

Entonces R empieza calculando el resultado del pareacutentesis 4-2ˆ2 que es 0 Asiacute que al dividir minus5entre 0 R obtiene -Inf y finalmente al calcular 3(-Inf) se obtiene -Inf como valor de laexpresioacuten Comprobeacutemoslo

gt 3(-5(4-2^2))[1] -Inf

A pesar de que R no lanza mensajes de error estaacute claro que en la mayoriacutea de los casos no esdeseable que nuestros caacutelculos produzcan Inf como resultado en ninguna etapaEn otros casos el problema es diferente Por ejemplo si tratas de calcular la raiacutez cuadrada de unnuacutemero negativo

gt sqrt(-4)[1] NaNWarning messageIn sqrt(-4) NaNs produced

En este caso obtenemos una respuesta NaN y ademaacutes una advertencia (warning) sobre la aparicioacutende esa respuesta El siacutembolo NaN es la abreviatura de Not a Number es decir ldquono es un nuacutemerordquo Estaes la respuesta que obtendremos cuando tratamos de hacer operaciones como esta que producencomo resultado un nuacutemero complejo R es capaz de trabajar con los nuacutemeros complejos pero comono los vamos a necesitar en el curso no nos ocuparemos de esto Para que veas otro ejemplo esarespuesta NaN aparece tambieacuten si tratamos de ir demasiado lejos con la aritmeacutetica con infinitos

gt (10)+log(0)[1] NaN

En este caso R se ha encontrado en un paso intermedio con Inf - Inf y su respuesta ha sido NaN

En cualquier caso y como resumen final tenemos que tratar de evitar que nuestros caacutelculos con-duzcan a este tipo de expresiones

Haciendo limpieza en la Consola de Comandos

Si has seguido todas las instrucciones hasta aquiacute tu Consola de Comandos seguramente empiezaa estar llena de comandos y algunos pueden quedar ocultos en la parte superior Naturalmentepuedes usar las barras de desplazamiento para moverte por la Consola Pero en sesiones largas detrabajo o cuando hemos terminado de hacer pruebas y queremos ejecutar una versioacuten definitivade nuestro trabajo es normal que queramos hacer limpieza en la Consola Eso se consigue con lacombinacioacuten de teclas Ctrl + L iexclCuidado Es un proceso no reversible podraacutes seguir navegandoel Historial de Comandos con las teclas arriba y abajo pero para recuperar los resultados tendraacutesque ejecutar de nuevo los comandosMaacutes adelante aprenderemos formas de guardar nuestro trabajo de una manera maacutes eficiente Perote podemos adelantar que puesto R se maneja escribiendo comandos bastaraacute con guardar esoscomandos en ficheros de texto plano Ahora vamos a cambiar de tema y para empezar desde cerovamos a cerrar RStudio para eliminar las trazas del trabajo que hemos hecho

2 Variables y vectoresVuelve a abrir RStudio para continuar el trabajo En la seccioacuten previa hemos usado R como unacalculadora Pero para ir maacutes allaacute tenemos que disponer de estructuras de datos Ese teacutermino

8

describe en Computacioacuten las herramientas que nos permiten almacenar y procesar informacioacutenLas estructuras de datos maacutes baacutesicas de R son las variables y los vectores En proacuteximos tutorialesnos iremos encontrando con otras estructuras de datos matrices dataframes listas entre otras

21 Variables en RUna variable en R es un siacutembolo que usamos para referirnos a un valor Por ejemplo si te situacuteasen la Consola de Comandos tecleas

a = 2

y ejecutas esa instruccioacuten entonces aunque aparentemente no ha sucedido nada (porque no hayrespuesta) a partir de ese momento R ha asignado el valor 2 al siacutembolo a Asiacute que si por ejemplotecleas y ejecutas

a + 1

obtendraacutes como respuesta 3

Ejercicio 2iquestQueacute se obtiene al ejecutar estos comandos uno detraacutes de otro iquestCuaacutento valen las variables a by c al final

a = 2b = 3c = a + ba = b cb = (c - a)^2c = a b

La solucioacuten estaacute en la paacutegina 47 iexclNo la mires antes de intentar pensar el ejercicio por ti mismo

En el Capiacutetulo 1 del libro hemos hablado de variables cualitativas y cuantitativas Estas uacuteltimastoman siempre valores numeacutericos y las variables de R sirven desde luego para almacenar esa clasede valores Pero como iremos viendo en sucesivos tutoriales tambieacuten se pueden utilizar variablesde R para guardar valores de variables cualitativas (factores) y otros tipos de objetos que iremosconociendo a lo largo del curso De momento para que veas a que nos referimos recordaremos elEjemplo 111 del libro (paacuteg 6) en el que teniacuteamos una variable cualitativa ordenada que representael pronoacutestico de un paciente que ingresa en un hospital Prueba a ejecutar este coacutedigo

pronostico = Leve

simplemente para que de momento veas que

R no protesta El valor Leve es un valor perfectamente aceptable

En R los valores que representan palabras frases o como las llamaremos teacutecnicamente cadenasalfanumeacutericas se escriben siempre entre comillas Puedes usar comillas simples o dobles perote aconsejamos que uses dobles comillas

La relacioacuten entre factores y valores alfanumeacutericos en R es algo maacutes complicada de lo que estesencillo ejemplo parece sugerir Pero ya tendremos ocasioacuten en futuros tutoriales de extendernossobre eso

Asignaciones

Las instrucciones como

a = 2

o como

b = (c - a)^2

se denominan asignaciones En la primera por ejemplo decimos que hemos asignado el valor 2a la variable aQueremos advertir al lector de que en R hay otra forma esencialmente equivalente de escribir lasinstrucciones y que de hecho se usa mayoritariamente En lugar del siacutembolo = puedes conseguirel mismo efecto escribiendo lt- (el signo ldquomenorrdquo seguido sin espacios de un signo ldquomenosrdquo) Asiacuteque si ejecutas

9

a lt- 2

el resultado seraacute el mismo que antes con = Las dos notaciones tienen ventajas e inconvenientes peronosotros preferimos = porque se parece maacutes a lo que se utiliza en muchos lenguajes de programacioacuten

Coacutemo ver los resultados de un caacutelculo a la vez que lo hacemos

Ya habraacutes notado que al hacer una asignacioacuten R no produce ninguna respuesta y se limita aguardar el valor en la variable En una asignacioacuten como a=2 esto no genera ninguna duda Perosi el miembro derecho de la asignacioacuten es una expresioacuten maacutes complicada puede ser convenientepedirle a R que nos muestre el resultado de esa expresioacuten a la vez que se hace la asignacioacutenImagiacutenate por ejemplo esta situacioacuten

b = 2c = -2d = -4a = b c^2 d + 3

iquestCuaacutel es el valor que se asigna a la variable a Una forma de averiguarlo es simplemente ejecutaruna liacutenea adicional en la que aparece soacutelo el nombre de la variable que queremos inspeccionar Alejecutar esta sentencia R nos devuelve como respuesta

gt a[1] 1

Pero hay otra manera de conseguir que R nos muestre el resultado de la asignacioacuten que es maacutesinteresante porque produce coacutedigo maacutes simple Basta con encerrar toda la asignacioacuten entre pareacuten-tesis El resultado es

gt ( a = b c^2 d + 3 )[1] 1

como antes Este ejemplo es desde luego bastante artificial Te recordamos en cualquier caso laconveniencia de utilizar pareacutentesis para hacer maacutes legibles las expresiones y evitar posibles erroresPero a la vez la posibilidad de comprobar el resultado de las asignaciones aumenta la fiabilidaddel coacutedigo que escribimos

Nombres de las variables

Aunque hasta ahora hemos usado letras como nombres de las variables puedes utilizar nombresmaacutes descriptivos Y muchas veces es una buena idea hacerlo Por ejemplo puede que hace unasemana hayas escrito estas instrucciones para resolver un problema

a = 2b = 3c = a b

Pero si las vuelves a ver pasada una semana es posible que no recuerdes queacute era lo que estabastratando de conseguir al hacer esto En cambio al ver estas instrucciones

espacio = 2tiempo = 3velocidad = espacio tiempo

es mucho maacutes faacutecil reconocer el objetivo que persiguen A lo largo de los tutoriales del curso vamos ainsistir muchas veces en la necesidad de que el coacutedigo esteacute bien organizado y esteacute bien documentadoUn primer paso en esa direccioacuten es tratar de elegir nombres descriptivos para las variables En Rlas reglas para los nombres de variables son muy flexibles esencialmente que empiecen por unaletra y no contengan espacios ni caracteres especiales como + pareacutentesis etceacutetera Pero cuidadocon los excesos Es cierto que puedes usar nombres de variables arbitrariamente largos Pero si usascomo nombre

Estavariablealmacenaelresultadodelaoperaciontaninteresantequeacabamosdehacer

tu trabajo resultaraacute ilegible Como siempre se necesita un equilibrio y con la praacutectica encontraraacutesel tuyo (consejo zen gratuito del tutorial de hoy) Para empezar es una buena idea combinarmayuacutesculas y minuacutesculas en los nombres de las variables Si vas a usar una variable para representarla temperatura final de un proceso el nombre temperaturafinalproceso es menos legible y maacuteslargo que tempFinal Es mucho maacutes faacutecil por otra parte que te equivoques tecleando el primerode esos nombres

10

22 VectoresEn Estadiacutestica lo habitual es trabajar con colecciones o muestras de datos Y para almacenar esascolecciones de datos la estructura maacutes baacutesica de R son los vectores En este apartado vamos aempezar nuestro trabajo con ellos aunque a lo largo del curso auacuten tendremos ocasioacuten de aprenderbastante maacutes sobre el manejo de los vectores de RPara empezar vamos a trabajar con vectores que contienen una coleccioacuten de nuacutemeros que puedenser las edades de los alumnos de una clase

22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19

En R las listas de nuacutemeros como esta se almacenan en vectores El vector que corresponde a esasedades se construye en R mediante un comando como este

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19)

En realidad en esa expresioacuten hemos hecho dos cosas

1 Hemos creado el vector con los datos en la parte derecha de la expresioacuten

c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19)

Los datos estaacuten separados por comas y rodeados por pareacutentesis Hasta aquiacute todo es bastantetiacutepico pero fiacutejate especialmente en la letra c que precede al primer pareacutentesis Esa letra ces el nombre de una nueva funcioacuten de R y es la forma maacutes sencilla que existe en R paracrear un vector de datos Podriacutea pensarse que la c es de crear pero en realidad proviene deconcatenar Enseguida entenderemos porque es asiacute

2 Una vez creado el vector lo hemos asignado a la variable edades Hasta ahora soacutelo habiacuteamosusado variables para identificar un uacutenico valor (un nuacutemero o una cadena alfanumeacuterica)Pero una variable puede usarse para identificar un vector o como veremos maacutes adelanteestructuras mucho maacutes complejas

Una observacioacuten maacutes los vectores de R se usan para almacenar valores de una variable Y enparticular todos los datos de un vector son del mismo tipo de variable No se puede mezclar en unvector nuacutemeros y cadenas alfanumeacutericas (aparentemente R te dejaraacute hacerlo pero internamentehabraacute convertido todos los nuacutemeros en cadenas alfanumeacutericas)

Manos a la obra Prueba a copiar el comando anterior en tu Consola de comandos (puedes usarcopiar y pegar desde este fichero) y ejecuacutetalo Si las cosas van bien no esperes ninguna respuestacomo ya hemos dicho R no te muestra el resultado de las asignaciones Recuerda que si quieresver el resultado de una asignacioacuten puedes rodear toda liacutenea con pareacutentesis como en

(edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19))

Otra opcioacuten naturalmente es preguntarle a R por el valor de edades despueacutes de la asignacioacutenEscribe simplemente edades en la Consola de Comandos y ejecuacutetalo Veraacutes de nuevo el contenidode esa variable

Vamos a hacer algunas operaciones con este vector Imagiacutenate que como sucede a menudo despueacutesde haber creado nuestra lista de edades de alumnos desde la administracioacuten nos avisan de que haycinco alumnos nuevos recieacuten matriculados y debemos incorporar sus edades que son

22 18 20 21 20

a nuestro vector de datos Naturalmente podemos empezar de nuevo pero es preferible reutilizarel vector edades que ya habiacuteamos creado Vamos a ver esto como primer ejemplo para empezar aaprender coacutemo se manipulan vectores en R Una forma de antildeadir los datos es empezar creando unnuevo vector (con la funcioacuten c de R)

(edades2 = c(22 18 20 21 20))

Y a continuacioacuten concatenamos los vectores usando de nuevo la misma funcioacuten c de una maneradistinta

(edades = c( edades edades2))

11

Hemos rodeado toda la liacutenea con pareacutentesis para ver el resultado y poder observar coacutemo hacambiado el vector edadesVamos a analizar paso a paso lo que ha ocurrido

La instruccioacuten c( edades edades2) toma los datos contenidos en edades y edades2 y losconcatena en ese orden para fabricar un nuevo vector que todaviacutea no estaacute guardado enninguna variable

La asignacioacuten edades = c( edades edades2) toma ese vector y lo guarda en la propiavariable edades Al hacer esto como era de esperar el anterior vector edades es reemplazadocon la nueva lista y su contenido anterior se pierde (cuidado con esto las reasignaciones sonuna de las formas habituales de cometer errores)

El nombre de la funcioacuten c proviene en realidad de concatenate concatenar en ingleacutesLa siguiente figura resume lo que hemos venido haciendo con estos datos

Los nuacutemeros entre corchetes al principio de cada fila como el [1] y el [16] de este ejemploson soacutelo ayudas para que podamos localizar los elementos del vector En mi pantalla la primerafila muestra los primeros 15 nuacutemeros del vector Pero en la tuya si la ventana de RStudio es dedistinta anchura los nuacutemeros entre corchetes pueden ser distintos Hasta ahora soacutelo habiacuteamos vistoejemplos con [1] que es lo que sucede cuando la respuesta es un vector que cabe en una uacutenicaliacutenea

3 Ficheros csv con REn esta seccioacuten vamos a aprender a utilizar ficheros csv con R En el Tutorial-01 hemos vistoalgunos ejemplos de ese tipo de ficheros y el manejo baacutesico con una hoja de caacutelculo como CalcComo vimos alliacute un fichero csv tiacutepico contiene una tabla de datos con varias columnas Esaestructura de tabla se haraacute imprescindible maacutes adelante Pero durante una buena parte del cursonosotros nos vamos a limitar a problemas en los que interviene una uacutenica variable En tal casopara almacenar los datos de esa variable nos podemos a limitar a considerar un tipo de ficheroscsv muy baacutesico como el fichero adjunto

Guaacuterdalo en la subcarpeta datos de tu directorio de trabajo (el que contiene este pdf) Si lo abrescon un editor de texto (como el Bloc de Notas en Windows) veraacutes como muestra esta figura

12

61371381381381391391351381371381371371361361371351381391341371351371371351391341371371371381351381391371341361361361391381361371361371361361381361351351361361381351381351391371361391351371381381371310137138137135136138138137133135136137135137137135138134138138138136137136136138135136135138136139137

que el fichero contiene soacutelo una columna de datos que en este ejemplo corresponde a valores deuna variable cuantitativa discreta En la figura soacutelo se muestra una parte de los datos

Ejercicio 3iquestCuaacutentos datos hay en ese vector Usa Calc para averiguarlo pronto aprenderemos a hacerlo conR Solucioacuten en la paacutegina 47

Queremos utilizar esos datos en R y para eso vamos a (1) leerlos desde el fichero y (2)guardarlos enun vector El resultado seraacute como si nosotros hubieacuteramos creado ese vector tecleaacutendo sus elementosdirectamentePara el primer paso (la lectura del fichero csv) vamos a tener que empezar por explicarle a R(usando RStudio como intermediario) donde estaacute el fichero que contiene esos datos Cuando tra-bajamos con ficheros R utiliza un directorio de nuestro ordenador como directorio de trabajo Acontinuacioacuten vamos a aprender a elegir un directorio de trabajo Puedes usar cualquier carpeta yen lo que sigue vamos a suponer que hemos elegido el Escritorio Lo maacutes importante es que esacarpeta debe contener a su vez una subcarpeta llamada datos Y aseguacuterate de que los ficheroscsv que vas a usar estaacuten almacenados en esa subcarpeta llamada datos

Usamos el menuacute Session rarr Set Working Directory rarr Choose Directory

Se abre un cuadro de diaacutelogo del sistema y navegamos hasta la carpeta que contiene el ficherocsv que en mi caso es el Escritorio Cuando selecciono el Escritorio veo aparecer en la Consolade Comandos de R un comando que RStudio ha escrito y ejecutado por nosotros

13

setwd(CUsersFernandoDesktop)

Este es el resultado en mi ordenador (de ahiacute el nombre de usuario) usando Windows 10 Enversiones maacutes antiguas de Windows o en una maacutequina con Linux o un Mac el comando seraacuteligeramente distinto Cuando tengamos maacutes praacutectica aprenderemos otras formas de seleccionar eldirectorio de trabajo o incluso de utilizar ficheros situados fuera de ese directorio de trabajo Peropor el momento resulta maacutes coacutemodo dejar que RStudio haga ese trabajo para nosotrosAhora R ya sabe doacutende estaacute el fichero que nos interesa pero todaviacutea no sabe cual es Para ello vamosa utilizar la funcioacuten readtable de R Aunque esta funcioacuten tiene muchas opciones disponiblesnuestro primer uso de ella seraacute bastante sencillo Copia y ejecuta el siguiente coacutedigo en RStudio

(vectorEdades = readtable(datosTut02-Edadescsvheader = FALSE)[1])

En esta instruccioacuten le decimos a R que use la funcioacuten readtable para leer el contenido del ficheroTut02-Edadescsv y que almacene lo que ha leiacutedo en un vector que hemos decidido llamarvectorEdades Y aunque no es necesario entender en detalle el funcionamiento de readtable eneste momento vamos a explicar un poco maacutes lo que hemos hecho A medida que el curso avanceiraacutes teniendo maacutes ocasiones de practicar esto e iraacute quedando cada vez maacutes claroLa opcioacuten header = FALSE sirver para indicarle a R que la tabla almacenada en el fichero no tieneuna liacutenea de cabecera (en ingleacutes header) que cuando existe suele contener los nombres de lasvariables de la tabla Ademaacutes la funcioacuten readtable sirve para leer tablas con varias columnasobteniendo como resultado un objeto de R de tipo dataframe Pero nuestro primer ejemplo esmuy sencillo y la tabla soacutelo tiene una columna Asiacute que usamos la notacioacuten [1] para indicarle aR que soacutelo queremos la primera columna de esa tabla considerada como un vectorAl ejecutar esa orden habraacutes obtenido una respuesta como esta

gt gt (vectorEdades = readtable(datosTut02-Edadescsv header = FALSE)[1])[1] 6 7 8 8 8 9 9 5 8 7 8 7 7 6 6 7 5 8 9 4 7 5 7[24] 7 5 9 4 7 7 7 8 5 8 9 7 4 6 6 6 9 8 6 7 6 7 6[47] 6 8 6 5 5 6 6 8 5 8 5 9 7 6 9 5 7 8 8 7 10 7 8[70] 7 5 6 8 8 7 3 5 6 7 5 7 7 5 8 4 8 8 8 6 7 6 6[93] 8 5 6 5 8 6 9 7

Como hemos dicho antes los nuacutemeros entre corchetes al principio de cada fila que en mi casoson [1] [24] [47] [70] y [93] son soacutelo ayudas para que podamos localizar los elementos delvector En mi pantalla cada primera fila muestra 23 nuacutemeros del vector Pero en la tuya si laventana de RStudio es de distinta anchura los nuacutemeros entre corchetes pueden ser distintos

En cualquier caso ahora el vector vectorEdades contiene la informacioacuten del fichero csv con el quehemos empezado En la Seccioacuten 4 vamos a empezar a hacer Estadiacutestica Descriptiva Pero antes tepedimos un poco maacutes de paciencia porque vamos a entretenernos un poco maacutes en los detalles delmanejo de ficheros csv con R No pretendemos ser exhaustivos ni mucho menos pero siacute queremosaprender lo suficiente como para evitarnos los problemas maacutes habituales en los casos maacutes sencillosPara cerrar este apartado es conveniente haber visto el error que se produce cuando el fichero quetratamos de leer desde R no existe o no estaacute en el directorio de trabajo

Ejercicio 4Prueba a ejecutar

errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)

y fiacutejate en el mensaje de error Solucioacuten en la paacutegina 47

Otra variante del fichero de entrada

Los ficheros csv que contienen un uacutenico vector (en lugar de una tabla de datos) pueden adoptarformatos distintos del que acabamos de ver Por ejemplo el fichero adjunto

contiene los mismos datos que Tut02-Edadescsv pero ahora los datos del vector estaacuten todos enuna fila y separados por comas Guaacuterdalo como antes en la subcarpeta datos El aspecto delfichero visto a traveacutes de un editor de texto es este (soacutelo son visibles una parte de los datos)

14

67888995878776675894757759477785897466698676766865566858597695788710787568873567577584888676685658697

Desde luego no nos podemos plantear transformar a mano este vector en uno como el anteriorLa solucioacuten que te proponemos pasa por la hoja de caacutelculo y la opcioacuten de trasponer una tablaque hemos visto en el Tutorial-00 lo leeriacuteamos en una fila de la hoja y luego habriacutea que usar elPegado especial para trasponerlo -es decir girarlo- para finalmente volver a guardarlo Alterna-tivamente hay otras soluciones sin salir de R usando una funcioacuten llamada scan o usando de nuevoreadtable y trasponiendo la tabla dentro de R Esos meacutetodos son sencillos cuando se aprendeun poco maacutes sobre R pero por el momento y para los ejemplos sencillos que encontraremos nosvamos a conformar con ese enfoque baacutesico que usa la hoja de Caacutelculo si es necesario

31 Coacutemo obtener ayuda y usar el tabulador en RStudioVamos a aprovechar estos ejemplos de lectura de ficheros csv para aprender a obtener ayuda sobrelas funciones de R La mayoriacutea de las funciones de R como la funcioacuten readtable o la funcioacutenscan que hemos mencionado al final del anterior apartado tienen muchos argumentos opcionalesY hay muchiacutesimas funciones en R (cada vez maacutes porque como veremos maacutes adelante usuarios detodo el mundo antildeaden constantemente funciones nuevas a R cuando las necesitan) No es posiblerecordar todos esas funciones cada una con sus opciones asiacute que es muy importante aprender aobtener esa informacioacuten cuando la necesitamosPara ver como obtener esa informacioacuten en RStudio vamos a usar por ejemplo la funcioacuten scanSituacuteate en una liacutenea vaciacutea de la Consola de Comandos escribe scan y a continuacioacuten mientras elcursor parpadea junto a la n final de scan pulsa la tecla del tabulador (si esto no funciona usa latecla F1 y mira el panel ayuda de RStudio) Veraacutes aparecer una ventana emergente con informacioacutensobre la funcioacuten scan como en esta figura

15

Como ves se muestra un resumen sobre la funcioacuten scan que a veces seraacute suficiente Si necesitasmaacutes detalles haz caso a la indicacioacuten que aparece al final de esa ventana y pulsa la tecla F1 Alhacerlo veraacutes que en el panel inferior derecho de RStudio aparece el fichero de ayuda de la funcioacutenscan como en esta figura

Esos ficheros de ayuda son muy uacutetiles aunque al principio pueden resultar un poco intimidatoriosya sea por un exceso de informacioacuten ya sea porque se da por supuesto que el usuario ya entiendealgunos conceptos baacutesicos de R Podemos garantizar al lector que a medida que se progresa en Rla utilidad de estos ficheros aumentaPero la utilidad de la tecla tabulador en RStudio no se acaba ahiacute Supongamos que quieres aplicarreadtable para leer el fichero Tut02-Edadescsv Pero te da pereza escribir un nombre tan largoo no recuerdas exactamente el nombre o dudas entre dos nombres no importa cual sea el motivoEmpiezas a escribir la orden tecleas

(vectorEdades2 = readtable(datos

y de nuevo justo en este punto pulsas el tabulador Entonces RStudio te ofrece en una nuevaventana emergente todos los ficheros disponibles en la carpeta datos

Y ahora puedes usar esa lista seleccionar el fichero que quieras utilizar Puedes tambieacuten teclearalguna letra maacutes del nombre para acotar auacuten maacutes la buacutesqueda cuando la carpeta contiene muchosficherosEn general la idea es que en RStudio el tabulador es tu amigo Como tendremos ocasioacuten decomprobar RStudio nos ofrece bastante ayuda para hacer maacutes coacutemodo nuestro trabajo con R yel tabulador es una de las herramientas maacutes versaacutetiles y uacutetiles

16

32 El camino contrario escribir un vector a un fichero de tipo csvHemos aprendido a leer con R vectores de datos a partir de ficheros de tipo csv Pero muchasveces despueacutes de hacer operaciones en R obtendremos como resultados nuevos vectores (y maacutesadelante en el curso otro tipo de objetos) Lo natural entonces es aprender a guardar ese vectoren un fichero de tipo csv como el fichero con el que empezamos De esa forma por ejemplo puedescompartir tus resultados con otras personas que utilicen programas distintos de R Para ello siantes usaacutebamos la funcioacuten readtable ahora vamos a usar la funcioacuten writetable de R

Como ejemplo vamos a utilizar este vector de nuacutemeros enteros

29 17 63 31 55 9 92 61 10 16 63 6 61 59 66 41 68 6 99 21 87 68 52 83 66 98 45 5024 100 83 37 44 4 97 67 56 74 75 71 55 22 86 22 93 65 38 84 54 83 100 71 99 1963 11 11 62 91 20 79 42 59 95 70 74 8 25 45 58 57 75 81 34 70 68 39 12 14 21

Ejercicio 5Usa copiar y pegar a partir de este documento pdf para crear un vector de R llamado muestraque contenga esos datos

Para guardar ese vector muestra en un fichero csv (dentro de la subcarpeta datos del directoriode trabajo) podemos utilizar la funcioacuten writetable usando como argumentos

El nombre del vector que queremos guardar que es muestra

Y el nombre del fichero en el que lo guardamos Vamos llamarlo por ejemplo Tut02-muestracsvLe indicamos a R ademaacutes que lo ponga en la subcarpeta datos

La opcioacuten colnames = FALSE o colnames = TRUE para decidir si queremos que R incluyauna liacutenea de cabecera con el nombre de la variable que en este caso es muestra (y que novamos a incluir)

La opcioacuten rownames = FALSE para evitar que R incluya nuacutemeros de fila en el fichero desalida (normalmente no querremos esos nuacutemeros)

Es decir que ejecutamos

writetable(muestrafile = datosTut02-muestracsv colnames=FALSE rownames=FALSE)

Al ejecutar esa orden el fichero que obtenemos tiene la forma deseada (de nuevo soacutelo es visible elcomienzo del fichero)

17

Puedes probar a abrirlo en Calc para ver que es un fichero de datos como los que hemos visto hastaahora

Naturalmente apenas hemos rozado el tema de la entradasalida de datos en R Pero con lo quehemos aprendido en este apartado estamos listos para empezar a hacer Estadiacutestica Descriptivausando ejemplos que no sean demasiado triviales

4 Estadiacutestica descriptiva de una variable cuantitativa condatos no agrupados

Para seguir adelante tenemos que empezar por aprender un poco maacutes sobre la forma en la que Rpermite operar con los vectores Vamos a hacerlo a traveacutes de una serie de ejercicios-ejemplos

Ejercicio 6

1 Vamos a definir dos vectores cada uno de ellos con 12 nuacutemeros enteros El primero al quellamaremos vector1 estaacute formado por

8 5 19 9 17 2 28 18 3 4 19 1

Usa copiar y pegar a partir de este fichero pdf para definir el vector1 en R

2 El segundo vector al que en un rapto de originalidad llamaremos vector2 estaacute almacenadoen el fichero

Guaacuterdalo en datos y examiacutenalo primero con un editor de texto (como el Bloc de Notas)para ver coacutemo estaacuten almacenados los datos en ese fichero Una vez hecho esto usa Calc yla funcioacuten readtable para almacenar el contenido de ese fichero csv en el vector2 de REn alguacuten momento del proceso puede que tengas que usar el pegado especial de Calc paratrasponer los datos

Solucioacuten en la paacutegina 47

41 Aritmeacutetica vectorial en RAhora vamos a sumar los dos vectores Ejecuta el comando

vector1 + vector2

para comprobar que el resultado es la suma componente a componente de los dos vectores

gt vector1 + vector2[1] 26 23 39 21 37 3 58 24 29 24 34 26

Este resultado es bastante previsible Lo que quizaacute resulteacute un poco maacutes inesperado es que simultiplicas los dos vectores tambieacuten se obtienen los productos componente a componente el primerelemento de vector1 se multiplica por el primero de vector2 el segundo por el segundo etc

gt vector1 vector2[1] 144 90 380 108 340 2 840 108 78 80 285 25

Esta forma de operar de R como veremos pronto es muy uacutetil Si lo piensas un momento cadavector numeacuterico de R se corresponde con una columna de una hoja de caacutelculo como las queusaacutebamos en el Tutorial01 Alliacute vimos que para algunas operaciones era necesario multiplicar doscolumnas elemento a elemento En Calc esa operacioacuten no es complicada pero en R es auacuten maacutes faacutecilBasta con un comando como vector1 vector2 para conseguir el objetivo Veremos muchos maacutesejemplos a lo largo del curso en los que una operacioacuten que en Calc requeririacutea bastantes pasosen R se reduce a ejecutar un uacutenico comandoEn R las operaciones con vectores siguen en general este esquema de funcionamiento componentea componente Si por ejemplo ejecutas

18

1818201220130626201525

gt vector1 + 5[1] 13 10 24 14 22 7 33 23 8 9 24 6gt 2 vector1[1] 16 10 38 18 34 4 56 36 6 8 38 2

veraacutes que en el primer caso cada uno de los elementos de vector1 se ha incrementado en 5mientras que en el segundo caso cada uno se ha multiplicado por 2 Sucede lo mismo con otrasoperaciones como elevar al cuadrado

gt vector1^2[1] 64 25 361 81 289 4 784 324 9 16 361 1

Y podemos aplicar funciones en un solo paso Por ejemplo podemos calcular el logaritmo neperianode todos los elementos de un vector en un soacutelo paso

gt log(vector1)[1] 20794415 16094379 29444390 21972246 28332133 06931472[7] 33322045 28903718 10986123 13862944 29444390 00000000

Los resultados de todas estas operaciones son de nuevo vectores Y por tanto se pueden asignara nuevas variables para utilizarlos en nuestras operaciones Por ejemplo si luego vas a necesitar loslogaritmos de vector1 puedes definir una variable para identificar ese vector llamada logVector1(e el nombre que tuacute quieras) haciendo

gt logVector1 = log(vector1)

Recuerda que si ademaacutes de la asignacioacuten quieres ver el resultado puedes rodear toda esta senten-cia con pareacutentesis De lo contrario R la ejecuta pero no imprime ninguna respuesta como ya sabes

Aunque al principio puede parecer complicado cuando te acostumbres a esta forma de trabajarcon vectores veraacutes que resulta muy coacutemoda y eficiente

Generando vectores de nuacutemeros enteros consecutivos

Hay muchas ocasiones en que para alguna operacioacuten necesitamos un vector que contenga losnuacutemeros enteros consecutivos del 1 al n o del 0 al n etc En R esto es muy faacutecil de hacer Porejemplo para conseguir un vector con los nuacutemeros del 1 al 15 basta con ejecutar

gt 115[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Esa notacioacuten con los dos puntos permite generar vectores en los que cada elemento es igual alanterior maacutes 1 Otro ejemplo

gt -713[1] -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13

O incluso cuando los puntos de partida no son enteros

gt 1575[1] 15 25 35 45 55 65 75gt 1574[1] 15 25 35 45 55 65

iquestVes la diferencia entre estos dos casos

Es muy posible que te esteacutes preguntando iquesty si quiero ir avanzando de 2 en 2 o quiero ir hacia atraacutes(ldquoavanzandordquo de minus2 en minus2 por ejemplo) Pronto cuando hayamos aprendido un poco maacutes volve-remos sobre esto y comprobaremos que R nos ofrece un cataacutelogo de herramientas extremadamentepotentes para fabricar vectores de acuerdo con nuestros deseos y necesidadesLos vectores fabricados con este meacutetodo son vectores iguales que los demaacutes y se pueden asignar avariables operar con ellos etc

19

Ejercicio 7

1 Fabrica un vector con los cuadrados de los nuacutemeros del 1 al 10 y asiacutegnalo a la variablecuadrados Usa los pareacutentesis para ver el resultado de la asignacioacuten

2 Haz lo mismo con los cuadrados de los nuacutemeros del 2 al 11 y un vector cuadrados2

3 Resta los vectores cuadrados2 - cuadrados iquestObservas algo interesante

Solucioacuten en la paacutegina 47

Funciones vectoriales

Hemos visto antes que se puede aplicar una funcioacuten como la raiacutez cuadrada a un vector y seobtiene como resultado otro vector con las raiacuteces cuadradas elemento a elemento Pero hay otrotipo de funciones que permiten hacer caacutelculos con el vector en conjunto Por ejemplo antes hemosfabricado el vector -713 y la funcioacuten length nos dice cuantos elementos tiene ese vector

gt length(-713)[1] 21

En el Ejercicio 3 (paacuteg 13) nos preguntaacutebamos cuantos elementos teniacutea el vector vectorEdades quehabiacuteamos cargado desde el fichero csv Puedes obtener la respuesta con length(vectorEdades)Para comprobarlo aseguacuterate de que has creado el vector llamado vectorEdades y ejecuta estaorden

gt length(vectorEdades)[1] 100

Como ves el resultado de length es el esperado

Vamos a conocer otra funcioacuten llamada sum que sirve para calcular la suma de todos los elementosde un vector

gt sum(vectorEdades)[1] 675

Ejercicio 8iquestCuaacutento vale la suma de los cuadrados de los nuacutemeros del 1 al 100 Solucioacuten en la paacutegina 47

A lo mejor te ha pasado desapercibido pero con las funciones length y sum estamos por fin encondiciones de empezar a hacer Estadiacutestica Descriptiva Por ejemplo podemos calcular la mediaaritmeacutetica de vectorEdades

gt ( mediaEdades = sum(vectorEdades) length(vectorEdades) )[1] 675

Y una vez que tenemos la media podemos calcular la varianza poblacional Para que resulte maacutesclaro vamos a mostrarte el proceso paso a paso aunque al final lo ejecutaremos en un soacutelo paso

1 Empezamos restando la media que estaacute en la variable mediaEdades de cada uno de loselementos de vectorEdades

vectorEdades - mediaEdades

El resultado es un vector de diferencias

2 Ahora elevamos cada una de esas diferencias al cuadrado

( vectorEdades - mediaEdades )^2

El resultado de este paso es de nuevo un vector ahora con las diferencias al cuadrado Fiacutejateen el pareacutentesis para garantizar que elevamos al cuadrado la diferencia Si no incluyeacuteramosel pareacutentesis iquestqueacute calculariacuteamos

20

3 A continuacioacuten sumamos todas esas diferencias al cuadrado usando la funcioacuten sum

sum( ( vectorEdades - mediaEdades )^2)

De nuevo el pareacutentesis es fundamental para que el cuadrado del vector de diferencias secalcule antes que la suma En este paso el resultado ya no es un vector sino un nuacutemero

4 Por uacuteltimo dividimos esa suma por n el nuacutemero de elementos de vectorEdades que seobtiene con la funcioacuten length

sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades)

El resultado de estos pasos se puede condensar en un soacutelo comando de R en el que a la vezcalculamos la varianza y la asignamos a una variable

gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades) )[1] 19875

Ejercicio 9

1 Calcula la desviacioacuten tiacutepica (poblacional) de vectorEdades

2 Calcula la cuasivarianza y cuasidesviacioacuten tiacutepica (muestrales) de vectorEdades

3 iquestQueacute sucede si en el tercer paso ejecutas el siguiente comandosum( vectorEdades - mediaEdades )^2iquestPor queacute sucede esto

Solucioacuten en la paacutegina 48

Con estos caacutelculos hemos empezado a hacer Estadiacutestica con R Naturalmente nos queda muchiacutesimoque aprender sobre los vectores de R Por ejemplo como se accede a una componente individualdel vector para responder a preguntas como ldquoiquestCuaacutento vale el quinto elemento del vectorrdquo Maacutesen general aprenderemos a extraer aquellos elementos del vector que cumplan alguna condicioacutenrespondiendo a preguntas como ldquoiquestQueacute elementos del vector son mayores que 7rdquo

42 Y por fin hagamos Estadiacutestica DescriptivaEn esta seccioacuten vamos a trabajar con un vector de datos contenido en este fichero adjunto

Este vector contiene los datos de la variable var3 del fichero Tut01-PracticaConCalccsv queya hemos utilizado en el Tutorial-00 para aprender a hacer Estadiacutestica Descriptiva con Calc Enesta seccioacuten vamos a reproducir los resultados que obtuvimos alliacute pero esta vez usando R Parapreparar el terreno vamos a hacer limpieza

Ejercicio 10

1 Cierra Rstudio y vuelve a abrirlo para limpiar la memora del sistema El trabajo que hemoshecho hasta ahora se perderaacute (aunque los comandos siguen en el Historial de Comandos queya vimos)

2 Establece el Directorio de Trabajo (por ejemplo el Escritorio) y aseguacuterate de que Tut02-var3csvestaacute guardado en la subcarpeta datos de ese directorio

3 Carga de nuevo el contenido de ese fichero en un vector var3 de R

Solucioacuten en la paacutegina 48

Veraacutes en lo que sigue que siempre que calculamos un objeto le asignamos una variable Eso permiteahorrarse la repeticioacuten innecesaria de caacutelculos si maacutes adelante volvemos a necesitar ese objeto Yen algunos casos como veremos maacutes adelante al hacer esto podemos acceder a propiedades delobjeto calculado que R no muestra en su respuesta por defecto

21

4 138 134 134 135 135 133 136 136 132 134 134 133 133 133 132 136 134 135 132 135 136 135 132 136 134 135 133 134 134 134 1310 136 138 134 135 137 133 135 138 136 137 135 134 137 135 136 138 137 134 133 135 135 134 131 135 137 133 133 137 136 135 135 132 138 135 135 135 136 135 133 1311 136 1310 134 131 133 138 139 135 134 1310 134 134 137 135 134 133 132 135 132 136 135 134 133 139 136 135 134 135 132 132 138 134 133 136 138 134 134 134 138 134 132 135 1310 136 1312 135 139 135 138 138 135 132 135 1310 136 135 136 135 135 137 134 133 134 133 133 134 133 133 133 133 137 138 135 134 135 134 135 137 135 133 134 134 137 133 132 135 137 135 134 136 132 135 132 136 1310 134 132 139 134 136 136 132 137 134 138 135 135 134 134 137 134 136 136 135 134 133 135 133 133 136 132 133 134 138 138 137 137 136 135 1310 134 134 134 138 136 134 136 137 135 135 136 138 134 138 134 135 137 136 134 137 137 135 137 132 136 135 133 135 136 130 133 135 135 137 134 137 131 135 136 135 138 132 134 136 139 137 1310 134 135 136 132 135 135 135 1313 133 136 133 136 135 130 1310 134 136 136 134 131 133 135 137 136 133 135 133 134 132 132 138 138 134 136 135 135 134 133 139 134 139 136 1311 133 132 132 136 138 1310 133 137 133 134 135 139 133 135 133 134 138 139 132 138 133 133 137 138 136 133 135 134 132 1311 137 137 136 134 133 135 1310 135 134 135 133 135 136 135 139 135 134 135 135 134 133 137 134 1310 135 134 132 139 134 137 133 135 134 131 136 135 136 134 138 135 135 138 138 134 132 135 133 134 138 138 135 138 132 1311 135 134 134 136 139 1310 137 134 137 132 133 135 1310 135 135 133 135 136 134 134 136 135 137 136 136 134 133 134 135 132 134 136 139 133 135 133 136 133 133 135 134 134 134 137 135 139 1310 133 134 136 131 137 138 135 133 133 135 133 133 137 136 135 135 138 134 139 136 135 135 138 134 130 133 137 133 134 1311 132 137 133 136 135 133 134 133 133 132 138 133 134 134 134 134 138 138 137 136 132 132 137 135 133 135 138 135 134 135 134 135 134 1312 133 135 133 133 133 132 134 131 139 135 135 135 138 138 135 138 133 134 133 136 136 135 134 133 133 135 133 137 135 132 133 133 132 131 132 136 137 130 136 133 134 1310 132 136 137 134 133 132 138 133 135 133 135 136 132 134 134 133 135 135 135 134 134 136 133 132 138 1310 135 135 132 132 137 136 134 135 134 134 136 134 136 135 133 137 137 136 137 134 134 137 133 130 134 136 135 137 136 136 135 137 134 134 135 136 136 135 136 132 134 133 139 135 133 137 135 136 137 136 136 136 134 135 137 137 133 134 137 137 136 133 134 137 131 135 136 133 137 133 135 133 137 138 133 137 132 135 134 133 132 135 134 134 135 133 134 139 135 134 139 137 133 132 133 134 133 134 135 135 138 134 135 134 135 139 137 133 133 132 136 132 138 135 132 137 134 135 136 132 134 135 135 133 135 136 137 135 138 132 131 137 135 135 138 134 137 136 139 1310 137 134 131 136 132 136 137 133 135 137 135 132 135 135 133 133 137 134 133 133 131 138 139 132 134 138 135 136 138 137 1310 138 133 134 134 135 134 134 135 136 135 134 134 135 133 136 135 137 132 133 139 132 133 137 136 134 137 131 135 134 132 134 138 135 134 131 132 134 135 136 133 134 138 134 132 135 134 132 134 133 136 135 138 133 139 1310 134 133 133 137 137 136 137 133 133 133 135 139 136 136 137 136 135 132 132 139 136 132 139 132 137 135 133 138 137 135 134 136 131 133 135 133 134 137 135 134 132 136 136 136 137 133 132 135 134 135 134 137 134 133 133 134 132 134 135 134 134 136 134 135 138 133 135 135 138 133 135 134 135 135 138 1311 132 134 134 136 133 135 133 136 132 131 136 134 136 132 136 136 136 136 130 136 134 134 131 138 131 1310 135 139 136 132 136 138 135 138 134 132 134 133 136 137 133 133 133 133 137 136 135 133 139 133 132 135 136 136 134 132 132 135 137 136 136 136 138 137 137 135 135 131 136 133 136 135 133 134 130 133 135 136 137 138 136 134 135 132 137 132 137 132 133 134 135 138 134 136 133 135 135 139 134 134 136 134 134 134 135 134 133 135 135 138 133 136 136 134 135 134 134 138 136 133 137 132 134 137 136 135 133 134 133 135 134 134 136 134 133 137 133 135 135 136 135 138 134 136 132 137 136 138 134 136 136 137 136 136 135 136 1310 138 133 137 135 136 137 134 136 133 134 133 132 132 134 137 132 132 133 132 138 134 134 135 135 139 135 134 132 134 135 134 139 137 133 134 134 135 133 133 137 138 135 139 133 138 136 136 134 133 136 135 1314 137 133 137 135 136 134 134 136 133 135 134 135 136 136 135 133 135 131 135 137 135 136 133 137 135 134 133 134 134 134 134 134 136 132 134 136 136 137 139 134 138 133 133 132 135 131 134 133 137 133 133 134 139 138 134 134 137 137 135 136 134 139 137 138 134 133 134 134 135 137 134 135 138 133 132 134 1310 133 135 134 132 138 137 136 135 138 1314 139 135 135 131 134 135 134 135 135 135 133 136 135 135 132 136 139 133 133 136 134 132 132 137 136 131 137 135 135 134 1313 1310 132 134 134 133 138 135 134 133 136 136 136 1310 134 137 136 138 139 137 135 134 134 137 137 138 133 134 135 137 135 136 1310 136 136 138 133 136 133 134 135 135 134 136 133 136 136 137 134 135 1316 136 136 132 136 136 133 134 133 137 134 135 134 133 138 134 1310 136 136 136 137 134 136 137 132 138 136 131 132 134 135 130 134 135 135 137 130 136 135 131 136 137 133 137 135 139 138 135 139 133 137 139 133 136 137 136 138 134 1310 136 134 133 139 136 137 133 13713

Rango maacuteximo y miacutenimo

Para empezar vamos a aprender tres nuevas funciones de R que nos permiten calcular esos tresvalores

gt (minimo = min(var3) )[1] 0gt (maximo = max(var3) )[1] 16gt (rango = range(var3) )[1] 0 16

El funcionamiento de las dos primeras es evidente La funcioacuten range devuelve un vector formadopor el maacuteximo y el miacutenimo

Tablas de frecuencia Clases de objetos en R

La tabla de frecuencia absoluta de var3 se obtiene usando la funcioacuten table de esta forma tansencilla

gt ( tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

La primera fila contiene los elementos de var3 y en la segunda aparece la frecuencia de cada unode ellos Puedes comprobar que son los mismos resultados que obtuvimos con Calc en la paacutegina10 del Tutorial01 Aunque alliacute desde luego el proceso fue maacutes laborioso

A lo mejor te has dado cuenta de que el formato de la respuesta es diferente de los que hemosobtenido hasta ahora Para empezar la respuesta no empieza con el [1] al que ya nos vamosacostumbrando El motivo de esto es que el objeto que hemos obtenido como respuesta no es unvector sino una tabla Ya dijimos que R utiliza distintos tipos de objetos con fines distintosiquestCoacutemo podemos saber de queacute clase es un objeto Pues usando una funcioacuten de R oportunamentellamada class Si la usamos con el vector var3 y con su tabla de frecuencias obtenemos

gt class(var3)[1] numericgt class(tablaFrecAbs)[1] table

El vector var3 es de clase numeric porque es un vector de nuacutemeros Y la tabla de frecuencias esde clase table Veremos a lo largo del curso otros objetos de tipo tabular como las matrices (clasematrix) los conjuntos de datos (clase dataframe) y los arraysAunque las tablas son objetos distintos de los vectores tienen algunas propiedades en comuacuten yalgunas de las funciones que hemos usado con vectores tambieacuten se pueden usar con tablas

Ejercicio 11Aplica las funciones length sum min max y range a la tabla tablaFrecAbs Solucioacuten en la paacutegina48

Siguiendo con los parecidos entre tablas y vectores puedes multiplicar (o dividir) una tabla porun nuacutemero y la operacioacuten se haraacute elemento a elemento

gt 2 tablaFrecAbsvar30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1618 50 200 376 488 492 372 262 174 86 56 12 4 4 4 2

Como ves cada frecuencia se multiplica por 2 Esta propiedad de las tablas permite obtener deforma muy sencilla la tabla de frecuencias relativa de var3 Como primer paso vamos a guardarla longitud de var3 en la variable n

22

gt ( n = length( var3 ) )[1] 1300

Y ahora podemos dividir la tabla por n para conseguir la tabla de frecuencias relativas (hemosestrechado la Consola de Comandos para que el resultado cupiera en esta paacutegina)

gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 400069230769 00192307692 00769230769 01446153846 01876923077

5 6 7 8 901892307692 01430769231 01007692308 00669230769 00330769231

10 11 12 13 1400215384615 00046153846 00015384615 00015384615 00015384615

1600007692308

Ejercicio 12Ya sabemos cuanto debe sumar esta tabla de frecuencias relativas Comprueacutebalo Solucioacuten en lapaacutegina 48

Si lo que queremos es una tabla de frecuencias acumuladas debemos emplear la funcioacuten cumsum

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Ejercicio 13La uacuteltima tabla que falta es la de frecuencias relativas acumuladas pero ya tienes todos los ingre-dientes para obtenerla de dos maneras diferentes Hazlo y comprueba si dan el mismo resultadoSi no es asiacute iquesta queacute crees que se debe y cuaacutel es la mejor opcioacuten Asigna el resultado a la variabletablaFrecRelAcu Solucioacuten en la paacutegina 49

Graacuteficos de columnas y diagramas de caja (boxplot) Argumentos con nombre

Vamos a fabricar nuestros primeros graacuteficos con R En concreto vamos a dibujar un graacutefico debarras a partir de la tabla de frecuencias de var3 usando la funcioacuten barplot de R

gt barplot(tablaFrecAbs)

Al ejecutar este comando no debes ver ninguna salida en la Consola de Comandos En su lugaren el panel inferior derecho de RStudio concretamente en la ventana Plots apareceraacute el graacuteficodeseado El resultado puede variar dependiendo de la anchura de tu ventana de RStudio

23

Hemos destacado ademaacutes en la figura los dos botones Zoom y Export que te permiten respecti-vamente ver una versioacuten ampliada de la Figura (que se redimensiona dinaacutemicamente si cambiasla ventana) y guardar esa figura como un fichero de graacuteficos que puedes insertar en cualquierdocumento editar con un programa de manipulacioacuten de graacuteficos etceacuteteraLos graacuteficos de R se pueden controlar hasta en sus detalles maacutes miacutenimos Como aperitivo miacutenimovamos a antildeadir algo de color al graacutefico

gt barplot(tablaFrecAbs col = heatcolors(15))

El resultado es esta figura

Las posibilidades de control de los graacuteficos de R son como decimos inmensas y pueden llegar aser abrumadoras Hay libros de cientos de paacuteginas dedicados a este tema como el R GraphicsCookbook de W Chang (ver las referencias del curso) Nosotros a lo largo de los tutoriales delcurso vamos a aprender algo maacutes aunque a penas nos podremos limitar a rozar la superficie delo que se puede llegar a hacerEn la Seccioacuten 231 del libro hemos descrito los diagramas de cajas o boxplots (recuerda la Figura22 de la paacuteg 36 del libro) Y en el Tutorial-01 dijimos que con Calc no es faacutecil dibujar ese tipode diagramas En cambio con R no podriacutea ser maacutes faacutecil

gt boxplot(var3)

Y el resultado es esta figura

24

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

describe en Computacioacuten las herramientas que nos permiten almacenar y procesar informacioacutenLas estructuras de datos maacutes baacutesicas de R son las variables y los vectores En proacuteximos tutorialesnos iremos encontrando con otras estructuras de datos matrices dataframes listas entre otras

21 Variables en RUna variable en R es un siacutembolo que usamos para referirnos a un valor Por ejemplo si te situacuteasen la Consola de Comandos tecleas

a = 2

y ejecutas esa instruccioacuten entonces aunque aparentemente no ha sucedido nada (porque no hayrespuesta) a partir de ese momento R ha asignado el valor 2 al siacutembolo a Asiacute que si por ejemplotecleas y ejecutas

a + 1

obtendraacutes como respuesta 3

Ejercicio 2iquestQueacute se obtiene al ejecutar estos comandos uno detraacutes de otro iquestCuaacutento valen las variables a by c al final

a = 2b = 3c = a + ba = b cb = (c - a)^2c = a b

La solucioacuten estaacute en la paacutegina 47 iexclNo la mires antes de intentar pensar el ejercicio por ti mismo

En el Capiacutetulo 1 del libro hemos hablado de variables cualitativas y cuantitativas Estas uacuteltimastoman siempre valores numeacutericos y las variables de R sirven desde luego para almacenar esa clasede valores Pero como iremos viendo en sucesivos tutoriales tambieacuten se pueden utilizar variablesde R para guardar valores de variables cualitativas (factores) y otros tipos de objetos que iremosconociendo a lo largo del curso De momento para que veas a que nos referimos recordaremos elEjemplo 111 del libro (paacuteg 6) en el que teniacuteamos una variable cualitativa ordenada que representael pronoacutestico de un paciente que ingresa en un hospital Prueba a ejecutar este coacutedigo

pronostico = Leve

simplemente para que de momento veas que

R no protesta El valor Leve es un valor perfectamente aceptable

En R los valores que representan palabras frases o como las llamaremos teacutecnicamente cadenasalfanumeacutericas se escriben siempre entre comillas Puedes usar comillas simples o dobles perote aconsejamos que uses dobles comillas

La relacioacuten entre factores y valores alfanumeacutericos en R es algo maacutes complicada de lo que estesencillo ejemplo parece sugerir Pero ya tendremos ocasioacuten en futuros tutoriales de extendernossobre eso

Asignaciones

Las instrucciones como

a = 2

o como

b = (c - a)^2

se denominan asignaciones En la primera por ejemplo decimos que hemos asignado el valor 2a la variable aQueremos advertir al lector de que en R hay otra forma esencialmente equivalente de escribir lasinstrucciones y que de hecho se usa mayoritariamente En lugar del siacutembolo = puedes conseguirel mismo efecto escribiendo lt- (el signo ldquomenorrdquo seguido sin espacios de un signo ldquomenosrdquo) Asiacuteque si ejecutas

9

a lt- 2

el resultado seraacute el mismo que antes con = Las dos notaciones tienen ventajas e inconvenientes peronosotros preferimos = porque se parece maacutes a lo que se utiliza en muchos lenguajes de programacioacuten

Coacutemo ver los resultados de un caacutelculo a la vez que lo hacemos

Ya habraacutes notado que al hacer una asignacioacuten R no produce ninguna respuesta y se limita aguardar el valor en la variable En una asignacioacuten como a=2 esto no genera ninguna duda Perosi el miembro derecho de la asignacioacuten es una expresioacuten maacutes complicada puede ser convenientepedirle a R que nos muestre el resultado de esa expresioacuten a la vez que se hace la asignacioacutenImagiacutenate por ejemplo esta situacioacuten

b = 2c = -2d = -4a = b c^2 d + 3

iquestCuaacutel es el valor que se asigna a la variable a Una forma de averiguarlo es simplemente ejecutaruna liacutenea adicional en la que aparece soacutelo el nombre de la variable que queremos inspeccionar Alejecutar esta sentencia R nos devuelve como respuesta

gt a[1] 1

Pero hay otra manera de conseguir que R nos muestre el resultado de la asignacioacuten que es maacutesinteresante porque produce coacutedigo maacutes simple Basta con encerrar toda la asignacioacuten entre pareacuten-tesis El resultado es

gt ( a = b c^2 d + 3 )[1] 1

como antes Este ejemplo es desde luego bastante artificial Te recordamos en cualquier caso laconveniencia de utilizar pareacutentesis para hacer maacutes legibles las expresiones y evitar posibles erroresPero a la vez la posibilidad de comprobar el resultado de las asignaciones aumenta la fiabilidaddel coacutedigo que escribimos

Nombres de las variables

Aunque hasta ahora hemos usado letras como nombres de las variables puedes utilizar nombresmaacutes descriptivos Y muchas veces es una buena idea hacerlo Por ejemplo puede que hace unasemana hayas escrito estas instrucciones para resolver un problema

a = 2b = 3c = a b

Pero si las vuelves a ver pasada una semana es posible que no recuerdes queacute era lo que estabastratando de conseguir al hacer esto En cambio al ver estas instrucciones

espacio = 2tiempo = 3velocidad = espacio tiempo

es mucho maacutes faacutecil reconocer el objetivo que persiguen A lo largo de los tutoriales del curso vamos ainsistir muchas veces en la necesidad de que el coacutedigo esteacute bien organizado y esteacute bien documentadoUn primer paso en esa direccioacuten es tratar de elegir nombres descriptivos para las variables En Rlas reglas para los nombres de variables son muy flexibles esencialmente que empiecen por unaletra y no contengan espacios ni caracteres especiales como + pareacutentesis etceacutetera Pero cuidadocon los excesos Es cierto que puedes usar nombres de variables arbitrariamente largos Pero si usascomo nombre

Estavariablealmacenaelresultadodelaoperaciontaninteresantequeacabamosdehacer

tu trabajo resultaraacute ilegible Como siempre se necesita un equilibrio y con la praacutectica encontraraacutesel tuyo (consejo zen gratuito del tutorial de hoy) Para empezar es una buena idea combinarmayuacutesculas y minuacutesculas en los nombres de las variables Si vas a usar una variable para representarla temperatura final de un proceso el nombre temperaturafinalproceso es menos legible y maacuteslargo que tempFinal Es mucho maacutes faacutecil por otra parte que te equivoques tecleando el primerode esos nombres

10

22 VectoresEn Estadiacutestica lo habitual es trabajar con colecciones o muestras de datos Y para almacenar esascolecciones de datos la estructura maacutes baacutesica de R son los vectores En este apartado vamos aempezar nuestro trabajo con ellos aunque a lo largo del curso auacuten tendremos ocasioacuten de aprenderbastante maacutes sobre el manejo de los vectores de RPara empezar vamos a trabajar con vectores que contienen una coleccioacuten de nuacutemeros que puedenser las edades de los alumnos de una clase

22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19

En R las listas de nuacutemeros como esta se almacenan en vectores El vector que corresponde a esasedades se construye en R mediante un comando como este

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19)

En realidad en esa expresioacuten hemos hecho dos cosas

1 Hemos creado el vector con los datos en la parte derecha de la expresioacuten

c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19)

Los datos estaacuten separados por comas y rodeados por pareacutentesis Hasta aquiacute todo es bastantetiacutepico pero fiacutejate especialmente en la letra c que precede al primer pareacutentesis Esa letra ces el nombre de una nueva funcioacuten de R y es la forma maacutes sencilla que existe en R paracrear un vector de datos Podriacutea pensarse que la c es de crear pero en realidad proviene deconcatenar Enseguida entenderemos porque es asiacute

2 Una vez creado el vector lo hemos asignado a la variable edades Hasta ahora soacutelo habiacuteamosusado variables para identificar un uacutenico valor (un nuacutemero o una cadena alfanumeacuterica)Pero una variable puede usarse para identificar un vector o como veremos maacutes adelanteestructuras mucho maacutes complejas

Una observacioacuten maacutes los vectores de R se usan para almacenar valores de una variable Y enparticular todos los datos de un vector son del mismo tipo de variable No se puede mezclar en unvector nuacutemeros y cadenas alfanumeacutericas (aparentemente R te dejaraacute hacerlo pero internamentehabraacute convertido todos los nuacutemeros en cadenas alfanumeacutericas)

Manos a la obra Prueba a copiar el comando anterior en tu Consola de comandos (puedes usarcopiar y pegar desde este fichero) y ejecuacutetalo Si las cosas van bien no esperes ninguna respuestacomo ya hemos dicho R no te muestra el resultado de las asignaciones Recuerda que si quieresver el resultado de una asignacioacuten puedes rodear toda liacutenea con pareacutentesis como en

(edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19))

Otra opcioacuten naturalmente es preguntarle a R por el valor de edades despueacutes de la asignacioacutenEscribe simplemente edades en la Consola de Comandos y ejecuacutetalo Veraacutes de nuevo el contenidode esa variable

Vamos a hacer algunas operaciones con este vector Imagiacutenate que como sucede a menudo despueacutesde haber creado nuestra lista de edades de alumnos desde la administracioacuten nos avisan de que haycinco alumnos nuevos recieacuten matriculados y debemos incorporar sus edades que son

22 18 20 21 20

a nuestro vector de datos Naturalmente podemos empezar de nuevo pero es preferible reutilizarel vector edades que ya habiacuteamos creado Vamos a ver esto como primer ejemplo para empezar aaprender coacutemo se manipulan vectores en R Una forma de antildeadir los datos es empezar creando unnuevo vector (con la funcioacuten c de R)

(edades2 = c(22 18 20 21 20))

Y a continuacioacuten concatenamos los vectores usando de nuevo la misma funcioacuten c de una maneradistinta

(edades = c( edades edades2))

11

Hemos rodeado toda la liacutenea con pareacutentesis para ver el resultado y poder observar coacutemo hacambiado el vector edadesVamos a analizar paso a paso lo que ha ocurrido

La instruccioacuten c( edades edades2) toma los datos contenidos en edades y edades2 y losconcatena en ese orden para fabricar un nuevo vector que todaviacutea no estaacute guardado enninguna variable

La asignacioacuten edades = c( edades edades2) toma ese vector y lo guarda en la propiavariable edades Al hacer esto como era de esperar el anterior vector edades es reemplazadocon la nueva lista y su contenido anterior se pierde (cuidado con esto las reasignaciones sonuna de las formas habituales de cometer errores)

El nombre de la funcioacuten c proviene en realidad de concatenate concatenar en ingleacutesLa siguiente figura resume lo que hemos venido haciendo con estos datos

Los nuacutemeros entre corchetes al principio de cada fila como el [1] y el [16] de este ejemploson soacutelo ayudas para que podamos localizar los elementos del vector En mi pantalla la primerafila muestra los primeros 15 nuacutemeros del vector Pero en la tuya si la ventana de RStudio es dedistinta anchura los nuacutemeros entre corchetes pueden ser distintos Hasta ahora soacutelo habiacuteamos vistoejemplos con [1] que es lo que sucede cuando la respuesta es un vector que cabe en una uacutenicaliacutenea

3 Ficheros csv con REn esta seccioacuten vamos a aprender a utilizar ficheros csv con R En el Tutorial-01 hemos vistoalgunos ejemplos de ese tipo de ficheros y el manejo baacutesico con una hoja de caacutelculo como CalcComo vimos alliacute un fichero csv tiacutepico contiene una tabla de datos con varias columnas Esaestructura de tabla se haraacute imprescindible maacutes adelante Pero durante una buena parte del cursonosotros nos vamos a limitar a problemas en los que interviene una uacutenica variable En tal casopara almacenar los datos de esa variable nos podemos a limitar a considerar un tipo de ficheroscsv muy baacutesico como el fichero adjunto

Guaacuterdalo en la subcarpeta datos de tu directorio de trabajo (el que contiene este pdf) Si lo abrescon un editor de texto (como el Bloc de Notas en Windows) veraacutes como muestra esta figura

12

61371381381381391391351381371381371371361361371351381391341371351371371351391341371371371381351381391371341361361361391381361371361371361361381361351351361361381351381351391371361391351371381381371310137138137135136138138137133135136137135137137135138134138138138136137136136138135136135138136139137

que el fichero contiene soacutelo una columna de datos que en este ejemplo corresponde a valores deuna variable cuantitativa discreta En la figura soacutelo se muestra una parte de los datos

Ejercicio 3iquestCuaacutentos datos hay en ese vector Usa Calc para averiguarlo pronto aprenderemos a hacerlo conR Solucioacuten en la paacutegina 47

Queremos utilizar esos datos en R y para eso vamos a (1) leerlos desde el fichero y (2)guardarlos enun vector El resultado seraacute como si nosotros hubieacuteramos creado ese vector tecleaacutendo sus elementosdirectamentePara el primer paso (la lectura del fichero csv) vamos a tener que empezar por explicarle a R(usando RStudio como intermediario) donde estaacute el fichero que contiene esos datos Cuando tra-bajamos con ficheros R utiliza un directorio de nuestro ordenador como directorio de trabajo Acontinuacioacuten vamos a aprender a elegir un directorio de trabajo Puedes usar cualquier carpeta yen lo que sigue vamos a suponer que hemos elegido el Escritorio Lo maacutes importante es que esacarpeta debe contener a su vez una subcarpeta llamada datos Y aseguacuterate de que los ficheroscsv que vas a usar estaacuten almacenados en esa subcarpeta llamada datos

Usamos el menuacute Session rarr Set Working Directory rarr Choose Directory

Se abre un cuadro de diaacutelogo del sistema y navegamos hasta la carpeta que contiene el ficherocsv que en mi caso es el Escritorio Cuando selecciono el Escritorio veo aparecer en la Consolade Comandos de R un comando que RStudio ha escrito y ejecutado por nosotros

13

setwd(CUsersFernandoDesktop)

Este es el resultado en mi ordenador (de ahiacute el nombre de usuario) usando Windows 10 Enversiones maacutes antiguas de Windows o en una maacutequina con Linux o un Mac el comando seraacuteligeramente distinto Cuando tengamos maacutes praacutectica aprenderemos otras formas de seleccionar eldirectorio de trabajo o incluso de utilizar ficheros situados fuera de ese directorio de trabajo Peropor el momento resulta maacutes coacutemodo dejar que RStudio haga ese trabajo para nosotrosAhora R ya sabe doacutende estaacute el fichero que nos interesa pero todaviacutea no sabe cual es Para ello vamosa utilizar la funcioacuten readtable de R Aunque esta funcioacuten tiene muchas opciones disponiblesnuestro primer uso de ella seraacute bastante sencillo Copia y ejecuta el siguiente coacutedigo en RStudio

(vectorEdades = readtable(datosTut02-Edadescsvheader = FALSE)[1])

En esta instruccioacuten le decimos a R que use la funcioacuten readtable para leer el contenido del ficheroTut02-Edadescsv y que almacene lo que ha leiacutedo en un vector que hemos decidido llamarvectorEdades Y aunque no es necesario entender en detalle el funcionamiento de readtable eneste momento vamos a explicar un poco maacutes lo que hemos hecho A medida que el curso avanceiraacutes teniendo maacutes ocasiones de practicar esto e iraacute quedando cada vez maacutes claroLa opcioacuten header = FALSE sirver para indicarle a R que la tabla almacenada en el fichero no tieneuna liacutenea de cabecera (en ingleacutes header) que cuando existe suele contener los nombres de lasvariables de la tabla Ademaacutes la funcioacuten readtable sirve para leer tablas con varias columnasobteniendo como resultado un objeto de R de tipo dataframe Pero nuestro primer ejemplo esmuy sencillo y la tabla soacutelo tiene una columna Asiacute que usamos la notacioacuten [1] para indicarle aR que soacutelo queremos la primera columna de esa tabla considerada como un vectorAl ejecutar esa orden habraacutes obtenido una respuesta como esta

gt gt (vectorEdades = readtable(datosTut02-Edadescsv header = FALSE)[1])[1] 6 7 8 8 8 9 9 5 8 7 8 7 7 6 6 7 5 8 9 4 7 5 7[24] 7 5 9 4 7 7 7 8 5 8 9 7 4 6 6 6 9 8 6 7 6 7 6[47] 6 8 6 5 5 6 6 8 5 8 5 9 7 6 9 5 7 8 8 7 10 7 8[70] 7 5 6 8 8 7 3 5 6 7 5 7 7 5 8 4 8 8 8 6 7 6 6[93] 8 5 6 5 8 6 9 7

Como hemos dicho antes los nuacutemeros entre corchetes al principio de cada fila que en mi casoson [1] [24] [47] [70] y [93] son soacutelo ayudas para que podamos localizar los elementos delvector En mi pantalla cada primera fila muestra 23 nuacutemeros del vector Pero en la tuya si laventana de RStudio es de distinta anchura los nuacutemeros entre corchetes pueden ser distintos

En cualquier caso ahora el vector vectorEdades contiene la informacioacuten del fichero csv con el quehemos empezado En la Seccioacuten 4 vamos a empezar a hacer Estadiacutestica Descriptiva Pero antes tepedimos un poco maacutes de paciencia porque vamos a entretenernos un poco maacutes en los detalles delmanejo de ficheros csv con R No pretendemos ser exhaustivos ni mucho menos pero siacute queremosaprender lo suficiente como para evitarnos los problemas maacutes habituales en los casos maacutes sencillosPara cerrar este apartado es conveniente haber visto el error que se produce cuando el fichero quetratamos de leer desde R no existe o no estaacute en el directorio de trabajo

Ejercicio 4Prueba a ejecutar

errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)

y fiacutejate en el mensaje de error Solucioacuten en la paacutegina 47

Otra variante del fichero de entrada

Los ficheros csv que contienen un uacutenico vector (en lugar de una tabla de datos) pueden adoptarformatos distintos del que acabamos de ver Por ejemplo el fichero adjunto

contiene los mismos datos que Tut02-Edadescsv pero ahora los datos del vector estaacuten todos enuna fila y separados por comas Guaacuterdalo como antes en la subcarpeta datos El aspecto delfichero visto a traveacutes de un editor de texto es este (soacutelo son visibles una parte de los datos)

14

67888995878776675894757759477785897466698676766865566858597695788710787568873567577584888676685658697

Desde luego no nos podemos plantear transformar a mano este vector en uno como el anteriorLa solucioacuten que te proponemos pasa por la hoja de caacutelculo y la opcioacuten de trasponer una tablaque hemos visto en el Tutorial-00 lo leeriacuteamos en una fila de la hoja y luego habriacutea que usar elPegado especial para trasponerlo -es decir girarlo- para finalmente volver a guardarlo Alterna-tivamente hay otras soluciones sin salir de R usando una funcioacuten llamada scan o usando de nuevoreadtable y trasponiendo la tabla dentro de R Esos meacutetodos son sencillos cuando se aprendeun poco maacutes sobre R pero por el momento y para los ejemplos sencillos que encontraremos nosvamos a conformar con ese enfoque baacutesico que usa la hoja de Caacutelculo si es necesario

31 Coacutemo obtener ayuda y usar el tabulador en RStudioVamos a aprovechar estos ejemplos de lectura de ficheros csv para aprender a obtener ayuda sobrelas funciones de R La mayoriacutea de las funciones de R como la funcioacuten readtable o la funcioacutenscan que hemos mencionado al final del anterior apartado tienen muchos argumentos opcionalesY hay muchiacutesimas funciones en R (cada vez maacutes porque como veremos maacutes adelante usuarios detodo el mundo antildeaden constantemente funciones nuevas a R cuando las necesitan) No es posiblerecordar todos esas funciones cada una con sus opciones asiacute que es muy importante aprender aobtener esa informacioacuten cuando la necesitamosPara ver como obtener esa informacioacuten en RStudio vamos a usar por ejemplo la funcioacuten scanSituacuteate en una liacutenea vaciacutea de la Consola de Comandos escribe scan y a continuacioacuten mientras elcursor parpadea junto a la n final de scan pulsa la tecla del tabulador (si esto no funciona usa latecla F1 y mira el panel ayuda de RStudio) Veraacutes aparecer una ventana emergente con informacioacutensobre la funcioacuten scan como en esta figura

15

Como ves se muestra un resumen sobre la funcioacuten scan que a veces seraacute suficiente Si necesitasmaacutes detalles haz caso a la indicacioacuten que aparece al final de esa ventana y pulsa la tecla F1 Alhacerlo veraacutes que en el panel inferior derecho de RStudio aparece el fichero de ayuda de la funcioacutenscan como en esta figura

Esos ficheros de ayuda son muy uacutetiles aunque al principio pueden resultar un poco intimidatoriosya sea por un exceso de informacioacuten ya sea porque se da por supuesto que el usuario ya entiendealgunos conceptos baacutesicos de R Podemos garantizar al lector que a medida que se progresa en Rla utilidad de estos ficheros aumentaPero la utilidad de la tecla tabulador en RStudio no se acaba ahiacute Supongamos que quieres aplicarreadtable para leer el fichero Tut02-Edadescsv Pero te da pereza escribir un nombre tan largoo no recuerdas exactamente el nombre o dudas entre dos nombres no importa cual sea el motivoEmpiezas a escribir la orden tecleas

(vectorEdades2 = readtable(datos

y de nuevo justo en este punto pulsas el tabulador Entonces RStudio te ofrece en una nuevaventana emergente todos los ficheros disponibles en la carpeta datos

Y ahora puedes usar esa lista seleccionar el fichero que quieras utilizar Puedes tambieacuten teclearalguna letra maacutes del nombre para acotar auacuten maacutes la buacutesqueda cuando la carpeta contiene muchosficherosEn general la idea es que en RStudio el tabulador es tu amigo Como tendremos ocasioacuten decomprobar RStudio nos ofrece bastante ayuda para hacer maacutes coacutemodo nuestro trabajo con R yel tabulador es una de las herramientas maacutes versaacutetiles y uacutetiles

16

32 El camino contrario escribir un vector a un fichero de tipo csvHemos aprendido a leer con R vectores de datos a partir de ficheros de tipo csv Pero muchasveces despueacutes de hacer operaciones en R obtendremos como resultados nuevos vectores (y maacutesadelante en el curso otro tipo de objetos) Lo natural entonces es aprender a guardar ese vectoren un fichero de tipo csv como el fichero con el que empezamos De esa forma por ejemplo puedescompartir tus resultados con otras personas que utilicen programas distintos de R Para ello siantes usaacutebamos la funcioacuten readtable ahora vamos a usar la funcioacuten writetable de R

Como ejemplo vamos a utilizar este vector de nuacutemeros enteros

29 17 63 31 55 9 92 61 10 16 63 6 61 59 66 41 68 6 99 21 87 68 52 83 66 98 45 5024 100 83 37 44 4 97 67 56 74 75 71 55 22 86 22 93 65 38 84 54 83 100 71 99 1963 11 11 62 91 20 79 42 59 95 70 74 8 25 45 58 57 75 81 34 70 68 39 12 14 21

Ejercicio 5Usa copiar y pegar a partir de este documento pdf para crear un vector de R llamado muestraque contenga esos datos

Para guardar ese vector muestra en un fichero csv (dentro de la subcarpeta datos del directoriode trabajo) podemos utilizar la funcioacuten writetable usando como argumentos

El nombre del vector que queremos guardar que es muestra

Y el nombre del fichero en el que lo guardamos Vamos llamarlo por ejemplo Tut02-muestracsvLe indicamos a R ademaacutes que lo ponga en la subcarpeta datos

La opcioacuten colnames = FALSE o colnames = TRUE para decidir si queremos que R incluyauna liacutenea de cabecera con el nombre de la variable que en este caso es muestra (y que novamos a incluir)

La opcioacuten rownames = FALSE para evitar que R incluya nuacutemeros de fila en el fichero desalida (normalmente no querremos esos nuacutemeros)

Es decir que ejecutamos

writetable(muestrafile = datosTut02-muestracsv colnames=FALSE rownames=FALSE)

Al ejecutar esa orden el fichero que obtenemos tiene la forma deseada (de nuevo soacutelo es visible elcomienzo del fichero)

17

Puedes probar a abrirlo en Calc para ver que es un fichero de datos como los que hemos visto hastaahora

Naturalmente apenas hemos rozado el tema de la entradasalida de datos en R Pero con lo quehemos aprendido en este apartado estamos listos para empezar a hacer Estadiacutestica Descriptivausando ejemplos que no sean demasiado triviales

4 Estadiacutestica descriptiva de una variable cuantitativa condatos no agrupados

Para seguir adelante tenemos que empezar por aprender un poco maacutes sobre la forma en la que Rpermite operar con los vectores Vamos a hacerlo a traveacutes de una serie de ejercicios-ejemplos

Ejercicio 6

1 Vamos a definir dos vectores cada uno de ellos con 12 nuacutemeros enteros El primero al quellamaremos vector1 estaacute formado por

8 5 19 9 17 2 28 18 3 4 19 1

Usa copiar y pegar a partir de este fichero pdf para definir el vector1 en R

2 El segundo vector al que en un rapto de originalidad llamaremos vector2 estaacute almacenadoen el fichero

Guaacuterdalo en datos y examiacutenalo primero con un editor de texto (como el Bloc de Notas)para ver coacutemo estaacuten almacenados los datos en ese fichero Una vez hecho esto usa Calc yla funcioacuten readtable para almacenar el contenido de ese fichero csv en el vector2 de REn alguacuten momento del proceso puede que tengas que usar el pegado especial de Calc paratrasponer los datos

Solucioacuten en la paacutegina 47

41 Aritmeacutetica vectorial en RAhora vamos a sumar los dos vectores Ejecuta el comando

vector1 + vector2

para comprobar que el resultado es la suma componente a componente de los dos vectores

gt vector1 + vector2[1] 26 23 39 21 37 3 58 24 29 24 34 26

Este resultado es bastante previsible Lo que quizaacute resulteacute un poco maacutes inesperado es que simultiplicas los dos vectores tambieacuten se obtienen los productos componente a componente el primerelemento de vector1 se multiplica por el primero de vector2 el segundo por el segundo etc

gt vector1 vector2[1] 144 90 380 108 340 2 840 108 78 80 285 25

Esta forma de operar de R como veremos pronto es muy uacutetil Si lo piensas un momento cadavector numeacuterico de R se corresponde con una columna de una hoja de caacutelculo como las queusaacutebamos en el Tutorial01 Alliacute vimos que para algunas operaciones era necesario multiplicar doscolumnas elemento a elemento En Calc esa operacioacuten no es complicada pero en R es auacuten maacutes faacutecilBasta con un comando como vector1 vector2 para conseguir el objetivo Veremos muchos maacutesejemplos a lo largo del curso en los que una operacioacuten que en Calc requeririacutea bastantes pasosen R se reduce a ejecutar un uacutenico comandoEn R las operaciones con vectores siguen en general este esquema de funcionamiento componentea componente Si por ejemplo ejecutas

18

1818201220130626201525

gt vector1 + 5[1] 13 10 24 14 22 7 33 23 8 9 24 6gt 2 vector1[1] 16 10 38 18 34 4 56 36 6 8 38 2

veraacutes que en el primer caso cada uno de los elementos de vector1 se ha incrementado en 5mientras que en el segundo caso cada uno se ha multiplicado por 2 Sucede lo mismo con otrasoperaciones como elevar al cuadrado

gt vector1^2[1] 64 25 361 81 289 4 784 324 9 16 361 1

Y podemos aplicar funciones en un solo paso Por ejemplo podemos calcular el logaritmo neperianode todos los elementos de un vector en un soacutelo paso

gt log(vector1)[1] 20794415 16094379 29444390 21972246 28332133 06931472[7] 33322045 28903718 10986123 13862944 29444390 00000000

Los resultados de todas estas operaciones son de nuevo vectores Y por tanto se pueden asignara nuevas variables para utilizarlos en nuestras operaciones Por ejemplo si luego vas a necesitar loslogaritmos de vector1 puedes definir una variable para identificar ese vector llamada logVector1(e el nombre que tuacute quieras) haciendo

gt logVector1 = log(vector1)

Recuerda que si ademaacutes de la asignacioacuten quieres ver el resultado puedes rodear toda esta senten-cia con pareacutentesis De lo contrario R la ejecuta pero no imprime ninguna respuesta como ya sabes

Aunque al principio puede parecer complicado cuando te acostumbres a esta forma de trabajarcon vectores veraacutes que resulta muy coacutemoda y eficiente

Generando vectores de nuacutemeros enteros consecutivos

Hay muchas ocasiones en que para alguna operacioacuten necesitamos un vector que contenga losnuacutemeros enteros consecutivos del 1 al n o del 0 al n etc En R esto es muy faacutecil de hacer Porejemplo para conseguir un vector con los nuacutemeros del 1 al 15 basta con ejecutar

gt 115[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Esa notacioacuten con los dos puntos permite generar vectores en los que cada elemento es igual alanterior maacutes 1 Otro ejemplo

gt -713[1] -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13

O incluso cuando los puntos de partida no son enteros

gt 1575[1] 15 25 35 45 55 65 75gt 1574[1] 15 25 35 45 55 65

iquestVes la diferencia entre estos dos casos

Es muy posible que te esteacutes preguntando iquesty si quiero ir avanzando de 2 en 2 o quiero ir hacia atraacutes(ldquoavanzandordquo de minus2 en minus2 por ejemplo) Pronto cuando hayamos aprendido un poco maacutes volve-remos sobre esto y comprobaremos que R nos ofrece un cataacutelogo de herramientas extremadamentepotentes para fabricar vectores de acuerdo con nuestros deseos y necesidadesLos vectores fabricados con este meacutetodo son vectores iguales que los demaacutes y se pueden asignar avariables operar con ellos etc

19

Ejercicio 7

1 Fabrica un vector con los cuadrados de los nuacutemeros del 1 al 10 y asiacutegnalo a la variablecuadrados Usa los pareacutentesis para ver el resultado de la asignacioacuten

2 Haz lo mismo con los cuadrados de los nuacutemeros del 2 al 11 y un vector cuadrados2

3 Resta los vectores cuadrados2 - cuadrados iquestObservas algo interesante

Solucioacuten en la paacutegina 47

Funciones vectoriales

Hemos visto antes que se puede aplicar una funcioacuten como la raiacutez cuadrada a un vector y seobtiene como resultado otro vector con las raiacuteces cuadradas elemento a elemento Pero hay otrotipo de funciones que permiten hacer caacutelculos con el vector en conjunto Por ejemplo antes hemosfabricado el vector -713 y la funcioacuten length nos dice cuantos elementos tiene ese vector

gt length(-713)[1] 21

En el Ejercicio 3 (paacuteg 13) nos preguntaacutebamos cuantos elementos teniacutea el vector vectorEdades quehabiacuteamos cargado desde el fichero csv Puedes obtener la respuesta con length(vectorEdades)Para comprobarlo aseguacuterate de que has creado el vector llamado vectorEdades y ejecuta estaorden

gt length(vectorEdades)[1] 100

Como ves el resultado de length es el esperado

Vamos a conocer otra funcioacuten llamada sum que sirve para calcular la suma de todos los elementosde un vector

gt sum(vectorEdades)[1] 675

Ejercicio 8iquestCuaacutento vale la suma de los cuadrados de los nuacutemeros del 1 al 100 Solucioacuten en la paacutegina 47

A lo mejor te ha pasado desapercibido pero con las funciones length y sum estamos por fin encondiciones de empezar a hacer Estadiacutestica Descriptiva Por ejemplo podemos calcular la mediaaritmeacutetica de vectorEdades

gt ( mediaEdades = sum(vectorEdades) length(vectorEdades) )[1] 675

Y una vez que tenemos la media podemos calcular la varianza poblacional Para que resulte maacutesclaro vamos a mostrarte el proceso paso a paso aunque al final lo ejecutaremos en un soacutelo paso

1 Empezamos restando la media que estaacute en la variable mediaEdades de cada uno de loselementos de vectorEdades

vectorEdades - mediaEdades

El resultado es un vector de diferencias

2 Ahora elevamos cada una de esas diferencias al cuadrado

( vectorEdades - mediaEdades )^2

El resultado de este paso es de nuevo un vector ahora con las diferencias al cuadrado Fiacutejateen el pareacutentesis para garantizar que elevamos al cuadrado la diferencia Si no incluyeacuteramosel pareacutentesis iquestqueacute calculariacuteamos

20

3 A continuacioacuten sumamos todas esas diferencias al cuadrado usando la funcioacuten sum

sum( ( vectorEdades - mediaEdades )^2)

De nuevo el pareacutentesis es fundamental para que el cuadrado del vector de diferencias secalcule antes que la suma En este paso el resultado ya no es un vector sino un nuacutemero

4 Por uacuteltimo dividimos esa suma por n el nuacutemero de elementos de vectorEdades que seobtiene con la funcioacuten length

sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades)

El resultado de estos pasos se puede condensar en un soacutelo comando de R en el que a la vezcalculamos la varianza y la asignamos a una variable

gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades) )[1] 19875

Ejercicio 9

1 Calcula la desviacioacuten tiacutepica (poblacional) de vectorEdades

2 Calcula la cuasivarianza y cuasidesviacioacuten tiacutepica (muestrales) de vectorEdades

3 iquestQueacute sucede si en el tercer paso ejecutas el siguiente comandosum( vectorEdades - mediaEdades )^2iquestPor queacute sucede esto

Solucioacuten en la paacutegina 48

Con estos caacutelculos hemos empezado a hacer Estadiacutestica con R Naturalmente nos queda muchiacutesimoque aprender sobre los vectores de R Por ejemplo como se accede a una componente individualdel vector para responder a preguntas como ldquoiquestCuaacutento vale el quinto elemento del vectorrdquo Maacutesen general aprenderemos a extraer aquellos elementos del vector que cumplan alguna condicioacutenrespondiendo a preguntas como ldquoiquestQueacute elementos del vector son mayores que 7rdquo

42 Y por fin hagamos Estadiacutestica DescriptivaEn esta seccioacuten vamos a trabajar con un vector de datos contenido en este fichero adjunto

Este vector contiene los datos de la variable var3 del fichero Tut01-PracticaConCalccsv queya hemos utilizado en el Tutorial-00 para aprender a hacer Estadiacutestica Descriptiva con Calc Enesta seccioacuten vamos a reproducir los resultados que obtuvimos alliacute pero esta vez usando R Parapreparar el terreno vamos a hacer limpieza

Ejercicio 10

1 Cierra Rstudio y vuelve a abrirlo para limpiar la memora del sistema El trabajo que hemoshecho hasta ahora se perderaacute (aunque los comandos siguen en el Historial de Comandos queya vimos)

2 Establece el Directorio de Trabajo (por ejemplo el Escritorio) y aseguacuterate de que Tut02-var3csvestaacute guardado en la subcarpeta datos de ese directorio

3 Carga de nuevo el contenido de ese fichero en un vector var3 de R

Solucioacuten en la paacutegina 48

Veraacutes en lo que sigue que siempre que calculamos un objeto le asignamos una variable Eso permiteahorrarse la repeticioacuten innecesaria de caacutelculos si maacutes adelante volvemos a necesitar ese objeto Yen algunos casos como veremos maacutes adelante al hacer esto podemos acceder a propiedades delobjeto calculado que R no muestra en su respuesta por defecto

21

4 138 134 134 135 135 133 136 136 132 134 134 133 133 133 132 136 134 135 132 135 136 135 132 136 134 135 133 134 134 134 1310 136 138 134 135 137 133 135 138 136 137 135 134 137 135 136 138 137 134 133 135 135 134 131 135 137 133 133 137 136 135 135 132 138 135 135 135 136 135 133 1311 136 1310 134 131 133 138 139 135 134 1310 134 134 137 135 134 133 132 135 132 136 135 134 133 139 136 135 134 135 132 132 138 134 133 136 138 134 134 134 138 134 132 135 1310 136 1312 135 139 135 138 138 135 132 135 1310 136 135 136 135 135 137 134 133 134 133 133 134 133 133 133 133 137 138 135 134 135 134 135 137 135 133 134 134 137 133 132 135 137 135 134 136 132 135 132 136 1310 134 132 139 134 136 136 132 137 134 138 135 135 134 134 137 134 136 136 135 134 133 135 133 133 136 132 133 134 138 138 137 137 136 135 1310 134 134 134 138 136 134 136 137 135 135 136 138 134 138 134 135 137 136 134 137 137 135 137 132 136 135 133 135 136 130 133 135 135 137 134 137 131 135 136 135 138 132 134 136 139 137 1310 134 135 136 132 135 135 135 1313 133 136 133 136 135 130 1310 134 136 136 134 131 133 135 137 136 133 135 133 134 132 132 138 138 134 136 135 135 134 133 139 134 139 136 1311 133 132 132 136 138 1310 133 137 133 134 135 139 133 135 133 134 138 139 132 138 133 133 137 138 136 133 135 134 132 1311 137 137 136 134 133 135 1310 135 134 135 133 135 136 135 139 135 134 135 135 134 133 137 134 1310 135 134 132 139 134 137 133 135 134 131 136 135 136 134 138 135 135 138 138 134 132 135 133 134 138 138 135 138 132 1311 135 134 134 136 139 1310 137 134 137 132 133 135 1310 135 135 133 135 136 134 134 136 135 137 136 136 134 133 134 135 132 134 136 139 133 135 133 136 133 133 135 134 134 134 137 135 139 1310 133 134 136 131 137 138 135 133 133 135 133 133 137 136 135 135 138 134 139 136 135 135 138 134 130 133 137 133 134 1311 132 137 133 136 135 133 134 133 133 132 138 133 134 134 134 134 138 138 137 136 132 132 137 135 133 135 138 135 134 135 134 135 134 1312 133 135 133 133 133 132 134 131 139 135 135 135 138 138 135 138 133 134 133 136 136 135 134 133 133 135 133 137 135 132 133 133 132 131 132 136 137 130 136 133 134 1310 132 136 137 134 133 132 138 133 135 133 135 136 132 134 134 133 135 135 135 134 134 136 133 132 138 1310 135 135 132 132 137 136 134 135 134 134 136 134 136 135 133 137 137 136 137 134 134 137 133 130 134 136 135 137 136 136 135 137 134 134 135 136 136 135 136 132 134 133 139 135 133 137 135 136 137 136 136 136 134 135 137 137 133 134 137 137 136 133 134 137 131 135 136 133 137 133 135 133 137 138 133 137 132 135 134 133 132 135 134 134 135 133 134 139 135 134 139 137 133 132 133 134 133 134 135 135 138 134 135 134 135 139 137 133 133 132 136 132 138 135 132 137 134 135 136 132 134 135 135 133 135 136 137 135 138 132 131 137 135 135 138 134 137 136 139 1310 137 134 131 136 132 136 137 133 135 137 135 132 135 135 133 133 137 134 133 133 131 138 139 132 134 138 135 136 138 137 1310 138 133 134 134 135 134 134 135 136 135 134 134 135 133 136 135 137 132 133 139 132 133 137 136 134 137 131 135 134 132 134 138 135 134 131 132 134 135 136 133 134 138 134 132 135 134 132 134 133 136 135 138 133 139 1310 134 133 133 137 137 136 137 133 133 133 135 139 136 136 137 136 135 132 132 139 136 132 139 132 137 135 133 138 137 135 134 136 131 133 135 133 134 137 135 134 132 136 136 136 137 133 132 135 134 135 134 137 134 133 133 134 132 134 135 134 134 136 134 135 138 133 135 135 138 133 135 134 135 135 138 1311 132 134 134 136 133 135 133 136 132 131 136 134 136 132 136 136 136 136 130 136 134 134 131 138 131 1310 135 139 136 132 136 138 135 138 134 132 134 133 136 137 133 133 133 133 137 136 135 133 139 133 132 135 136 136 134 132 132 135 137 136 136 136 138 137 137 135 135 131 136 133 136 135 133 134 130 133 135 136 137 138 136 134 135 132 137 132 137 132 133 134 135 138 134 136 133 135 135 139 134 134 136 134 134 134 135 134 133 135 135 138 133 136 136 134 135 134 134 138 136 133 137 132 134 137 136 135 133 134 133 135 134 134 136 134 133 137 133 135 135 136 135 138 134 136 132 137 136 138 134 136 136 137 136 136 135 136 1310 138 133 137 135 136 137 134 136 133 134 133 132 132 134 137 132 132 133 132 138 134 134 135 135 139 135 134 132 134 135 134 139 137 133 134 134 135 133 133 137 138 135 139 133 138 136 136 134 133 136 135 1314 137 133 137 135 136 134 134 136 133 135 134 135 136 136 135 133 135 131 135 137 135 136 133 137 135 134 133 134 134 134 134 134 136 132 134 136 136 137 139 134 138 133 133 132 135 131 134 133 137 133 133 134 139 138 134 134 137 137 135 136 134 139 137 138 134 133 134 134 135 137 134 135 138 133 132 134 1310 133 135 134 132 138 137 136 135 138 1314 139 135 135 131 134 135 134 135 135 135 133 136 135 135 132 136 139 133 133 136 134 132 132 137 136 131 137 135 135 134 1313 1310 132 134 134 133 138 135 134 133 136 136 136 1310 134 137 136 138 139 137 135 134 134 137 137 138 133 134 135 137 135 136 1310 136 136 138 133 136 133 134 135 135 134 136 133 136 136 137 134 135 1316 136 136 132 136 136 133 134 133 137 134 135 134 133 138 134 1310 136 136 136 137 134 136 137 132 138 136 131 132 134 135 130 134 135 135 137 130 136 135 131 136 137 133 137 135 139 138 135 139 133 137 139 133 136 137 136 138 134 1310 136 134 133 139 136 137 133 13713

Rango maacuteximo y miacutenimo

Para empezar vamos a aprender tres nuevas funciones de R que nos permiten calcular esos tresvalores

gt (minimo = min(var3) )[1] 0gt (maximo = max(var3) )[1] 16gt (rango = range(var3) )[1] 0 16

El funcionamiento de las dos primeras es evidente La funcioacuten range devuelve un vector formadopor el maacuteximo y el miacutenimo

Tablas de frecuencia Clases de objetos en R

La tabla de frecuencia absoluta de var3 se obtiene usando la funcioacuten table de esta forma tansencilla

gt ( tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

La primera fila contiene los elementos de var3 y en la segunda aparece la frecuencia de cada unode ellos Puedes comprobar que son los mismos resultados que obtuvimos con Calc en la paacutegina10 del Tutorial01 Aunque alliacute desde luego el proceso fue maacutes laborioso

A lo mejor te has dado cuenta de que el formato de la respuesta es diferente de los que hemosobtenido hasta ahora Para empezar la respuesta no empieza con el [1] al que ya nos vamosacostumbrando El motivo de esto es que el objeto que hemos obtenido como respuesta no es unvector sino una tabla Ya dijimos que R utiliza distintos tipos de objetos con fines distintosiquestCoacutemo podemos saber de queacute clase es un objeto Pues usando una funcioacuten de R oportunamentellamada class Si la usamos con el vector var3 y con su tabla de frecuencias obtenemos

gt class(var3)[1] numericgt class(tablaFrecAbs)[1] table

El vector var3 es de clase numeric porque es un vector de nuacutemeros Y la tabla de frecuencias esde clase table Veremos a lo largo del curso otros objetos de tipo tabular como las matrices (clasematrix) los conjuntos de datos (clase dataframe) y los arraysAunque las tablas son objetos distintos de los vectores tienen algunas propiedades en comuacuten yalgunas de las funciones que hemos usado con vectores tambieacuten se pueden usar con tablas

Ejercicio 11Aplica las funciones length sum min max y range a la tabla tablaFrecAbs Solucioacuten en la paacutegina48

Siguiendo con los parecidos entre tablas y vectores puedes multiplicar (o dividir) una tabla porun nuacutemero y la operacioacuten se haraacute elemento a elemento

gt 2 tablaFrecAbsvar30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1618 50 200 376 488 492 372 262 174 86 56 12 4 4 4 2

Como ves cada frecuencia se multiplica por 2 Esta propiedad de las tablas permite obtener deforma muy sencilla la tabla de frecuencias relativa de var3 Como primer paso vamos a guardarla longitud de var3 en la variable n

22

gt ( n = length( var3 ) )[1] 1300

Y ahora podemos dividir la tabla por n para conseguir la tabla de frecuencias relativas (hemosestrechado la Consola de Comandos para que el resultado cupiera en esta paacutegina)

gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 400069230769 00192307692 00769230769 01446153846 01876923077

5 6 7 8 901892307692 01430769231 01007692308 00669230769 00330769231

10 11 12 13 1400215384615 00046153846 00015384615 00015384615 00015384615

1600007692308

Ejercicio 12Ya sabemos cuanto debe sumar esta tabla de frecuencias relativas Comprueacutebalo Solucioacuten en lapaacutegina 48

Si lo que queremos es una tabla de frecuencias acumuladas debemos emplear la funcioacuten cumsum

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Ejercicio 13La uacuteltima tabla que falta es la de frecuencias relativas acumuladas pero ya tienes todos los ingre-dientes para obtenerla de dos maneras diferentes Hazlo y comprueba si dan el mismo resultadoSi no es asiacute iquesta queacute crees que se debe y cuaacutel es la mejor opcioacuten Asigna el resultado a la variabletablaFrecRelAcu Solucioacuten en la paacutegina 49

Graacuteficos de columnas y diagramas de caja (boxplot) Argumentos con nombre

Vamos a fabricar nuestros primeros graacuteficos con R En concreto vamos a dibujar un graacutefico debarras a partir de la tabla de frecuencias de var3 usando la funcioacuten barplot de R

gt barplot(tablaFrecAbs)

Al ejecutar este comando no debes ver ninguna salida en la Consola de Comandos En su lugaren el panel inferior derecho de RStudio concretamente en la ventana Plots apareceraacute el graacuteficodeseado El resultado puede variar dependiendo de la anchura de tu ventana de RStudio

23

Hemos destacado ademaacutes en la figura los dos botones Zoom y Export que te permiten respecti-vamente ver una versioacuten ampliada de la Figura (que se redimensiona dinaacutemicamente si cambiasla ventana) y guardar esa figura como un fichero de graacuteficos que puedes insertar en cualquierdocumento editar con un programa de manipulacioacuten de graacuteficos etceacuteteraLos graacuteficos de R se pueden controlar hasta en sus detalles maacutes miacutenimos Como aperitivo miacutenimovamos a antildeadir algo de color al graacutefico

gt barplot(tablaFrecAbs col = heatcolors(15))

El resultado es esta figura

Las posibilidades de control de los graacuteficos de R son como decimos inmensas y pueden llegar aser abrumadoras Hay libros de cientos de paacuteginas dedicados a este tema como el R GraphicsCookbook de W Chang (ver las referencias del curso) Nosotros a lo largo de los tutoriales delcurso vamos a aprender algo maacutes aunque a penas nos podremos limitar a rozar la superficie delo que se puede llegar a hacerEn la Seccioacuten 231 del libro hemos descrito los diagramas de cajas o boxplots (recuerda la Figura22 de la paacuteg 36 del libro) Y en el Tutorial-01 dijimos que con Calc no es faacutecil dibujar ese tipode diagramas En cambio con R no podriacutea ser maacutes faacutecil

gt boxplot(var3)

Y el resultado es esta figura

24

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

a lt- 2

el resultado seraacute el mismo que antes con = Las dos notaciones tienen ventajas e inconvenientes peronosotros preferimos = porque se parece maacutes a lo que se utiliza en muchos lenguajes de programacioacuten

Coacutemo ver los resultados de un caacutelculo a la vez que lo hacemos

Ya habraacutes notado que al hacer una asignacioacuten R no produce ninguna respuesta y se limita aguardar el valor en la variable En una asignacioacuten como a=2 esto no genera ninguna duda Perosi el miembro derecho de la asignacioacuten es una expresioacuten maacutes complicada puede ser convenientepedirle a R que nos muestre el resultado de esa expresioacuten a la vez que se hace la asignacioacutenImagiacutenate por ejemplo esta situacioacuten

b = 2c = -2d = -4a = b c^2 d + 3

iquestCuaacutel es el valor que se asigna a la variable a Una forma de averiguarlo es simplemente ejecutaruna liacutenea adicional en la que aparece soacutelo el nombre de la variable que queremos inspeccionar Alejecutar esta sentencia R nos devuelve como respuesta

gt a[1] 1

Pero hay otra manera de conseguir que R nos muestre el resultado de la asignacioacuten que es maacutesinteresante porque produce coacutedigo maacutes simple Basta con encerrar toda la asignacioacuten entre pareacuten-tesis El resultado es

gt ( a = b c^2 d + 3 )[1] 1

como antes Este ejemplo es desde luego bastante artificial Te recordamos en cualquier caso laconveniencia de utilizar pareacutentesis para hacer maacutes legibles las expresiones y evitar posibles erroresPero a la vez la posibilidad de comprobar el resultado de las asignaciones aumenta la fiabilidaddel coacutedigo que escribimos

Nombres de las variables

Aunque hasta ahora hemos usado letras como nombres de las variables puedes utilizar nombresmaacutes descriptivos Y muchas veces es una buena idea hacerlo Por ejemplo puede que hace unasemana hayas escrito estas instrucciones para resolver un problema

a = 2b = 3c = a b

Pero si las vuelves a ver pasada una semana es posible que no recuerdes queacute era lo que estabastratando de conseguir al hacer esto En cambio al ver estas instrucciones

espacio = 2tiempo = 3velocidad = espacio tiempo

es mucho maacutes faacutecil reconocer el objetivo que persiguen A lo largo de los tutoriales del curso vamos ainsistir muchas veces en la necesidad de que el coacutedigo esteacute bien organizado y esteacute bien documentadoUn primer paso en esa direccioacuten es tratar de elegir nombres descriptivos para las variables En Rlas reglas para los nombres de variables son muy flexibles esencialmente que empiecen por unaletra y no contengan espacios ni caracteres especiales como + pareacutentesis etceacutetera Pero cuidadocon los excesos Es cierto que puedes usar nombres de variables arbitrariamente largos Pero si usascomo nombre

Estavariablealmacenaelresultadodelaoperaciontaninteresantequeacabamosdehacer

tu trabajo resultaraacute ilegible Como siempre se necesita un equilibrio y con la praacutectica encontraraacutesel tuyo (consejo zen gratuito del tutorial de hoy) Para empezar es una buena idea combinarmayuacutesculas y minuacutesculas en los nombres de las variables Si vas a usar una variable para representarla temperatura final de un proceso el nombre temperaturafinalproceso es menos legible y maacuteslargo que tempFinal Es mucho maacutes faacutecil por otra parte que te equivoques tecleando el primerode esos nombres

10

22 VectoresEn Estadiacutestica lo habitual es trabajar con colecciones o muestras de datos Y para almacenar esascolecciones de datos la estructura maacutes baacutesica de R son los vectores En este apartado vamos aempezar nuestro trabajo con ellos aunque a lo largo del curso auacuten tendremos ocasioacuten de aprenderbastante maacutes sobre el manejo de los vectores de RPara empezar vamos a trabajar con vectores que contienen una coleccioacuten de nuacutemeros que puedenser las edades de los alumnos de una clase

22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19

En R las listas de nuacutemeros como esta se almacenan en vectores El vector que corresponde a esasedades se construye en R mediante un comando como este

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19)

En realidad en esa expresioacuten hemos hecho dos cosas

1 Hemos creado el vector con los datos en la parte derecha de la expresioacuten

c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19)

Los datos estaacuten separados por comas y rodeados por pareacutentesis Hasta aquiacute todo es bastantetiacutepico pero fiacutejate especialmente en la letra c que precede al primer pareacutentesis Esa letra ces el nombre de una nueva funcioacuten de R y es la forma maacutes sencilla que existe en R paracrear un vector de datos Podriacutea pensarse que la c es de crear pero en realidad proviene deconcatenar Enseguida entenderemos porque es asiacute

2 Una vez creado el vector lo hemos asignado a la variable edades Hasta ahora soacutelo habiacuteamosusado variables para identificar un uacutenico valor (un nuacutemero o una cadena alfanumeacuterica)Pero una variable puede usarse para identificar un vector o como veremos maacutes adelanteestructuras mucho maacutes complejas

Una observacioacuten maacutes los vectores de R se usan para almacenar valores de una variable Y enparticular todos los datos de un vector son del mismo tipo de variable No se puede mezclar en unvector nuacutemeros y cadenas alfanumeacutericas (aparentemente R te dejaraacute hacerlo pero internamentehabraacute convertido todos los nuacutemeros en cadenas alfanumeacutericas)

Manos a la obra Prueba a copiar el comando anterior en tu Consola de comandos (puedes usarcopiar y pegar desde este fichero) y ejecuacutetalo Si las cosas van bien no esperes ninguna respuestacomo ya hemos dicho R no te muestra el resultado de las asignaciones Recuerda que si quieresver el resultado de una asignacioacuten puedes rodear toda liacutenea con pareacutentesis como en

(edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19))

Otra opcioacuten naturalmente es preguntarle a R por el valor de edades despueacutes de la asignacioacutenEscribe simplemente edades en la Consola de Comandos y ejecuacutetalo Veraacutes de nuevo el contenidode esa variable

Vamos a hacer algunas operaciones con este vector Imagiacutenate que como sucede a menudo despueacutesde haber creado nuestra lista de edades de alumnos desde la administracioacuten nos avisan de que haycinco alumnos nuevos recieacuten matriculados y debemos incorporar sus edades que son

22 18 20 21 20

a nuestro vector de datos Naturalmente podemos empezar de nuevo pero es preferible reutilizarel vector edades que ya habiacuteamos creado Vamos a ver esto como primer ejemplo para empezar aaprender coacutemo se manipulan vectores en R Una forma de antildeadir los datos es empezar creando unnuevo vector (con la funcioacuten c de R)

(edades2 = c(22 18 20 21 20))

Y a continuacioacuten concatenamos los vectores usando de nuevo la misma funcioacuten c de una maneradistinta

(edades = c( edades edades2))

11

Hemos rodeado toda la liacutenea con pareacutentesis para ver el resultado y poder observar coacutemo hacambiado el vector edadesVamos a analizar paso a paso lo que ha ocurrido

La instruccioacuten c( edades edades2) toma los datos contenidos en edades y edades2 y losconcatena en ese orden para fabricar un nuevo vector que todaviacutea no estaacute guardado enninguna variable

La asignacioacuten edades = c( edades edades2) toma ese vector y lo guarda en la propiavariable edades Al hacer esto como era de esperar el anterior vector edades es reemplazadocon la nueva lista y su contenido anterior se pierde (cuidado con esto las reasignaciones sonuna de las formas habituales de cometer errores)

El nombre de la funcioacuten c proviene en realidad de concatenate concatenar en ingleacutesLa siguiente figura resume lo que hemos venido haciendo con estos datos

Los nuacutemeros entre corchetes al principio de cada fila como el [1] y el [16] de este ejemploson soacutelo ayudas para que podamos localizar los elementos del vector En mi pantalla la primerafila muestra los primeros 15 nuacutemeros del vector Pero en la tuya si la ventana de RStudio es dedistinta anchura los nuacutemeros entre corchetes pueden ser distintos Hasta ahora soacutelo habiacuteamos vistoejemplos con [1] que es lo que sucede cuando la respuesta es un vector que cabe en una uacutenicaliacutenea

3 Ficheros csv con REn esta seccioacuten vamos a aprender a utilizar ficheros csv con R En el Tutorial-01 hemos vistoalgunos ejemplos de ese tipo de ficheros y el manejo baacutesico con una hoja de caacutelculo como CalcComo vimos alliacute un fichero csv tiacutepico contiene una tabla de datos con varias columnas Esaestructura de tabla se haraacute imprescindible maacutes adelante Pero durante una buena parte del cursonosotros nos vamos a limitar a problemas en los que interviene una uacutenica variable En tal casopara almacenar los datos de esa variable nos podemos a limitar a considerar un tipo de ficheroscsv muy baacutesico como el fichero adjunto

Guaacuterdalo en la subcarpeta datos de tu directorio de trabajo (el que contiene este pdf) Si lo abrescon un editor de texto (como el Bloc de Notas en Windows) veraacutes como muestra esta figura

12

61371381381381391391351381371381371371361361371351381391341371351371371351391341371371371381351381391371341361361361391381361371361371361361381361351351361361381351381351391371361391351371381381371310137138137135136138138137133135136137135137137135138134138138138136137136136138135136135138136139137

que el fichero contiene soacutelo una columna de datos que en este ejemplo corresponde a valores deuna variable cuantitativa discreta En la figura soacutelo se muestra una parte de los datos

Ejercicio 3iquestCuaacutentos datos hay en ese vector Usa Calc para averiguarlo pronto aprenderemos a hacerlo conR Solucioacuten en la paacutegina 47

Queremos utilizar esos datos en R y para eso vamos a (1) leerlos desde el fichero y (2)guardarlos enun vector El resultado seraacute como si nosotros hubieacuteramos creado ese vector tecleaacutendo sus elementosdirectamentePara el primer paso (la lectura del fichero csv) vamos a tener que empezar por explicarle a R(usando RStudio como intermediario) donde estaacute el fichero que contiene esos datos Cuando tra-bajamos con ficheros R utiliza un directorio de nuestro ordenador como directorio de trabajo Acontinuacioacuten vamos a aprender a elegir un directorio de trabajo Puedes usar cualquier carpeta yen lo que sigue vamos a suponer que hemos elegido el Escritorio Lo maacutes importante es que esacarpeta debe contener a su vez una subcarpeta llamada datos Y aseguacuterate de que los ficheroscsv que vas a usar estaacuten almacenados en esa subcarpeta llamada datos

Usamos el menuacute Session rarr Set Working Directory rarr Choose Directory

Se abre un cuadro de diaacutelogo del sistema y navegamos hasta la carpeta que contiene el ficherocsv que en mi caso es el Escritorio Cuando selecciono el Escritorio veo aparecer en la Consolade Comandos de R un comando que RStudio ha escrito y ejecutado por nosotros

13

setwd(CUsersFernandoDesktop)

Este es el resultado en mi ordenador (de ahiacute el nombre de usuario) usando Windows 10 Enversiones maacutes antiguas de Windows o en una maacutequina con Linux o un Mac el comando seraacuteligeramente distinto Cuando tengamos maacutes praacutectica aprenderemos otras formas de seleccionar eldirectorio de trabajo o incluso de utilizar ficheros situados fuera de ese directorio de trabajo Peropor el momento resulta maacutes coacutemodo dejar que RStudio haga ese trabajo para nosotrosAhora R ya sabe doacutende estaacute el fichero que nos interesa pero todaviacutea no sabe cual es Para ello vamosa utilizar la funcioacuten readtable de R Aunque esta funcioacuten tiene muchas opciones disponiblesnuestro primer uso de ella seraacute bastante sencillo Copia y ejecuta el siguiente coacutedigo en RStudio

(vectorEdades = readtable(datosTut02-Edadescsvheader = FALSE)[1])

En esta instruccioacuten le decimos a R que use la funcioacuten readtable para leer el contenido del ficheroTut02-Edadescsv y que almacene lo que ha leiacutedo en un vector que hemos decidido llamarvectorEdades Y aunque no es necesario entender en detalle el funcionamiento de readtable eneste momento vamos a explicar un poco maacutes lo que hemos hecho A medida que el curso avanceiraacutes teniendo maacutes ocasiones de practicar esto e iraacute quedando cada vez maacutes claroLa opcioacuten header = FALSE sirver para indicarle a R que la tabla almacenada en el fichero no tieneuna liacutenea de cabecera (en ingleacutes header) que cuando existe suele contener los nombres de lasvariables de la tabla Ademaacutes la funcioacuten readtable sirve para leer tablas con varias columnasobteniendo como resultado un objeto de R de tipo dataframe Pero nuestro primer ejemplo esmuy sencillo y la tabla soacutelo tiene una columna Asiacute que usamos la notacioacuten [1] para indicarle aR que soacutelo queremos la primera columna de esa tabla considerada como un vectorAl ejecutar esa orden habraacutes obtenido una respuesta como esta

gt gt (vectorEdades = readtable(datosTut02-Edadescsv header = FALSE)[1])[1] 6 7 8 8 8 9 9 5 8 7 8 7 7 6 6 7 5 8 9 4 7 5 7[24] 7 5 9 4 7 7 7 8 5 8 9 7 4 6 6 6 9 8 6 7 6 7 6[47] 6 8 6 5 5 6 6 8 5 8 5 9 7 6 9 5 7 8 8 7 10 7 8[70] 7 5 6 8 8 7 3 5 6 7 5 7 7 5 8 4 8 8 8 6 7 6 6[93] 8 5 6 5 8 6 9 7

Como hemos dicho antes los nuacutemeros entre corchetes al principio de cada fila que en mi casoson [1] [24] [47] [70] y [93] son soacutelo ayudas para que podamos localizar los elementos delvector En mi pantalla cada primera fila muestra 23 nuacutemeros del vector Pero en la tuya si laventana de RStudio es de distinta anchura los nuacutemeros entre corchetes pueden ser distintos

En cualquier caso ahora el vector vectorEdades contiene la informacioacuten del fichero csv con el quehemos empezado En la Seccioacuten 4 vamos a empezar a hacer Estadiacutestica Descriptiva Pero antes tepedimos un poco maacutes de paciencia porque vamos a entretenernos un poco maacutes en los detalles delmanejo de ficheros csv con R No pretendemos ser exhaustivos ni mucho menos pero siacute queremosaprender lo suficiente como para evitarnos los problemas maacutes habituales en los casos maacutes sencillosPara cerrar este apartado es conveniente haber visto el error que se produce cuando el fichero quetratamos de leer desde R no existe o no estaacute en el directorio de trabajo

Ejercicio 4Prueba a ejecutar

errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)

y fiacutejate en el mensaje de error Solucioacuten en la paacutegina 47

Otra variante del fichero de entrada

Los ficheros csv que contienen un uacutenico vector (en lugar de una tabla de datos) pueden adoptarformatos distintos del que acabamos de ver Por ejemplo el fichero adjunto

contiene los mismos datos que Tut02-Edadescsv pero ahora los datos del vector estaacuten todos enuna fila y separados por comas Guaacuterdalo como antes en la subcarpeta datos El aspecto delfichero visto a traveacutes de un editor de texto es este (soacutelo son visibles una parte de los datos)

14

67888995878776675894757759477785897466698676766865566858597695788710787568873567577584888676685658697

Desde luego no nos podemos plantear transformar a mano este vector en uno como el anteriorLa solucioacuten que te proponemos pasa por la hoja de caacutelculo y la opcioacuten de trasponer una tablaque hemos visto en el Tutorial-00 lo leeriacuteamos en una fila de la hoja y luego habriacutea que usar elPegado especial para trasponerlo -es decir girarlo- para finalmente volver a guardarlo Alterna-tivamente hay otras soluciones sin salir de R usando una funcioacuten llamada scan o usando de nuevoreadtable y trasponiendo la tabla dentro de R Esos meacutetodos son sencillos cuando se aprendeun poco maacutes sobre R pero por el momento y para los ejemplos sencillos que encontraremos nosvamos a conformar con ese enfoque baacutesico que usa la hoja de Caacutelculo si es necesario

31 Coacutemo obtener ayuda y usar el tabulador en RStudioVamos a aprovechar estos ejemplos de lectura de ficheros csv para aprender a obtener ayuda sobrelas funciones de R La mayoriacutea de las funciones de R como la funcioacuten readtable o la funcioacutenscan que hemos mencionado al final del anterior apartado tienen muchos argumentos opcionalesY hay muchiacutesimas funciones en R (cada vez maacutes porque como veremos maacutes adelante usuarios detodo el mundo antildeaden constantemente funciones nuevas a R cuando las necesitan) No es posiblerecordar todos esas funciones cada una con sus opciones asiacute que es muy importante aprender aobtener esa informacioacuten cuando la necesitamosPara ver como obtener esa informacioacuten en RStudio vamos a usar por ejemplo la funcioacuten scanSituacuteate en una liacutenea vaciacutea de la Consola de Comandos escribe scan y a continuacioacuten mientras elcursor parpadea junto a la n final de scan pulsa la tecla del tabulador (si esto no funciona usa latecla F1 y mira el panel ayuda de RStudio) Veraacutes aparecer una ventana emergente con informacioacutensobre la funcioacuten scan como en esta figura

15

Como ves se muestra un resumen sobre la funcioacuten scan que a veces seraacute suficiente Si necesitasmaacutes detalles haz caso a la indicacioacuten que aparece al final de esa ventana y pulsa la tecla F1 Alhacerlo veraacutes que en el panel inferior derecho de RStudio aparece el fichero de ayuda de la funcioacutenscan como en esta figura

Esos ficheros de ayuda son muy uacutetiles aunque al principio pueden resultar un poco intimidatoriosya sea por un exceso de informacioacuten ya sea porque se da por supuesto que el usuario ya entiendealgunos conceptos baacutesicos de R Podemos garantizar al lector que a medida que se progresa en Rla utilidad de estos ficheros aumentaPero la utilidad de la tecla tabulador en RStudio no se acaba ahiacute Supongamos que quieres aplicarreadtable para leer el fichero Tut02-Edadescsv Pero te da pereza escribir un nombre tan largoo no recuerdas exactamente el nombre o dudas entre dos nombres no importa cual sea el motivoEmpiezas a escribir la orden tecleas

(vectorEdades2 = readtable(datos

y de nuevo justo en este punto pulsas el tabulador Entonces RStudio te ofrece en una nuevaventana emergente todos los ficheros disponibles en la carpeta datos

Y ahora puedes usar esa lista seleccionar el fichero que quieras utilizar Puedes tambieacuten teclearalguna letra maacutes del nombre para acotar auacuten maacutes la buacutesqueda cuando la carpeta contiene muchosficherosEn general la idea es que en RStudio el tabulador es tu amigo Como tendremos ocasioacuten decomprobar RStudio nos ofrece bastante ayuda para hacer maacutes coacutemodo nuestro trabajo con R yel tabulador es una de las herramientas maacutes versaacutetiles y uacutetiles

16

32 El camino contrario escribir un vector a un fichero de tipo csvHemos aprendido a leer con R vectores de datos a partir de ficheros de tipo csv Pero muchasveces despueacutes de hacer operaciones en R obtendremos como resultados nuevos vectores (y maacutesadelante en el curso otro tipo de objetos) Lo natural entonces es aprender a guardar ese vectoren un fichero de tipo csv como el fichero con el que empezamos De esa forma por ejemplo puedescompartir tus resultados con otras personas que utilicen programas distintos de R Para ello siantes usaacutebamos la funcioacuten readtable ahora vamos a usar la funcioacuten writetable de R

Como ejemplo vamos a utilizar este vector de nuacutemeros enteros

29 17 63 31 55 9 92 61 10 16 63 6 61 59 66 41 68 6 99 21 87 68 52 83 66 98 45 5024 100 83 37 44 4 97 67 56 74 75 71 55 22 86 22 93 65 38 84 54 83 100 71 99 1963 11 11 62 91 20 79 42 59 95 70 74 8 25 45 58 57 75 81 34 70 68 39 12 14 21

Ejercicio 5Usa copiar y pegar a partir de este documento pdf para crear un vector de R llamado muestraque contenga esos datos

Para guardar ese vector muestra en un fichero csv (dentro de la subcarpeta datos del directoriode trabajo) podemos utilizar la funcioacuten writetable usando como argumentos

El nombre del vector que queremos guardar que es muestra

Y el nombre del fichero en el que lo guardamos Vamos llamarlo por ejemplo Tut02-muestracsvLe indicamos a R ademaacutes que lo ponga en la subcarpeta datos

La opcioacuten colnames = FALSE o colnames = TRUE para decidir si queremos que R incluyauna liacutenea de cabecera con el nombre de la variable que en este caso es muestra (y que novamos a incluir)

La opcioacuten rownames = FALSE para evitar que R incluya nuacutemeros de fila en el fichero desalida (normalmente no querremos esos nuacutemeros)

Es decir que ejecutamos

writetable(muestrafile = datosTut02-muestracsv colnames=FALSE rownames=FALSE)

Al ejecutar esa orden el fichero que obtenemos tiene la forma deseada (de nuevo soacutelo es visible elcomienzo del fichero)

17

Puedes probar a abrirlo en Calc para ver que es un fichero de datos como los que hemos visto hastaahora

Naturalmente apenas hemos rozado el tema de la entradasalida de datos en R Pero con lo quehemos aprendido en este apartado estamos listos para empezar a hacer Estadiacutestica Descriptivausando ejemplos que no sean demasiado triviales

4 Estadiacutestica descriptiva de una variable cuantitativa condatos no agrupados

Para seguir adelante tenemos que empezar por aprender un poco maacutes sobre la forma en la que Rpermite operar con los vectores Vamos a hacerlo a traveacutes de una serie de ejercicios-ejemplos

Ejercicio 6

1 Vamos a definir dos vectores cada uno de ellos con 12 nuacutemeros enteros El primero al quellamaremos vector1 estaacute formado por

8 5 19 9 17 2 28 18 3 4 19 1

Usa copiar y pegar a partir de este fichero pdf para definir el vector1 en R

2 El segundo vector al que en un rapto de originalidad llamaremos vector2 estaacute almacenadoen el fichero

Guaacuterdalo en datos y examiacutenalo primero con un editor de texto (como el Bloc de Notas)para ver coacutemo estaacuten almacenados los datos en ese fichero Una vez hecho esto usa Calc yla funcioacuten readtable para almacenar el contenido de ese fichero csv en el vector2 de REn alguacuten momento del proceso puede que tengas que usar el pegado especial de Calc paratrasponer los datos

Solucioacuten en la paacutegina 47

41 Aritmeacutetica vectorial en RAhora vamos a sumar los dos vectores Ejecuta el comando

vector1 + vector2

para comprobar que el resultado es la suma componente a componente de los dos vectores

gt vector1 + vector2[1] 26 23 39 21 37 3 58 24 29 24 34 26

Este resultado es bastante previsible Lo que quizaacute resulteacute un poco maacutes inesperado es que simultiplicas los dos vectores tambieacuten se obtienen los productos componente a componente el primerelemento de vector1 se multiplica por el primero de vector2 el segundo por el segundo etc

gt vector1 vector2[1] 144 90 380 108 340 2 840 108 78 80 285 25

Esta forma de operar de R como veremos pronto es muy uacutetil Si lo piensas un momento cadavector numeacuterico de R se corresponde con una columna de una hoja de caacutelculo como las queusaacutebamos en el Tutorial01 Alliacute vimos que para algunas operaciones era necesario multiplicar doscolumnas elemento a elemento En Calc esa operacioacuten no es complicada pero en R es auacuten maacutes faacutecilBasta con un comando como vector1 vector2 para conseguir el objetivo Veremos muchos maacutesejemplos a lo largo del curso en los que una operacioacuten que en Calc requeririacutea bastantes pasosen R se reduce a ejecutar un uacutenico comandoEn R las operaciones con vectores siguen en general este esquema de funcionamiento componentea componente Si por ejemplo ejecutas

18

1818201220130626201525

gt vector1 + 5[1] 13 10 24 14 22 7 33 23 8 9 24 6gt 2 vector1[1] 16 10 38 18 34 4 56 36 6 8 38 2

veraacutes que en el primer caso cada uno de los elementos de vector1 se ha incrementado en 5mientras que en el segundo caso cada uno se ha multiplicado por 2 Sucede lo mismo con otrasoperaciones como elevar al cuadrado

gt vector1^2[1] 64 25 361 81 289 4 784 324 9 16 361 1

Y podemos aplicar funciones en un solo paso Por ejemplo podemos calcular el logaritmo neperianode todos los elementos de un vector en un soacutelo paso

gt log(vector1)[1] 20794415 16094379 29444390 21972246 28332133 06931472[7] 33322045 28903718 10986123 13862944 29444390 00000000

Los resultados de todas estas operaciones son de nuevo vectores Y por tanto se pueden asignara nuevas variables para utilizarlos en nuestras operaciones Por ejemplo si luego vas a necesitar loslogaritmos de vector1 puedes definir una variable para identificar ese vector llamada logVector1(e el nombre que tuacute quieras) haciendo

gt logVector1 = log(vector1)

Recuerda que si ademaacutes de la asignacioacuten quieres ver el resultado puedes rodear toda esta senten-cia con pareacutentesis De lo contrario R la ejecuta pero no imprime ninguna respuesta como ya sabes

Aunque al principio puede parecer complicado cuando te acostumbres a esta forma de trabajarcon vectores veraacutes que resulta muy coacutemoda y eficiente

Generando vectores de nuacutemeros enteros consecutivos

Hay muchas ocasiones en que para alguna operacioacuten necesitamos un vector que contenga losnuacutemeros enteros consecutivos del 1 al n o del 0 al n etc En R esto es muy faacutecil de hacer Porejemplo para conseguir un vector con los nuacutemeros del 1 al 15 basta con ejecutar

gt 115[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Esa notacioacuten con los dos puntos permite generar vectores en los que cada elemento es igual alanterior maacutes 1 Otro ejemplo

gt -713[1] -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13

O incluso cuando los puntos de partida no son enteros

gt 1575[1] 15 25 35 45 55 65 75gt 1574[1] 15 25 35 45 55 65

iquestVes la diferencia entre estos dos casos

Es muy posible que te esteacutes preguntando iquesty si quiero ir avanzando de 2 en 2 o quiero ir hacia atraacutes(ldquoavanzandordquo de minus2 en minus2 por ejemplo) Pronto cuando hayamos aprendido un poco maacutes volve-remos sobre esto y comprobaremos que R nos ofrece un cataacutelogo de herramientas extremadamentepotentes para fabricar vectores de acuerdo con nuestros deseos y necesidadesLos vectores fabricados con este meacutetodo son vectores iguales que los demaacutes y se pueden asignar avariables operar con ellos etc

19

Ejercicio 7

1 Fabrica un vector con los cuadrados de los nuacutemeros del 1 al 10 y asiacutegnalo a la variablecuadrados Usa los pareacutentesis para ver el resultado de la asignacioacuten

2 Haz lo mismo con los cuadrados de los nuacutemeros del 2 al 11 y un vector cuadrados2

3 Resta los vectores cuadrados2 - cuadrados iquestObservas algo interesante

Solucioacuten en la paacutegina 47

Funciones vectoriales

Hemos visto antes que se puede aplicar una funcioacuten como la raiacutez cuadrada a un vector y seobtiene como resultado otro vector con las raiacuteces cuadradas elemento a elemento Pero hay otrotipo de funciones que permiten hacer caacutelculos con el vector en conjunto Por ejemplo antes hemosfabricado el vector -713 y la funcioacuten length nos dice cuantos elementos tiene ese vector

gt length(-713)[1] 21

En el Ejercicio 3 (paacuteg 13) nos preguntaacutebamos cuantos elementos teniacutea el vector vectorEdades quehabiacuteamos cargado desde el fichero csv Puedes obtener la respuesta con length(vectorEdades)Para comprobarlo aseguacuterate de que has creado el vector llamado vectorEdades y ejecuta estaorden

gt length(vectorEdades)[1] 100

Como ves el resultado de length es el esperado

Vamos a conocer otra funcioacuten llamada sum que sirve para calcular la suma de todos los elementosde un vector

gt sum(vectorEdades)[1] 675

Ejercicio 8iquestCuaacutento vale la suma de los cuadrados de los nuacutemeros del 1 al 100 Solucioacuten en la paacutegina 47

A lo mejor te ha pasado desapercibido pero con las funciones length y sum estamos por fin encondiciones de empezar a hacer Estadiacutestica Descriptiva Por ejemplo podemos calcular la mediaaritmeacutetica de vectorEdades

gt ( mediaEdades = sum(vectorEdades) length(vectorEdades) )[1] 675

Y una vez que tenemos la media podemos calcular la varianza poblacional Para que resulte maacutesclaro vamos a mostrarte el proceso paso a paso aunque al final lo ejecutaremos en un soacutelo paso

1 Empezamos restando la media que estaacute en la variable mediaEdades de cada uno de loselementos de vectorEdades

vectorEdades - mediaEdades

El resultado es un vector de diferencias

2 Ahora elevamos cada una de esas diferencias al cuadrado

( vectorEdades - mediaEdades )^2

El resultado de este paso es de nuevo un vector ahora con las diferencias al cuadrado Fiacutejateen el pareacutentesis para garantizar que elevamos al cuadrado la diferencia Si no incluyeacuteramosel pareacutentesis iquestqueacute calculariacuteamos

20

3 A continuacioacuten sumamos todas esas diferencias al cuadrado usando la funcioacuten sum

sum( ( vectorEdades - mediaEdades )^2)

De nuevo el pareacutentesis es fundamental para que el cuadrado del vector de diferencias secalcule antes que la suma En este paso el resultado ya no es un vector sino un nuacutemero

4 Por uacuteltimo dividimos esa suma por n el nuacutemero de elementos de vectorEdades que seobtiene con la funcioacuten length

sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades)

El resultado de estos pasos se puede condensar en un soacutelo comando de R en el que a la vezcalculamos la varianza y la asignamos a una variable

gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades) )[1] 19875

Ejercicio 9

1 Calcula la desviacioacuten tiacutepica (poblacional) de vectorEdades

2 Calcula la cuasivarianza y cuasidesviacioacuten tiacutepica (muestrales) de vectorEdades

3 iquestQueacute sucede si en el tercer paso ejecutas el siguiente comandosum( vectorEdades - mediaEdades )^2iquestPor queacute sucede esto

Solucioacuten en la paacutegina 48

Con estos caacutelculos hemos empezado a hacer Estadiacutestica con R Naturalmente nos queda muchiacutesimoque aprender sobre los vectores de R Por ejemplo como se accede a una componente individualdel vector para responder a preguntas como ldquoiquestCuaacutento vale el quinto elemento del vectorrdquo Maacutesen general aprenderemos a extraer aquellos elementos del vector que cumplan alguna condicioacutenrespondiendo a preguntas como ldquoiquestQueacute elementos del vector son mayores que 7rdquo

42 Y por fin hagamos Estadiacutestica DescriptivaEn esta seccioacuten vamos a trabajar con un vector de datos contenido en este fichero adjunto

Este vector contiene los datos de la variable var3 del fichero Tut01-PracticaConCalccsv queya hemos utilizado en el Tutorial-00 para aprender a hacer Estadiacutestica Descriptiva con Calc Enesta seccioacuten vamos a reproducir los resultados que obtuvimos alliacute pero esta vez usando R Parapreparar el terreno vamos a hacer limpieza

Ejercicio 10

1 Cierra Rstudio y vuelve a abrirlo para limpiar la memora del sistema El trabajo que hemoshecho hasta ahora se perderaacute (aunque los comandos siguen en el Historial de Comandos queya vimos)

2 Establece el Directorio de Trabajo (por ejemplo el Escritorio) y aseguacuterate de que Tut02-var3csvestaacute guardado en la subcarpeta datos de ese directorio

3 Carga de nuevo el contenido de ese fichero en un vector var3 de R

Solucioacuten en la paacutegina 48

Veraacutes en lo que sigue que siempre que calculamos un objeto le asignamos una variable Eso permiteahorrarse la repeticioacuten innecesaria de caacutelculos si maacutes adelante volvemos a necesitar ese objeto Yen algunos casos como veremos maacutes adelante al hacer esto podemos acceder a propiedades delobjeto calculado que R no muestra en su respuesta por defecto

21

4 138 134 134 135 135 133 136 136 132 134 134 133 133 133 132 136 134 135 132 135 136 135 132 136 134 135 133 134 134 134 1310 136 138 134 135 137 133 135 138 136 137 135 134 137 135 136 138 137 134 133 135 135 134 131 135 137 133 133 137 136 135 135 132 138 135 135 135 136 135 133 1311 136 1310 134 131 133 138 139 135 134 1310 134 134 137 135 134 133 132 135 132 136 135 134 133 139 136 135 134 135 132 132 138 134 133 136 138 134 134 134 138 134 132 135 1310 136 1312 135 139 135 138 138 135 132 135 1310 136 135 136 135 135 137 134 133 134 133 133 134 133 133 133 133 137 138 135 134 135 134 135 137 135 133 134 134 137 133 132 135 137 135 134 136 132 135 132 136 1310 134 132 139 134 136 136 132 137 134 138 135 135 134 134 137 134 136 136 135 134 133 135 133 133 136 132 133 134 138 138 137 137 136 135 1310 134 134 134 138 136 134 136 137 135 135 136 138 134 138 134 135 137 136 134 137 137 135 137 132 136 135 133 135 136 130 133 135 135 137 134 137 131 135 136 135 138 132 134 136 139 137 1310 134 135 136 132 135 135 135 1313 133 136 133 136 135 130 1310 134 136 136 134 131 133 135 137 136 133 135 133 134 132 132 138 138 134 136 135 135 134 133 139 134 139 136 1311 133 132 132 136 138 1310 133 137 133 134 135 139 133 135 133 134 138 139 132 138 133 133 137 138 136 133 135 134 132 1311 137 137 136 134 133 135 1310 135 134 135 133 135 136 135 139 135 134 135 135 134 133 137 134 1310 135 134 132 139 134 137 133 135 134 131 136 135 136 134 138 135 135 138 138 134 132 135 133 134 138 138 135 138 132 1311 135 134 134 136 139 1310 137 134 137 132 133 135 1310 135 135 133 135 136 134 134 136 135 137 136 136 134 133 134 135 132 134 136 139 133 135 133 136 133 133 135 134 134 134 137 135 139 1310 133 134 136 131 137 138 135 133 133 135 133 133 137 136 135 135 138 134 139 136 135 135 138 134 130 133 137 133 134 1311 132 137 133 136 135 133 134 133 133 132 138 133 134 134 134 134 138 138 137 136 132 132 137 135 133 135 138 135 134 135 134 135 134 1312 133 135 133 133 133 132 134 131 139 135 135 135 138 138 135 138 133 134 133 136 136 135 134 133 133 135 133 137 135 132 133 133 132 131 132 136 137 130 136 133 134 1310 132 136 137 134 133 132 138 133 135 133 135 136 132 134 134 133 135 135 135 134 134 136 133 132 138 1310 135 135 132 132 137 136 134 135 134 134 136 134 136 135 133 137 137 136 137 134 134 137 133 130 134 136 135 137 136 136 135 137 134 134 135 136 136 135 136 132 134 133 139 135 133 137 135 136 137 136 136 136 134 135 137 137 133 134 137 137 136 133 134 137 131 135 136 133 137 133 135 133 137 138 133 137 132 135 134 133 132 135 134 134 135 133 134 139 135 134 139 137 133 132 133 134 133 134 135 135 138 134 135 134 135 139 137 133 133 132 136 132 138 135 132 137 134 135 136 132 134 135 135 133 135 136 137 135 138 132 131 137 135 135 138 134 137 136 139 1310 137 134 131 136 132 136 137 133 135 137 135 132 135 135 133 133 137 134 133 133 131 138 139 132 134 138 135 136 138 137 1310 138 133 134 134 135 134 134 135 136 135 134 134 135 133 136 135 137 132 133 139 132 133 137 136 134 137 131 135 134 132 134 138 135 134 131 132 134 135 136 133 134 138 134 132 135 134 132 134 133 136 135 138 133 139 1310 134 133 133 137 137 136 137 133 133 133 135 139 136 136 137 136 135 132 132 139 136 132 139 132 137 135 133 138 137 135 134 136 131 133 135 133 134 137 135 134 132 136 136 136 137 133 132 135 134 135 134 137 134 133 133 134 132 134 135 134 134 136 134 135 138 133 135 135 138 133 135 134 135 135 138 1311 132 134 134 136 133 135 133 136 132 131 136 134 136 132 136 136 136 136 130 136 134 134 131 138 131 1310 135 139 136 132 136 138 135 138 134 132 134 133 136 137 133 133 133 133 137 136 135 133 139 133 132 135 136 136 134 132 132 135 137 136 136 136 138 137 137 135 135 131 136 133 136 135 133 134 130 133 135 136 137 138 136 134 135 132 137 132 137 132 133 134 135 138 134 136 133 135 135 139 134 134 136 134 134 134 135 134 133 135 135 138 133 136 136 134 135 134 134 138 136 133 137 132 134 137 136 135 133 134 133 135 134 134 136 134 133 137 133 135 135 136 135 138 134 136 132 137 136 138 134 136 136 137 136 136 135 136 1310 138 133 137 135 136 137 134 136 133 134 133 132 132 134 137 132 132 133 132 138 134 134 135 135 139 135 134 132 134 135 134 139 137 133 134 134 135 133 133 137 138 135 139 133 138 136 136 134 133 136 135 1314 137 133 137 135 136 134 134 136 133 135 134 135 136 136 135 133 135 131 135 137 135 136 133 137 135 134 133 134 134 134 134 134 136 132 134 136 136 137 139 134 138 133 133 132 135 131 134 133 137 133 133 134 139 138 134 134 137 137 135 136 134 139 137 138 134 133 134 134 135 137 134 135 138 133 132 134 1310 133 135 134 132 138 137 136 135 138 1314 139 135 135 131 134 135 134 135 135 135 133 136 135 135 132 136 139 133 133 136 134 132 132 137 136 131 137 135 135 134 1313 1310 132 134 134 133 138 135 134 133 136 136 136 1310 134 137 136 138 139 137 135 134 134 137 137 138 133 134 135 137 135 136 1310 136 136 138 133 136 133 134 135 135 134 136 133 136 136 137 134 135 1316 136 136 132 136 136 133 134 133 137 134 135 134 133 138 134 1310 136 136 136 137 134 136 137 132 138 136 131 132 134 135 130 134 135 135 137 130 136 135 131 136 137 133 137 135 139 138 135 139 133 137 139 133 136 137 136 138 134 1310 136 134 133 139 136 137 133 13713

Rango maacuteximo y miacutenimo

Para empezar vamos a aprender tres nuevas funciones de R que nos permiten calcular esos tresvalores

gt (minimo = min(var3) )[1] 0gt (maximo = max(var3) )[1] 16gt (rango = range(var3) )[1] 0 16

El funcionamiento de las dos primeras es evidente La funcioacuten range devuelve un vector formadopor el maacuteximo y el miacutenimo

Tablas de frecuencia Clases de objetos en R

La tabla de frecuencia absoluta de var3 se obtiene usando la funcioacuten table de esta forma tansencilla

gt ( tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

La primera fila contiene los elementos de var3 y en la segunda aparece la frecuencia de cada unode ellos Puedes comprobar que son los mismos resultados que obtuvimos con Calc en la paacutegina10 del Tutorial01 Aunque alliacute desde luego el proceso fue maacutes laborioso

A lo mejor te has dado cuenta de que el formato de la respuesta es diferente de los que hemosobtenido hasta ahora Para empezar la respuesta no empieza con el [1] al que ya nos vamosacostumbrando El motivo de esto es que el objeto que hemos obtenido como respuesta no es unvector sino una tabla Ya dijimos que R utiliza distintos tipos de objetos con fines distintosiquestCoacutemo podemos saber de queacute clase es un objeto Pues usando una funcioacuten de R oportunamentellamada class Si la usamos con el vector var3 y con su tabla de frecuencias obtenemos

gt class(var3)[1] numericgt class(tablaFrecAbs)[1] table

El vector var3 es de clase numeric porque es un vector de nuacutemeros Y la tabla de frecuencias esde clase table Veremos a lo largo del curso otros objetos de tipo tabular como las matrices (clasematrix) los conjuntos de datos (clase dataframe) y los arraysAunque las tablas son objetos distintos de los vectores tienen algunas propiedades en comuacuten yalgunas de las funciones que hemos usado con vectores tambieacuten se pueden usar con tablas

Ejercicio 11Aplica las funciones length sum min max y range a la tabla tablaFrecAbs Solucioacuten en la paacutegina48

Siguiendo con los parecidos entre tablas y vectores puedes multiplicar (o dividir) una tabla porun nuacutemero y la operacioacuten se haraacute elemento a elemento

gt 2 tablaFrecAbsvar30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1618 50 200 376 488 492 372 262 174 86 56 12 4 4 4 2

Como ves cada frecuencia se multiplica por 2 Esta propiedad de las tablas permite obtener deforma muy sencilla la tabla de frecuencias relativa de var3 Como primer paso vamos a guardarla longitud de var3 en la variable n

22

gt ( n = length( var3 ) )[1] 1300

Y ahora podemos dividir la tabla por n para conseguir la tabla de frecuencias relativas (hemosestrechado la Consola de Comandos para que el resultado cupiera en esta paacutegina)

gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 400069230769 00192307692 00769230769 01446153846 01876923077

5 6 7 8 901892307692 01430769231 01007692308 00669230769 00330769231

10 11 12 13 1400215384615 00046153846 00015384615 00015384615 00015384615

1600007692308

Ejercicio 12Ya sabemos cuanto debe sumar esta tabla de frecuencias relativas Comprueacutebalo Solucioacuten en lapaacutegina 48

Si lo que queremos es una tabla de frecuencias acumuladas debemos emplear la funcioacuten cumsum

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Ejercicio 13La uacuteltima tabla que falta es la de frecuencias relativas acumuladas pero ya tienes todos los ingre-dientes para obtenerla de dos maneras diferentes Hazlo y comprueba si dan el mismo resultadoSi no es asiacute iquesta queacute crees que se debe y cuaacutel es la mejor opcioacuten Asigna el resultado a la variabletablaFrecRelAcu Solucioacuten en la paacutegina 49

Graacuteficos de columnas y diagramas de caja (boxplot) Argumentos con nombre

Vamos a fabricar nuestros primeros graacuteficos con R En concreto vamos a dibujar un graacutefico debarras a partir de la tabla de frecuencias de var3 usando la funcioacuten barplot de R

gt barplot(tablaFrecAbs)

Al ejecutar este comando no debes ver ninguna salida en la Consola de Comandos En su lugaren el panel inferior derecho de RStudio concretamente en la ventana Plots apareceraacute el graacuteficodeseado El resultado puede variar dependiendo de la anchura de tu ventana de RStudio

23

Hemos destacado ademaacutes en la figura los dos botones Zoom y Export que te permiten respecti-vamente ver una versioacuten ampliada de la Figura (que se redimensiona dinaacutemicamente si cambiasla ventana) y guardar esa figura como un fichero de graacuteficos que puedes insertar en cualquierdocumento editar con un programa de manipulacioacuten de graacuteficos etceacuteteraLos graacuteficos de R se pueden controlar hasta en sus detalles maacutes miacutenimos Como aperitivo miacutenimovamos a antildeadir algo de color al graacutefico

gt barplot(tablaFrecAbs col = heatcolors(15))

El resultado es esta figura

Las posibilidades de control de los graacuteficos de R son como decimos inmensas y pueden llegar aser abrumadoras Hay libros de cientos de paacuteginas dedicados a este tema como el R GraphicsCookbook de W Chang (ver las referencias del curso) Nosotros a lo largo de los tutoriales delcurso vamos a aprender algo maacutes aunque a penas nos podremos limitar a rozar la superficie delo que se puede llegar a hacerEn la Seccioacuten 231 del libro hemos descrito los diagramas de cajas o boxplots (recuerda la Figura22 de la paacuteg 36 del libro) Y en el Tutorial-01 dijimos que con Calc no es faacutecil dibujar ese tipode diagramas En cambio con R no podriacutea ser maacutes faacutecil

gt boxplot(var3)

Y el resultado es esta figura

24

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

22 VectoresEn Estadiacutestica lo habitual es trabajar con colecciones o muestras de datos Y para almacenar esascolecciones de datos la estructura maacutes baacutesica de R son los vectores En este apartado vamos aempezar nuestro trabajo con ellos aunque a lo largo del curso auacuten tendremos ocasioacuten de aprenderbastante maacutes sobre el manejo de los vectores de RPara empezar vamos a trabajar con vectores que contienen una coleccioacuten de nuacutemeros que puedenser las edades de los alumnos de una clase

22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19

En R las listas de nuacutemeros como esta se almacenan en vectores El vector que corresponde a esasedades se construye en R mediante un comando como este

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19)

En realidad en esa expresioacuten hemos hecho dos cosas

1 Hemos creado el vector con los datos en la parte derecha de la expresioacuten

c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19)

Los datos estaacuten separados por comas y rodeados por pareacutentesis Hasta aquiacute todo es bastantetiacutepico pero fiacutejate especialmente en la letra c que precede al primer pareacutentesis Esa letra ces el nombre de una nueva funcioacuten de R y es la forma maacutes sencilla que existe en R paracrear un vector de datos Podriacutea pensarse que la c es de crear pero en realidad proviene deconcatenar Enseguida entenderemos porque es asiacute

2 Una vez creado el vector lo hemos asignado a la variable edades Hasta ahora soacutelo habiacuteamosusado variables para identificar un uacutenico valor (un nuacutemero o una cadena alfanumeacuterica)Pero una variable puede usarse para identificar un vector o como veremos maacutes adelanteestructuras mucho maacutes complejas

Una observacioacuten maacutes los vectores de R se usan para almacenar valores de una variable Y enparticular todos los datos de un vector son del mismo tipo de variable No se puede mezclar en unvector nuacutemeros y cadenas alfanumeacutericas (aparentemente R te dejaraacute hacerlo pero internamentehabraacute convertido todos los nuacutemeros en cadenas alfanumeacutericas)

Manos a la obra Prueba a copiar el comando anterior en tu Consola de comandos (puedes usarcopiar y pegar desde este fichero) y ejecuacutetalo Si las cosas van bien no esperes ninguna respuestacomo ya hemos dicho R no te muestra el resultado de las asignaciones Recuerda que si quieresver el resultado de una asignacioacuten puedes rodear toda liacutenea con pareacutentesis como en

(edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 18 22 20 19))

Otra opcioacuten naturalmente es preguntarle a R por el valor de edades despueacutes de la asignacioacutenEscribe simplemente edades en la Consola de Comandos y ejecuacutetalo Veraacutes de nuevo el contenidode esa variable

Vamos a hacer algunas operaciones con este vector Imagiacutenate que como sucede a menudo despueacutesde haber creado nuestra lista de edades de alumnos desde la administracioacuten nos avisan de que haycinco alumnos nuevos recieacuten matriculados y debemos incorporar sus edades que son

22 18 20 21 20

a nuestro vector de datos Naturalmente podemos empezar de nuevo pero es preferible reutilizarel vector edades que ya habiacuteamos creado Vamos a ver esto como primer ejemplo para empezar aaprender coacutemo se manipulan vectores en R Una forma de antildeadir los datos es empezar creando unnuevo vector (con la funcioacuten c de R)

(edades2 = c(22 18 20 21 20))

Y a continuacioacuten concatenamos los vectores usando de nuevo la misma funcioacuten c de una maneradistinta

(edades = c( edades edades2))

11

Hemos rodeado toda la liacutenea con pareacutentesis para ver el resultado y poder observar coacutemo hacambiado el vector edadesVamos a analizar paso a paso lo que ha ocurrido

La instruccioacuten c( edades edades2) toma los datos contenidos en edades y edades2 y losconcatena en ese orden para fabricar un nuevo vector que todaviacutea no estaacute guardado enninguna variable

La asignacioacuten edades = c( edades edades2) toma ese vector y lo guarda en la propiavariable edades Al hacer esto como era de esperar el anterior vector edades es reemplazadocon la nueva lista y su contenido anterior se pierde (cuidado con esto las reasignaciones sonuna de las formas habituales de cometer errores)

El nombre de la funcioacuten c proviene en realidad de concatenate concatenar en ingleacutesLa siguiente figura resume lo que hemos venido haciendo con estos datos

Los nuacutemeros entre corchetes al principio de cada fila como el [1] y el [16] de este ejemploson soacutelo ayudas para que podamos localizar los elementos del vector En mi pantalla la primerafila muestra los primeros 15 nuacutemeros del vector Pero en la tuya si la ventana de RStudio es dedistinta anchura los nuacutemeros entre corchetes pueden ser distintos Hasta ahora soacutelo habiacuteamos vistoejemplos con [1] que es lo que sucede cuando la respuesta es un vector que cabe en una uacutenicaliacutenea

3 Ficheros csv con REn esta seccioacuten vamos a aprender a utilizar ficheros csv con R En el Tutorial-01 hemos vistoalgunos ejemplos de ese tipo de ficheros y el manejo baacutesico con una hoja de caacutelculo como CalcComo vimos alliacute un fichero csv tiacutepico contiene una tabla de datos con varias columnas Esaestructura de tabla se haraacute imprescindible maacutes adelante Pero durante una buena parte del cursonosotros nos vamos a limitar a problemas en los que interviene una uacutenica variable En tal casopara almacenar los datos de esa variable nos podemos a limitar a considerar un tipo de ficheroscsv muy baacutesico como el fichero adjunto

Guaacuterdalo en la subcarpeta datos de tu directorio de trabajo (el que contiene este pdf) Si lo abrescon un editor de texto (como el Bloc de Notas en Windows) veraacutes como muestra esta figura

12

61371381381381391391351381371381371371361361371351381391341371351371371351391341371371371381351381391371341361361361391381361371361371361361381361351351361361381351381351391371361391351371381381371310137138137135136138138137133135136137135137137135138134138138138136137136136138135136135138136139137

que el fichero contiene soacutelo una columna de datos que en este ejemplo corresponde a valores deuna variable cuantitativa discreta En la figura soacutelo se muestra una parte de los datos

Ejercicio 3iquestCuaacutentos datos hay en ese vector Usa Calc para averiguarlo pronto aprenderemos a hacerlo conR Solucioacuten en la paacutegina 47

Queremos utilizar esos datos en R y para eso vamos a (1) leerlos desde el fichero y (2)guardarlos enun vector El resultado seraacute como si nosotros hubieacuteramos creado ese vector tecleaacutendo sus elementosdirectamentePara el primer paso (la lectura del fichero csv) vamos a tener que empezar por explicarle a R(usando RStudio como intermediario) donde estaacute el fichero que contiene esos datos Cuando tra-bajamos con ficheros R utiliza un directorio de nuestro ordenador como directorio de trabajo Acontinuacioacuten vamos a aprender a elegir un directorio de trabajo Puedes usar cualquier carpeta yen lo que sigue vamos a suponer que hemos elegido el Escritorio Lo maacutes importante es que esacarpeta debe contener a su vez una subcarpeta llamada datos Y aseguacuterate de que los ficheroscsv que vas a usar estaacuten almacenados en esa subcarpeta llamada datos

Usamos el menuacute Session rarr Set Working Directory rarr Choose Directory

Se abre un cuadro de diaacutelogo del sistema y navegamos hasta la carpeta que contiene el ficherocsv que en mi caso es el Escritorio Cuando selecciono el Escritorio veo aparecer en la Consolade Comandos de R un comando que RStudio ha escrito y ejecutado por nosotros

13

setwd(CUsersFernandoDesktop)

Este es el resultado en mi ordenador (de ahiacute el nombre de usuario) usando Windows 10 Enversiones maacutes antiguas de Windows o en una maacutequina con Linux o un Mac el comando seraacuteligeramente distinto Cuando tengamos maacutes praacutectica aprenderemos otras formas de seleccionar eldirectorio de trabajo o incluso de utilizar ficheros situados fuera de ese directorio de trabajo Peropor el momento resulta maacutes coacutemodo dejar que RStudio haga ese trabajo para nosotrosAhora R ya sabe doacutende estaacute el fichero que nos interesa pero todaviacutea no sabe cual es Para ello vamosa utilizar la funcioacuten readtable de R Aunque esta funcioacuten tiene muchas opciones disponiblesnuestro primer uso de ella seraacute bastante sencillo Copia y ejecuta el siguiente coacutedigo en RStudio

(vectorEdades = readtable(datosTut02-Edadescsvheader = FALSE)[1])

En esta instruccioacuten le decimos a R que use la funcioacuten readtable para leer el contenido del ficheroTut02-Edadescsv y que almacene lo que ha leiacutedo en un vector que hemos decidido llamarvectorEdades Y aunque no es necesario entender en detalle el funcionamiento de readtable eneste momento vamos a explicar un poco maacutes lo que hemos hecho A medida que el curso avanceiraacutes teniendo maacutes ocasiones de practicar esto e iraacute quedando cada vez maacutes claroLa opcioacuten header = FALSE sirver para indicarle a R que la tabla almacenada en el fichero no tieneuna liacutenea de cabecera (en ingleacutes header) que cuando existe suele contener los nombres de lasvariables de la tabla Ademaacutes la funcioacuten readtable sirve para leer tablas con varias columnasobteniendo como resultado un objeto de R de tipo dataframe Pero nuestro primer ejemplo esmuy sencillo y la tabla soacutelo tiene una columna Asiacute que usamos la notacioacuten [1] para indicarle aR que soacutelo queremos la primera columna de esa tabla considerada como un vectorAl ejecutar esa orden habraacutes obtenido una respuesta como esta

gt gt (vectorEdades = readtable(datosTut02-Edadescsv header = FALSE)[1])[1] 6 7 8 8 8 9 9 5 8 7 8 7 7 6 6 7 5 8 9 4 7 5 7[24] 7 5 9 4 7 7 7 8 5 8 9 7 4 6 6 6 9 8 6 7 6 7 6[47] 6 8 6 5 5 6 6 8 5 8 5 9 7 6 9 5 7 8 8 7 10 7 8[70] 7 5 6 8 8 7 3 5 6 7 5 7 7 5 8 4 8 8 8 6 7 6 6[93] 8 5 6 5 8 6 9 7

Como hemos dicho antes los nuacutemeros entre corchetes al principio de cada fila que en mi casoson [1] [24] [47] [70] y [93] son soacutelo ayudas para que podamos localizar los elementos delvector En mi pantalla cada primera fila muestra 23 nuacutemeros del vector Pero en la tuya si laventana de RStudio es de distinta anchura los nuacutemeros entre corchetes pueden ser distintos

En cualquier caso ahora el vector vectorEdades contiene la informacioacuten del fichero csv con el quehemos empezado En la Seccioacuten 4 vamos a empezar a hacer Estadiacutestica Descriptiva Pero antes tepedimos un poco maacutes de paciencia porque vamos a entretenernos un poco maacutes en los detalles delmanejo de ficheros csv con R No pretendemos ser exhaustivos ni mucho menos pero siacute queremosaprender lo suficiente como para evitarnos los problemas maacutes habituales en los casos maacutes sencillosPara cerrar este apartado es conveniente haber visto el error que se produce cuando el fichero quetratamos de leer desde R no existe o no estaacute en el directorio de trabajo

Ejercicio 4Prueba a ejecutar

errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)

y fiacutejate en el mensaje de error Solucioacuten en la paacutegina 47

Otra variante del fichero de entrada

Los ficheros csv que contienen un uacutenico vector (en lugar de una tabla de datos) pueden adoptarformatos distintos del que acabamos de ver Por ejemplo el fichero adjunto

contiene los mismos datos que Tut02-Edadescsv pero ahora los datos del vector estaacuten todos enuna fila y separados por comas Guaacuterdalo como antes en la subcarpeta datos El aspecto delfichero visto a traveacutes de un editor de texto es este (soacutelo son visibles una parte de los datos)

14

67888995878776675894757759477785897466698676766865566858597695788710787568873567577584888676685658697

Desde luego no nos podemos plantear transformar a mano este vector en uno como el anteriorLa solucioacuten que te proponemos pasa por la hoja de caacutelculo y la opcioacuten de trasponer una tablaque hemos visto en el Tutorial-00 lo leeriacuteamos en una fila de la hoja y luego habriacutea que usar elPegado especial para trasponerlo -es decir girarlo- para finalmente volver a guardarlo Alterna-tivamente hay otras soluciones sin salir de R usando una funcioacuten llamada scan o usando de nuevoreadtable y trasponiendo la tabla dentro de R Esos meacutetodos son sencillos cuando se aprendeun poco maacutes sobre R pero por el momento y para los ejemplos sencillos que encontraremos nosvamos a conformar con ese enfoque baacutesico que usa la hoja de Caacutelculo si es necesario

31 Coacutemo obtener ayuda y usar el tabulador en RStudioVamos a aprovechar estos ejemplos de lectura de ficheros csv para aprender a obtener ayuda sobrelas funciones de R La mayoriacutea de las funciones de R como la funcioacuten readtable o la funcioacutenscan que hemos mencionado al final del anterior apartado tienen muchos argumentos opcionalesY hay muchiacutesimas funciones en R (cada vez maacutes porque como veremos maacutes adelante usuarios detodo el mundo antildeaden constantemente funciones nuevas a R cuando las necesitan) No es posiblerecordar todos esas funciones cada una con sus opciones asiacute que es muy importante aprender aobtener esa informacioacuten cuando la necesitamosPara ver como obtener esa informacioacuten en RStudio vamos a usar por ejemplo la funcioacuten scanSituacuteate en una liacutenea vaciacutea de la Consola de Comandos escribe scan y a continuacioacuten mientras elcursor parpadea junto a la n final de scan pulsa la tecla del tabulador (si esto no funciona usa latecla F1 y mira el panel ayuda de RStudio) Veraacutes aparecer una ventana emergente con informacioacutensobre la funcioacuten scan como en esta figura

15

Como ves se muestra un resumen sobre la funcioacuten scan que a veces seraacute suficiente Si necesitasmaacutes detalles haz caso a la indicacioacuten que aparece al final de esa ventana y pulsa la tecla F1 Alhacerlo veraacutes que en el panel inferior derecho de RStudio aparece el fichero de ayuda de la funcioacutenscan como en esta figura

Esos ficheros de ayuda son muy uacutetiles aunque al principio pueden resultar un poco intimidatoriosya sea por un exceso de informacioacuten ya sea porque se da por supuesto que el usuario ya entiendealgunos conceptos baacutesicos de R Podemos garantizar al lector que a medida que se progresa en Rla utilidad de estos ficheros aumentaPero la utilidad de la tecla tabulador en RStudio no se acaba ahiacute Supongamos que quieres aplicarreadtable para leer el fichero Tut02-Edadescsv Pero te da pereza escribir un nombre tan largoo no recuerdas exactamente el nombre o dudas entre dos nombres no importa cual sea el motivoEmpiezas a escribir la orden tecleas

(vectorEdades2 = readtable(datos

y de nuevo justo en este punto pulsas el tabulador Entonces RStudio te ofrece en una nuevaventana emergente todos los ficheros disponibles en la carpeta datos

Y ahora puedes usar esa lista seleccionar el fichero que quieras utilizar Puedes tambieacuten teclearalguna letra maacutes del nombre para acotar auacuten maacutes la buacutesqueda cuando la carpeta contiene muchosficherosEn general la idea es que en RStudio el tabulador es tu amigo Como tendremos ocasioacuten decomprobar RStudio nos ofrece bastante ayuda para hacer maacutes coacutemodo nuestro trabajo con R yel tabulador es una de las herramientas maacutes versaacutetiles y uacutetiles

16

32 El camino contrario escribir un vector a un fichero de tipo csvHemos aprendido a leer con R vectores de datos a partir de ficheros de tipo csv Pero muchasveces despueacutes de hacer operaciones en R obtendremos como resultados nuevos vectores (y maacutesadelante en el curso otro tipo de objetos) Lo natural entonces es aprender a guardar ese vectoren un fichero de tipo csv como el fichero con el que empezamos De esa forma por ejemplo puedescompartir tus resultados con otras personas que utilicen programas distintos de R Para ello siantes usaacutebamos la funcioacuten readtable ahora vamos a usar la funcioacuten writetable de R

Como ejemplo vamos a utilizar este vector de nuacutemeros enteros

29 17 63 31 55 9 92 61 10 16 63 6 61 59 66 41 68 6 99 21 87 68 52 83 66 98 45 5024 100 83 37 44 4 97 67 56 74 75 71 55 22 86 22 93 65 38 84 54 83 100 71 99 1963 11 11 62 91 20 79 42 59 95 70 74 8 25 45 58 57 75 81 34 70 68 39 12 14 21

Ejercicio 5Usa copiar y pegar a partir de este documento pdf para crear un vector de R llamado muestraque contenga esos datos

Para guardar ese vector muestra en un fichero csv (dentro de la subcarpeta datos del directoriode trabajo) podemos utilizar la funcioacuten writetable usando como argumentos

El nombre del vector que queremos guardar que es muestra

Y el nombre del fichero en el que lo guardamos Vamos llamarlo por ejemplo Tut02-muestracsvLe indicamos a R ademaacutes que lo ponga en la subcarpeta datos

La opcioacuten colnames = FALSE o colnames = TRUE para decidir si queremos que R incluyauna liacutenea de cabecera con el nombre de la variable que en este caso es muestra (y que novamos a incluir)

La opcioacuten rownames = FALSE para evitar que R incluya nuacutemeros de fila en el fichero desalida (normalmente no querremos esos nuacutemeros)

Es decir que ejecutamos

writetable(muestrafile = datosTut02-muestracsv colnames=FALSE rownames=FALSE)

Al ejecutar esa orden el fichero que obtenemos tiene la forma deseada (de nuevo soacutelo es visible elcomienzo del fichero)

17

Puedes probar a abrirlo en Calc para ver que es un fichero de datos como los que hemos visto hastaahora

Naturalmente apenas hemos rozado el tema de la entradasalida de datos en R Pero con lo quehemos aprendido en este apartado estamos listos para empezar a hacer Estadiacutestica Descriptivausando ejemplos que no sean demasiado triviales

4 Estadiacutestica descriptiva de una variable cuantitativa condatos no agrupados

Para seguir adelante tenemos que empezar por aprender un poco maacutes sobre la forma en la que Rpermite operar con los vectores Vamos a hacerlo a traveacutes de una serie de ejercicios-ejemplos

Ejercicio 6

1 Vamos a definir dos vectores cada uno de ellos con 12 nuacutemeros enteros El primero al quellamaremos vector1 estaacute formado por

8 5 19 9 17 2 28 18 3 4 19 1

Usa copiar y pegar a partir de este fichero pdf para definir el vector1 en R

2 El segundo vector al que en un rapto de originalidad llamaremos vector2 estaacute almacenadoen el fichero

Guaacuterdalo en datos y examiacutenalo primero con un editor de texto (como el Bloc de Notas)para ver coacutemo estaacuten almacenados los datos en ese fichero Una vez hecho esto usa Calc yla funcioacuten readtable para almacenar el contenido de ese fichero csv en el vector2 de REn alguacuten momento del proceso puede que tengas que usar el pegado especial de Calc paratrasponer los datos

Solucioacuten en la paacutegina 47

41 Aritmeacutetica vectorial en RAhora vamos a sumar los dos vectores Ejecuta el comando

vector1 + vector2

para comprobar que el resultado es la suma componente a componente de los dos vectores

gt vector1 + vector2[1] 26 23 39 21 37 3 58 24 29 24 34 26

Este resultado es bastante previsible Lo que quizaacute resulteacute un poco maacutes inesperado es que simultiplicas los dos vectores tambieacuten se obtienen los productos componente a componente el primerelemento de vector1 se multiplica por el primero de vector2 el segundo por el segundo etc

gt vector1 vector2[1] 144 90 380 108 340 2 840 108 78 80 285 25

Esta forma de operar de R como veremos pronto es muy uacutetil Si lo piensas un momento cadavector numeacuterico de R se corresponde con una columna de una hoja de caacutelculo como las queusaacutebamos en el Tutorial01 Alliacute vimos que para algunas operaciones era necesario multiplicar doscolumnas elemento a elemento En Calc esa operacioacuten no es complicada pero en R es auacuten maacutes faacutecilBasta con un comando como vector1 vector2 para conseguir el objetivo Veremos muchos maacutesejemplos a lo largo del curso en los que una operacioacuten que en Calc requeririacutea bastantes pasosen R se reduce a ejecutar un uacutenico comandoEn R las operaciones con vectores siguen en general este esquema de funcionamiento componentea componente Si por ejemplo ejecutas

18

1818201220130626201525

gt vector1 + 5[1] 13 10 24 14 22 7 33 23 8 9 24 6gt 2 vector1[1] 16 10 38 18 34 4 56 36 6 8 38 2

veraacutes que en el primer caso cada uno de los elementos de vector1 se ha incrementado en 5mientras que en el segundo caso cada uno se ha multiplicado por 2 Sucede lo mismo con otrasoperaciones como elevar al cuadrado

gt vector1^2[1] 64 25 361 81 289 4 784 324 9 16 361 1

Y podemos aplicar funciones en un solo paso Por ejemplo podemos calcular el logaritmo neperianode todos los elementos de un vector en un soacutelo paso

gt log(vector1)[1] 20794415 16094379 29444390 21972246 28332133 06931472[7] 33322045 28903718 10986123 13862944 29444390 00000000

Los resultados de todas estas operaciones son de nuevo vectores Y por tanto se pueden asignara nuevas variables para utilizarlos en nuestras operaciones Por ejemplo si luego vas a necesitar loslogaritmos de vector1 puedes definir una variable para identificar ese vector llamada logVector1(e el nombre que tuacute quieras) haciendo

gt logVector1 = log(vector1)

Recuerda que si ademaacutes de la asignacioacuten quieres ver el resultado puedes rodear toda esta senten-cia con pareacutentesis De lo contrario R la ejecuta pero no imprime ninguna respuesta como ya sabes

Aunque al principio puede parecer complicado cuando te acostumbres a esta forma de trabajarcon vectores veraacutes que resulta muy coacutemoda y eficiente

Generando vectores de nuacutemeros enteros consecutivos

Hay muchas ocasiones en que para alguna operacioacuten necesitamos un vector que contenga losnuacutemeros enteros consecutivos del 1 al n o del 0 al n etc En R esto es muy faacutecil de hacer Porejemplo para conseguir un vector con los nuacutemeros del 1 al 15 basta con ejecutar

gt 115[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Esa notacioacuten con los dos puntos permite generar vectores en los que cada elemento es igual alanterior maacutes 1 Otro ejemplo

gt -713[1] -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13

O incluso cuando los puntos de partida no son enteros

gt 1575[1] 15 25 35 45 55 65 75gt 1574[1] 15 25 35 45 55 65

iquestVes la diferencia entre estos dos casos

Es muy posible que te esteacutes preguntando iquesty si quiero ir avanzando de 2 en 2 o quiero ir hacia atraacutes(ldquoavanzandordquo de minus2 en minus2 por ejemplo) Pronto cuando hayamos aprendido un poco maacutes volve-remos sobre esto y comprobaremos que R nos ofrece un cataacutelogo de herramientas extremadamentepotentes para fabricar vectores de acuerdo con nuestros deseos y necesidadesLos vectores fabricados con este meacutetodo son vectores iguales que los demaacutes y se pueden asignar avariables operar con ellos etc

19

Ejercicio 7

1 Fabrica un vector con los cuadrados de los nuacutemeros del 1 al 10 y asiacutegnalo a la variablecuadrados Usa los pareacutentesis para ver el resultado de la asignacioacuten

2 Haz lo mismo con los cuadrados de los nuacutemeros del 2 al 11 y un vector cuadrados2

3 Resta los vectores cuadrados2 - cuadrados iquestObservas algo interesante

Solucioacuten en la paacutegina 47

Funciones vectoriales

Hemos visto antes que se puede aplicar una funcioacuten como la raiacutez cuadrada a un vector y seobtiene como resultado otro vector con las raiacuteces cuadradas elemento a elemento Pero hay otrotipo de funciones que permiten hacer caacutelculos con el vector en conjunto Por ejemplo antes hemosfabricado el vector -713 y la funcioacuten length nos dice cuantos elementos tiene ese vector

gt length(-713)[1] 21

En el Ejercicio 3 (paacuteg 13) nos preguntaacutebamos cuantos elementos teniacutea el vector vectorEdades quehabiacuteamos cargado desde el fichero csv Puedes obtener la respuesta con length(vectorEdades)Para comprobarlo aseguacuterate de que has creado el vector llamado vectorEdades y ejecuta estaorden

gt length(vectorEdades)[1] 100

Como ves el resultado de length es el esperado

Vamos a conocer otra funcioacuten llamada sum que sirve para calcular la suma de todos los elementosde un vector

gt sum(vectorEdades)[1] 675

Ejercicio 8iquestCuaacutento vale la suma de los cuadrados de los nuacutemeros del 1 al 100 Solucioacuten en la paacutegina 47

A lo mejor te ha pasado desapercibido pero con las funciones length y sum estamos por fin encondiciones de empezar a hacer Estadiacutestica Descriptiva Por ejemplo podemos calcular la mediaaritmeacutetica de vectorEdades

gt ( mediaEdades = sum(vectorEdades) length(vectorEdades) )[1] 675

Y una vez que tenemos la media podemos calcular la varianza poblacional Para que resulte maacutesclaro vamos a mostrarte el proceso paso a paso aunque al final lo ejecutaremos en un soacutelo paso

1 Empezamos restando la media que estaacute en la variable mediaEdades de cada uno de loselementos de vectorEdades

vectorEdades - mediaEdades

El resultado es un vector de diferencias

2 Ahora elevamos cada una de esas diferencias al cuadrado

( vectorEdades - mediaEdades )^2

El resultado de este paso es de nuevo un vector ahora con las diferencias al cuadrado Fiacutejateen el pareacutentesis para garantizar que elevamos al cuadrado la diferencia Si no incluyeacuteramosel pareacutentesis iquestqueacute calculariacuteamos

20

3 A continuacioacuten sumamos todas esas diferencias al cuadrado usando la funcioacuten sum

sum( ( vectorEdades - mediaEdades )^2)

De nuevo el pareacutentesis es fundamental para que el cuadrado del vector de diferencias secalcule antes que la suma En este paso el resultado ya no es un vector sino un nuacutemero

4 Por uacuteltimo dividimos esa suma por n el nuacutemero de elementos de vectorEdades que seobtiene con la funcioacuten length

sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades)

El resultado de estos pasos se puede condensar en un soacutelo comando de R en el que a la vezcalculamos la varianza y la asignamos a una variable

gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades) )[1] 19875

Ejercicio 9

1 Calcula la desviacioacuten tiacutepica (poblacional) de vectorEdades

2 Calcula la cuasivarianza y cuasidesviacioacuten tiacutepica (muestrales) de vectorEdades

3 iquestQueacute sucede si en el tercer paso ejecutas el siguiente comandosum( vectorEdades - mediaEdades )^2iquestPor queacute sucede esto

Solucioacuten en la paacutegina 48

Con estos caacutelculos hemos empezado a hacer Estadiacutestica con R Naturalmente nos queda muchiacutesimoque aprender sobre los vectores de R Por ejemplo como se accede a una componente individualdel vector para responder a preguntas como ldquoiquestCuaacutento vale el quinto elemento del vectorrdquo Maacutesen general aprenderemos a extraer aquellos elementos del vector que cumplan alguna condicioacutenrespondiendo a preguntas como ldquoiquestQueacute elementos del vector son mayores que 7rdquo

42 Y por fin hagamos Estadiacutestica DescriptivaEn esta seccioacuten vamos a trabajar con un vector de datos contenido en este fichero adjunto

Este vector contiene los datos de la variable var3 del fichero Tut01-PracticaConCalccsv queya hemos utilizado en el Tutorial-00 para aprender a hacer Estadiacutestica Descriptiva con Calc Enesta seccioacuten vamos a reproducir los resultados que obtuvimos alliacute pero esta vez usando R Parapreparar el terreno vamos a hacer limpieza

Ejercicio 10

1 Cierra Rstudio y vuelve a abrirlo para limpiar la memora del sistema El trabajo que hemoshecho hasta ahora se perderaacute (aunque los comandos siguen en el Historial de Comandos queya vimos)

2 Establece el Directorio de Trabajo (por ejemplo el Escritorio) y aseguacuterate de que Tut02-var3csvestaacute guardado en la subcarpeta datos de ese directorio

3 Carga de nuevo el contenido de ese fichero en un vector var3 de R

Solucioacuten en la paacutegina 48

Veraacutes en lo que sigue que siempre que calculamos un objeto le asignamos una variable Eso permiteahorrarse la repeticioacuten innecesaria de caacutelculos si maacutes adelante volvemos a necesitar ese objeto Yen algunos casos como veremos maacutes adelante al hacer esto podemos acceder a propiedades delobjeto calculado que R no muestra en su respuesta por defecto

21

4 138 134 134 135 135 133 136 136 132 134 134 133 133 133 132 136 134 135 132 135 136 135 132 136 134 135 133 134 134 134 1310 136 138 134 135 137 133 135 138 136 137 135 134 137 135 136 138 137 134 133 135 135 134 131 135 137 133 133 137 136 135 135 132 138 135 135 135 136 135 133 1311 136 1310 134 131 133 138 139 135 134 1310 134 134 137 135 134 133 132 135 132 136 135 134 133 139 136 135 134 135 132 132 138 134 133 136 138 134 134 134 138 134 132 135 1310 136 1312 135 139 135 138 138 135 132 135 1310 136 135 136 135 135 137 134 133 134 133 133 134 133 133 133 133 137 138 135 134 135 134 135 137 135 133 134 134 137 133 132 135 137 135 134 136 132 135 132 136 1310 134 132 139 134 136 136 132 137 134 138 135 135 134 134 137 134 136 136 135 134 133 135 133 133 136 132 133 134 138 138 137 137 136 135 1310 134 134 134 138 136 134 136 137 135 135 136 138 134 138 134 135 137 136 134 137 137 135 137 132 136 135 133 135 136 130 133 135 135 137 134 137 131 135 136 135 138 132 134 136 139 137 1310 134 135 136 132 135 135 135 1313 133 136 133 136 135 130 1310 134 136 136 134 131 133 135 137 136 133 135 133 134 132 132 138 138 134 136 135 135 134 133 139 134 139 136 1311 133 132 132 136 138 1310 133 137 133 134 135 139 133 135 133 134 138 139 132 138 133 133 137 138 136 133 135 134 132 1311 137 137 136 134 133 135 1310 135 134 135 133 135 136 135 139 135 134 135 135 134 133 137 134 1310 135 134 132 139 134 137 133 135 134 131 136 135 136 134 138 135 135 138 138 134 132 135 133 134 138 138 135 138 132 1311 135 134 134 136 139 1310 137 134 137 132 133 135 1310 135 135 133 135 136 134 134 136 135 137 136 136 134 133 134 135 132 134 136 139 133 135 133 136 133 133 135 134 134 134 137 135 139 1310 133 134 136 131 137 138 135 133 133 135 133 133 137 136 135 135 138 134 139 136 135 135 138 134 130 133 137 133 134 1311 132 137 133 136 135 133 134 133 133 132 138 133 134 134 134 134 138 138 137 136 132 132 137 135 133 135 138 135 134 135 134 135 134 1312 133 135 133 133 133 132 134 131 139 135 135 135 138 138 135 138 133 134 133 136 136 135 134 133 133 135 133 137 135 132 133 133 132 131 132 136 137 130 136 133 134 1310 132 136 137 134 133 132 138 133 135 133 135 136 132 134 134 133 135 135 135 134 134 136 133 132 138 1310 135 135 132 132 137 136 134 135 134 134 136 134 136 135 133 137 137 136 137 134 134 137 133 130 134 136 135 137 136 136 135 137 134 134 135 136 136 135 136 132 134 133 139 135 133 137 135 136 137 136 136 136 134 135 137 137 133 134 137 137 136 133 134 137 131 135 136 133 137 133 135 133 137 138 133 137 132 135 134 133 132 135 134 134 135 133 134 139 135 134 139 137 133 132 133 134 133 134 135 135 138 134 135 134 135 139 137 133 133 132 136 132 138 135 132 137 134 135 136 132 134 135 135 133 135 136 137 135 138 132 131 137 135 135 138 134 137 136 139 1310 137 134 131 136 132 136 137 133 135 137 135 132 135 135 133 133 137 134 133 133 131 138 139 132 134 138 135 136 138 137 1310 138 133 134 134 135 134 134 135 136 135 134 134 135 133 136 135 137 132 133 139 132 133 137 136 134 137 131 135 134 132 134 138 135 134 131 132 134 135 136 133 134 138 134 132 135 134 132 134 133 136 135 138 133 139 1310 134 133 133 137 137 136 137 133 133 133 135 139 136 136 137 136 135 132 132 139 136 132 139 132 137 135 133 138 137 135 134 136 131 133 135 133 134 137 135 134 132 136 136 136 137 133 132 135 134 135 134 137 134 133 133 134 132 134 135 134 134 136 134 135 138 133 135 135 138 133 135 134 135 135 138 1311 132 134 134 136 133 135 133 136 132 131 136 134 136 132 136 136 136 136 130 136 134 134 131 138 131 1310 135 139 136 132 136 138 135 138 134 132 134 133 136 137 133 133 133 133 137 136 135 133 139 133 132 135 136 136 134 132 132 135 137 136 136 136 138 137 137 135 135 131 136 133 136 135 133 134 130 133 135 136 137 138 136 134 135 132 137 132 137 132 133 134 135 138 134 136 133 135 135 139 134 134 136 134 134 134 135 134 133 135 135 138 133 136 136 134 135 134 134 138 136 133 137 132 134 137 136 135 133 134 133 135 134 134 136 134 133 137 133 135 135 136 135 138 134 136 132 137 136 138 134 136 136 137 136 136 135 136 1310 138 133 137 135 136 137 134 136 133 134 133 132 132 134 137 132 132 133 132 138 134 134 135 135 139 135 134 132 134 135 134 139 137 133 134 134 135 133 133 137 138 135 139 133 138 136 136 134 133 136 135 1314 137 133 137 135 136 134 134 136 133 135 134 135 136 136 135 133 135 131 135 137 135 136 133 137 135 134 133 134 134 134 134 134 136 132 134 136 136 137 139 134 138 133 133 132 135 131 134 133 137 133 133 134 139 138 134 134 137 137 135 136 134 139 137 138 134 133 134 134 135 137 134 135 138 133 132 134 1310 133 135 134 132 138 137 136 135 138 1314 139 135 135 131 134 135 134 135 135 135 133 136 135 135 132 136 139 133 133 136 134 132 132 137 136 131 137 135 135 134 1313 1310 132 134 134 133 138 135 134 133 136 136 136 1310 134 137 136 138 139 137 135 134 134 137 137 138 133 134 135 137 135 136 1310 136 136 138 133 136 133 134 135 135 134 136 133 136 136 137 134 135 1316 136 136 132 136 136 133 134 133 137 134 135 134 133 138 134 1310 136 136 136 137 134 136 137 132 138 136 131 132 134 135 130 134 135 135 137 130 136 135 131 136 137 133 137 135 139 138 135 139 133 137 139 133 136 137 136 138 134 1310 136 134 133 139 136 137 133 13713

Rango maacuteximo y miacutenimo

Para empezar vamos a aprender tres nuevas funciones de R que nos permiten calcular esos tresvalores

gt (minimo = min(var3) )[1] 0gt (maximo = max(var3) )[1] 16gt (rango = range(var3) )[1] 0 16

El funcionamiento de las dos primeras es evidente La funcioacuten range devuelve un vector formadopor el maacuteximo y el miacutenimo

Tablas de frecuencia Clases de objetos en R

La tabla de frecuencia absoluta de var3 se obtiene usando la funcioacuten table de esta forma tansencilla

gt ( tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

La primera fila contiene los elementos de var3 y en la segunda aparece la frecuencia de cada unode ellos Puedes comprobar que son los mismos resultados que obtuvimos con Calc en la paacutegina10 del Tutorial01 Aunque alliacute desde luego el proceso fue maacutes laborioso

A lo mejor te has dado cuenta de que el formato de la respuesta es diferente de los que hemosobtenido hasta ahora Para empezar la respuesta no empieza con el [1] al que ya nos vamosacostumbrando El motivo de esto es que el objeto que hemos obtenido como respuesta no es unvector sino una tabla Ya dijimos que R utiliza distintos tipos de objetos con fines distintosiquestCoacutemo podemos saber de queacute clase es un objeto Pues usando una funcioacuten de R oportunamentellamada class Si la usamos con el vector var3 y con su tabla de frecuencias obtenemos

gt class(var3)[1] numericgt class(tablaFrecAbs)[1] table

El vector var3 es de clase numeric porque es un vector de nuacutemeros Y la tabla de frecuencias esde clase table Veremos a lo largo del curso otros objetos de tipo tabular como las matrices (clasematrix) los conjuntos de datos (clase dataframe) y los arraysAunque las tablas son objetos distintos de los vectores tienen algunas propiedades en comuacuten yalgunas de las funciones que hemos usado con vectores tambieacuten se pueden usar con tablas

Ejercicio 11Aplica las funciones length sum min max y range a la tabla tablaFrecAbs Solucioacuten en la paacutegina48

Siguiendo con los parecidos entre tablas y vectores puedes multiplicar (o dividir) una tabla porun nuacutemero y la operacioacuten se haraacute elemento a elemento

gt 2 tablaFrecAbsvar30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1618 50 200 376 488 492 372 262 174 86 56 12 4 4 4 2

Como ves cada frecuencia se multiplica por 2 Esta propiedad de las tablas permite obtener deforma muy sencilla la tabla de frecuencias relativa de var3 Como primer paso vamos a guardarla longitud de var3 en la variable n

22

gt ( n = length( var3 ) )[1] 1300

Y ahora podemos dividir la tabla por n para conseguir la tabla de frecuencias relativas (hemosestrechado la Consola de Comandos para que el resultado cupiera en esta paacutegina)

gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 400069230769 00192307692 00769230769 01446153846 01876923077

5 6 7 8 901892307692 01430769231 01007692308 00669230769 00330769231

10 11 12 13 1400215384615 00046153846 00015384615 00015384615 00015384615

1600007692308

Ejercicio 12Ya sabemos cuanto debe sumar esta tabla de frecuencias relativas Comprueacutebalo Solucioacuten en lapaacutegina 48

Si lo que queremos es una tabla de frecuencias acumuladas debemos emplear la funcioacuten cumsum

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Ejercicio 13La uacuteltima tabla que falta es la de frecuencias relativas acumuladas pero ya tienes todos los ingre-dientes para obtenerla de dos maneras diferentes Hazlo y comprueba si dan el mismo resultadoSi no es asiacute iquesta queacute crees que se debe y cuaacutel es la mejor opcioacuten Asigna el resultado a la variabletablaFrecRelAcu Solucioacuten en la paacutegina 49

Graacuteficos de columnas y diagramas de caja (boxplot) Argumentos con nombre

Vamos a fabricar nuestros primeros graacuteficos con R En concreto vamos a dibujar un graacutefico debarras a partir de la tabla de frecuencias de var3 usando la funcioacuten barplot de R

gt barplot(tablaFrecAbs)

Al ejecutar este comando no debes ver ninguna salida en la Consola de Comandos En su lugaren el panel inferior derecho de RStudio concretamente en la ventana Plots apareceraacute el graacuteficodeseado El resultado puede variar dependiendo de la anchura de tu ventana de RStudio

23

Hemos destacado ademaacutes en la figura los dos botones Zoom y Export que te permiten respecti-vamente ver una versioacuten ampliada de la Figura (que se redimensiona dinaacutemicamente si cambiasla ventana) y guardar esa figura como un fichero de graacuteficos que puedes insertar en cualquierdocumento editar con un programa de manipulacioacuten de graacuteficos etceacuteteraLos graacuteficos de R se pueden controlar hasta en sus detalles maacutes miacutenimos Como aperitivo miacutenimovamos a antildeadir algo de color al graacutefico

gt barplot(tablaFrecAbs col = heatcolors(15))

El resultado es esta figura

Las posibilidades de control de los graacuteficos de R son como decimos inmensas y pueden llegar aser abrumadoras Hay libros de cientos de paacuteginas dedicados a este tema como el R GraphicsCookbook de W Chang (ver las referencias del curso) Nosotros a lo largo de los tutoriales delcurso vamos a aprender algo maacutes aunque a penas nos podremos limitar a rozar la superficie delo que se puede llegar a hacerEn la Seccioacuten 231 del libro hemos descrito los diagramas de cajas o boxplots (recuerda la Figura22 de la paacuteg 36 del libro) Y en el Tutorial-01 dijimos que con Calc no es faacutecil dibujar ese tipode diagramas En cambio con R no podriacutea ser maacutes faacutecil

gt boxplot(var3)

Y el resultado es esta figura

24

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

Hemos rodeado toda la liacutenea con pareacutentesis para ver el resultado y poder observar coacutemo hacambiado el vector edadesVamos a analizar paso a paso lo que ha ocurrido

La instruccioacuten c( edades edades2) toma los datos contenidos en edades y edades2 y losconcatena en ese orden para fabricar un nuevo vector que todaviacutea no estaacute guardado enninguna variable

La asignacioacuten edades = c( edades edades2) toma ese vector y lo guarda en la propiavariable edades Al hacer esto como era de esperar el anterior vector edades es reemplazadocon la nueva lista y su contenido anterior se pierde (cuidado con esto las reasignaciones sonuna de las formas habituales de cometer errores)

El nombre de la funcioacuten c proviene en realidad de concatenate concatenar en ingleacutesLa siguiente figura resume lo que hemos venido haciendo con estos datos

Los nuacutemeros entre corchetes al principio de cada fila como el [1] y el [16] de este ejemploson soacutelo ayudas para que podamos localizar los elementos del vector En mi pantalla la primerafila muestra los primeros 15 nuacutemeros del vector Pero en la tuya si la ventana de RStudio es dedistinta anchura los nuacutemeros entre corchetes pueden ser distintos Hasta ahora soacutelo habiacuteamos vistoejemplos con [1] que es lo que sucede cuando la respuesta es un vector que cabe en una uacutenicaliacutenea

3 Ficheros csv con REn esta seccioacuten vamos a aprender a utilizar ficheros csv con R En el Tutorial-01 hemos vistoalgunos ejemplos de ese tipo de ficheros y el manejo baacutesico con una hoja de caacutelculo como CalcComo vimos alliacute un fichero csv tiacutepico contiene una tabla de datos con varias columnas Esaestructura de tabla se haraacute imprescindible maacutes adelante Pero durante una buena parte del cursonosotros nos vamos a limitar a problemas en los que interviene una uacutenica variable En tal casopara almacenar los datos de esa variable nos podemos a limitar a considerar un tipo de ficheroscsv muy baacutesico como el fichero adjunto

Guaacuterdalo en la subcarpeta datos de tu directorio de trabajo (el que contiene este pdf) Si lo abrescon un editor de texto (como el Bloc de Notas en Windows) veraacutes como muestra esta figura

12

61371381381381391391351381371381371371361361371351381391341371351371371351391341371371371381351381391371341361361361391381361371361371361361381361351351361361381351381351391371361391351371381381371310137138137135136138138137133135136137135137137135138134138138138136137136136138135136135138136139137

que el fichero contiene soacutelo una columna de datos que en este ejemplo corresponde a valores deuna variable cuantitativa discreta En la figura soacutelo se muestra una parte de los datos

Ejercicio 3iquestCuaacutentos datos hay en ese vector Usa Calc para averiguarlo pronto aprenderemos a hacerlo conR Solucioacuten en la paacutegina 47

Queremos utilizar esos datos en R y para eso vamos a (1) leerlos desde el fichero y (2)guardarlos enun vector El resultado seraacute como si nosotros hubieacuteramos creado ese vector tecleaacutendo sus elementosdirectamentePara el primer paso (la lectura del fichero csv) vamos a tener que empezar por explicarle a R(usando RStudio como intermediario) donde estaacute el fichero que contiene esos datos Cuando tra-bajamos con ficheros R utiliza un directorio de nuestro ordenador como directorio de trabajo Acontinuacioacuten vamos a aprender a elegir un directorio de trabajo Puedes usar cualquier carpeta yen lo que sigue vamos a suponer que hemos elegido el Escritorio Lo maacutes importante es que esacarpeta debe contener a su vez una subcarpeta llamada datos Y aseguacuterate de que los ficheroscsv que vas a usar estaacuten almacenados en esa subcarpeta llamada datos

Usamos el menuacute Session rarr Set Working Directory rarr Choose Directory

Se abre un cuadro de diaacutelogo del sistema y navegamos hasta la carpeta que contiene el ficherocsv que en mi caso es el Escritorio Cuando selecciono el Escritorio veo aparecer en la Consolade Comandos de R un comando que RStudio ha escrito y ejecutado por nosotros

13

setwd(CUsersFernandoDesktop)

Este es el resultado en mi ordenador (de ahiacute el nombre de usuario) usando Windows 10 Enversiones maacutes antiguas de Windows o en una maacutequina con Linux o un Mac el comando seraacuteligeramente distinto Cuando tengamos maacutes praacutectica aprenderemos otras formas de seleccionar eldirectorio de trabajo o incluso de utilizar ficheros situados fuera de ese directorio de trabajo Peropor el momento resulta maacutes coacutemodo dejar que RStudio haga ese trabajo para nosotrosAhora R ya sabe doacutende estaacute el fichero que nos interesa pero todaviacutea no sabe cual es Para ello vamosa utilizar la funcioacuten readtable de R Aunque esta funcioacuten tiene muchas opciones disponiblesnuestro primer uso de ella seraacute bastante sencillo Copia y ejecuta el siguiente coacutedigo en RStudio

(vectorEdades = readtable(datosTut02-Edadescsvheader = FALSE)[1])

En esta instruccioacuten le decimos a R que use la funcioacuten readtable para leer el contenido del ficheroTut02-Edadescsv y que almacene lo que ha leiacutedo en un vector que hemos decidido llamarvectorEdades Y aunque no es necesario entender en detalle el funcionamiento de readtable eneste momento vamos a explicar un poco maacutes lo que hemos hecho A medida que el curso avanceiraacutes teniendo maacutes ocasiones de practicar esto e iraacute quedando cada vez maacutes claroLa opcioacuten header = FALSE sirver para indicarle a R que la tabla almacenada en el fichero no tieneuna liacutenea de cabecera (en ingleacutes header) que cuando existe suele contener los nombres de lasvariables de la tabla Ademaacutes la funcioacuten readtable sirve para leer tablas con varias columnasobteniendo como resultado un objeto de R de tipo dataframe Pero nuestro primer ejemplo esmuy sencillo y la tabla soacutelo tiene una columna Asiacute que usamos la notacioacuten [1] para indicarle aR que soacutelo queremos la primera columna de esa tabla considerada como un vectorAl ejecutar esa orden habraacutes obtenido una respuesta como esta

gt gt (vectorEdades = readtable(datosTut02-Edadescsv header = FALSE)[1])[1] 6 7 8 8 8 9 9 5 8 7 8 7 7 6 6 7 5 8 9 4 7 5 7[24] 7 5 9 4 7 7 7 8 5 8 9 7 4 6 6 6 9 8 6 7 6 7 6[47] 6 8 6 5 5 6 6 8 5 8 5 9 7 6 9 5 7 8 8 7 10 7 8[70] 7 5 6 8 8 7 3 5 6 7 5 7 7 5 8 4 8 8 8 6 7 6 6[93] 8 5 6 5 8 6 9 7

Como hemos dicho antes los nuacutemeros entre corchetes al principio de cada fila que en mi casoson [1] [24] [47] [70] y [93] son soacutelo ayudas para que podamos localizar los elementos delvector En mi pantalla cada primera fila muestra 23 nuacutemeros del vector Pero en la tuya si laventana de RStudio es de distinta anchura los nuacutemeros entre corchetes pueden ser distintos

En cualquier caso ahora el vector vectorEdades contiene la informacioacuten del fichero csv con el quehemos empezado En la Seccioacuten 4 vamos a empezar a hacer Estadiacutestica Descriptiva Pero antes tepedimos un poco maacutes de paciencia porque vamos a entretenernos un poco maacutes en los detalles delmanejo de ficheros csv con R No pretendemos ser exhaustivos ni mucho menos pero siacute queremosaprender lo suficiente como para evitarnos los problemas maacutes habituales en los casos maacutes sencillosPara cerrar este apartado es conveniente haber visto el error que se produce cuando el fichero quetratamos de leer desde R no existe o no estaacute en el directorio de trabajo

Ejercicio 4Prueba a ejecutar

errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)

y fiacutejate en el mensaje de error Solucioacuten en la paacutegina 47

Otra variante del fichero de entrada

Los ficheros csv que contienen un uacutenico vector (en lugar de una tabla de datos) pueden adoptarformatos distintos del que acabamos de ver Por ejemplo el fichero adjunto

contiene los mismos datos que Tut02-Edadescsv pero ahora los datos del vector estaacuten todos enuna fila y separados por comas Guaacuterdalo como antes en la subcarpeta datos El aspecto delfichero visto a traveacutes de un editor de texto es este (soacutelo son visibles una parte de los datos)

14

67888995878776675894757759477785897466698676766865566858597695788710787568873567577584888676685658697

Desde luego no nos podemos plantear transformar a mano este vector en uno como el anteriorLa solucioacuten que te proponemos pasa por la hoja de caacutelculo y la opcioacuten de trasponer una tablaque hemos visto en el Tutorial-00 lo leeriacuteamos en una fila de la hoja y luego habriacutea que usar elPegado especial para trasponerlo -es decir girarlo- para finalmente volver a guardarlo Alterna-tivamente hay otras soluciones sin salir de R usando una funcioacuten llamada scan o usando de nuevoreadtable y trasponiendo la tabla dentro de R Esos meacutetodos son sencillos cuando se aprendeun poco maacutes sobre R pero por el momento y para los ejemplos sencillos que encontraremos nosvamos a conformar con ese enfoque baacutesico que usa la hoja de Caacutelculo si es necesario

31 Coacutemo obtener ayuda y usar el tabulador en RStudioVamos a aprovechar estos ejemplos de lectura de ficheros csv para aprender a obtener ayuda sobrelas funciones de R La mayoriacutea de las funciones de R como la funcioacuten readtable o la funcioacutenscan que hemos mencionado al final del anterior apartado tienen muchos argumentos opcionalesY hay muchiacutesimas funciones en R (cada vez maacutes porque como veremos maacutes adelante usuarios detodo el mundo antildeaden constantemente funciones nuevas a R cuando las necesitan) No es posiblerecordar todos esas funciones cada una con sus opciones asiacute que es muy importante aprender aobtener esa informacioacuten cuando la necesitamosPara ver como obtener esa informacioacuten en RStudio vamos a usar por ejemplo la funcioacuten scanSituacuteate en una liacutenea vaciacutea de la Consola de Comandos escribe scan y a continuacioacuten mientras elcursor parpadea junto a la n final de scan pulsa la tecla del tabulador (si esto no funciona usa latecla F1 y mira el panel ayuda de RStudio) Veraacutes aparecer una ventana emergente con informacioacutensobre la funcioacuten scan como en esta figura

15

Como ves se muestra un resumen sobre la funcioacuten scan que a veces seraacute suficiente Si necesitasmaacutes detalles haz caso a la indicacioacuten que aparece al final de esa ventana y pulsa la tecla F1 Alhacerlo veraacutes que en el panel inferior derecho de RStudio aparece el fichero de ayuda de la funcioacutenscan como en esta figura

Esos ficheros de ayuda son muy uacutetiles aunque al principio pueden resultar un poco intimidatoriosya sea por un exceso de informacioacuten ya sea porque se da por supuesto que el usuario ya entiendealgunos conceptos baacutesicos de R Podemos garantizar al lector que a medida que se progresa en Rla utilidad de estos ficheros aumentaPero la utilidad de la tecla tabulador en RStudio no se acaba ahiacute Supongamos que quieres aplicarreadtable para leer el fichero Tut02-Edadescsv Pero te da pereza escribir un nombre tan largoo no recuerdas exactamente el nombre o dudas entre dos nombres no importa cual sea el motivoEmpiezas a escribir la orden tecleas

(vectorEdades2 = readtable(datos

y de nuevo justo en este punto pulsas el tabulador Entonces RStudio te ofrece en una nuevaventana emergente todos los ficheros disponibles en la carpeta datos

Y ahora puedes usar esa lista seleccionar el fichero que quieras utilizar Puedes tambieacuten teclearalguna letra maacutes del nombre para acotar auacuten maacutes la buacutesqueda cuando la carpeta contiene muchosficherosEn general la idea es que en RStudio el tabulador es tu amigo Como tendremos ocasioacuten decomprobar RStudio nos ofrece bastante ayuda para hacer maacutes coacutemodo nuestro trabajo con R yel tabulador es una de las herramientas maacutes versaacutetiles y uacutetiles

16

32 El camino contrario escribir un vector a un fichero de tipo csvHemos aprendido a leer con R vectores de datos a partir de ficheros de tipo csv Pero muchasveces despueacutes de hacer operaciones en R obtendremos como resultados nuevos vectores (y maacutesadelante en el curso otro tipo de objetos) Lo natural entonces es aprender a guardar ese vectoren un fichero de tipo csv como el fichero con el que empezamos De esa forma por ejemplo puedescompartir tus resultados con otras personas que utilicen programas distintos de R Para ello siantes usaacutebamos la funcioacuten readtable ahora vamos a usar la funcioacuten writetable de R

Como ejemplo vamos a utilizar este vector de nuacutemeros enteros

29 17 63 31 55 9 92 61 10 16 63 6 61 59 66 41 68 6 99 21 87 68 52 83 66 98 45 5024 100 83 37 44 4 97 67 56 74 75 71 55 22 86 22 93 65 38 84 54 83 100 71 99 1963 11 11 62 91 20 79 42 59 95 70 74 8 25 45 58 57 75 81 34 70 68 39 12 14 21

Ejercicio 5Usa copiar y pegar a partir de este documento pdf para crear un vector de R llamado muestraque contenga esos datos

Para guardar ese vector muestra en un fichero csv (dentro de la subcarpeta datos del directoriode trabajo) podemos utilizar la funcioacuten writetable usando como argumentos

El nombre del vector que queremos guardar que es muestra

Y el nombre del fichero en el que lo guardamos Vamos llamarlo por ejemplo Tut02-muestracsvLe indicamos a R ademaacutes que lo ponga en la subcarpeta datos

La opcioacuten colnames = FALSE o colnames = TRUE para decidir si queremos que R incluyauna liacutenea de cabecera con el nombre de la variable que en este caso es muestra (y que novamos a incluir)

La opcioacuten rownames = FALSE para evitar que R incluya nuacutemeros de fila en el fichero desalida (normalmente no querremos esos nuacutemeros)

Es decir que ejecutamos

writetable(muestrafile = datosTut02-muestracsv colnames=FALSE rownames=FALSE)

Al ejecutar esa orden el fichero que obtenemos tiene la forma deseada (de nuevo soacutelo es visible elcomienzo del fichero)

17

Puedes probar a abrirlo en Calc para ver que es un fichero de datos como los que hemos visto hastaahora

Naturalmente apenas hemos rozado el tema de la entradasalida de datos en R Pero con lo quehemos aprendido en este apartado estamos listos para empezar a hacer Estadiacutestica Descriptivausando ejemplos que no sean demasiado triviales

4 Estadiacutestica descriptiva de una variable cuantitativa condatos no agrupados

Para seguir adelante tenemos que empezar por aprender un poco maacutes sobre la forma en la que Rpermite operar con los vectores Vamos a hacerlo a traveacutes de una serie de ejercicios-ejemplos

Ejercicio 6

1 Vamos a definir dos vectores cada uno de ellos con 12 nuacutemeros enteros El primero al quellamaremos vector1 estaacute formado por

8 5 19 9 17 2 28 18 3 4 19 1

Usa copiar y pegar a partir de este fichero pdf para definir el vector1 en R

2 El segundo vector al que en un rapto de originalidad llamaremos vector2 estaacute almacenadoen el fichero

Guaacuterdalo en datos y examiacutenalo primero con un editor de texto (como el Bloc de Notas)para ver coacutemo estaacuten almacenados los datos en ese fichero Una vez hecho esto usa Calc yla funcioacuten readtable para almacenar el contenido de ese fichero csv en el vector2 de REn alguacuten momento del proceso puede que tengas que usar el pegado especial de Calc paratrasponer los datos

Solucioacuten en la paacutegina 47

41 Aritmeacutetica vectorial en RAhora vamos a sumar los dos vectores Ejecuta el comando

vector1 + vector2

para comprobar que el resultado es la suma componente a componente de los dos vectores

gt vector1 + vector2[1] 26 23 39 21 37 3 58 24 29 24 34 26

Este resultado es bastante previsible Lo que quizaacute resulteacute un poco maacutes inesperado es que simultiplicas los dos vectores tambieacuten se obtienen los productos componente a componente el primerelemento de vector1 se multiplica por el primero de vector2 el segundo por el segundo etc

gt vector1 vector2[1] 144 90 380 108 340 2 840 108 78 80 285 25

Esta forma de operar de R como veremos pronto es muy uacutetil Si lo piensas un momento cadavector numeacuterico de R se corresponde con una columna de una hoja de caacutelculo como las queusaacutebamos en el Tutorial01 Alliacute vimos que para algunas operaciones era necesario multiplicar doscolumnas elemento a elemento En Calc esa operacioacuten no es complicada pero en R es auacuten maacutes faacutecilBasta con un comando como vector1 vector2 para conseguir el objetivo Veremos muchos maacutesejemplos a lo largo del curso en los que una operacioacuten que en Calc requeririacutea bastantes pasosen R se reduce a ejecutar un uacutenico comandoEn R las operaciones con vectores siguen en general este esquema de funcionamiento componentea componente Si por ejemplo ejecutas

18

1818201220130626201525

gt vector1 + 5[1] 13 10 24 14 22 7 33 23 8 9 24 6gt 2 vector1[1] 16 10 38 18 34 4 56 36 6 8 38 2

veraacutes que en el primer caso cada uno de los elementos de vector1 se ha incrementado en 5mientras que en el segundo caso cada uno se ha multiplicado por 2 Sucede lo mismo con otrasoperaciones como elevar al cuadrado

gt vector1^2[1] 64 25 361 81 289 4 784 324 9 16 361 1

Y podemos aplicar funciones en un solo paso Por ejemplo podemos calcular el logaritmo neperianode todos los elementos de un vector en un soacutelo paso

gt log(vector1)[1] 20794415 16094379 29444390 21972246 28332133 06931472[7] 33322045 28903718 10986123 13862944 29444390 00000000

Los resultados de todas estas operaciones son de nuevo vectores Y por tanto se pueden asignara nuevas variables para utilizarlos en nuestras operaciones Por ejemplo si luego vas a necesitar loslogaritmos de vector1 puedes definir una variable para identificar ese vector llamada logVector1(e el nombre que tuacute quieras) haciendo

gt logVector1 = log(vector1)

Recuerda que si ademaacutes de la asignacioacuten quieres ver el resultado puedes rodear toda esta senten-cia con pareacutentesis De lo contrario R la ejecuta pero no imprime ninguna respuesta como ya sabes

Aunque al principio puede parecer complicado cuando te acostumbres a esta forma de trabajarcon vectores veraacutes que resulta muy coacutemoda y eficiente

Generando vectores de nuacutemeros enteros consecutivos

Hay muchas ocasiones en que para alguna operacioacuten necesitamos un vector que contenga losnuacutemeros enteros consecutivos del 1 al n o del 0 al n etc En R esto es muy faacutecil de hacer Porejemplo para conseguir un vector con los nuacutemeros del 1 al 15 basta con ejecutar

gt 115[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Esa notacioacuten con los dos puntos permite generar vectores en los que cada elemento es igual alanterior maacutes 1 Otro ejemplo

gt -713[1] -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13

O incluso cuando los puntos de partida no son enteros

gt 1575[1] 15 25 35 45 55 65 75gt 1574[1] 15 25 35 45 55 65

iquestVes la diferencia entre estos dos casos

Es muy posible que te esteacutes preguntando iquesty si quiero ir avanzando de 2 en 2 o quiero ir hacia atraacutes(ldquoavanzandordquo de minus2 en minus2 por ejemplo) Pronto cuando hayamos aprendido un poco maacutes volve-remos sobre esto y comprobaremos que R nos ofrece un cataacutelogo de herramientas extremadamentepotentes para fabricar vectores de acuerdo con nuestros deseos y necesidadesLos vectores fabricados con este meacutetodo son vectores iguales que los demaacutes y se pueden asignar avariables operar con ellos etc

19

Ejercicio 7

1 Fabrica un vector con los cuadrados de los nuacutemeros del 1 al 10 y asiacutegnalo a la variablecuadrados Usa los pareacutentesis para ver el resultado de la asignacioacuten

2 Haz lo mismo con los cuadrados de los nuacutemeros del 2 al 11 y un vector cuadrados2

3 Resta los vectores cuadrados2 - cuadrados iquestObservas algo interesante

Solucioacuten en la paacutegina 47

Funciones vectoriales

Hemos visto antes que se puede aplicar una funcioacuten como la raiacutez cuadrada a un vector y seobtiene como resultado otro vector con las raiacuteces cuadradas elemento a elemento Pero hay otrotipo de funciones que permiten hacer caacutelculos con el vector en conjunto Por ejemplo antes hemosfabricado el vector -713 y la funcioacuten length nos dice cuantos elementos tiene ese vector

gt length(-713)[1] 21

En el Ejercicio 3 (paacuteg 13) nos preguntaacutebamos cuantos elementos teniacutea el vector vectorEdades quehabiacuteamos cargado desde el fichero csv Puedes obtener la respuesta con length(vectorEdades)Para comprobarlo aseguacuterate de que has creado el vector llamado vectorEdades y ejecuta estaorden

gt length(vectorEdades)[1] 100

Como ves el resultado de length es el esperado

Vamos a conocer otra funcioacuten llamada sum que sirve para calcular la suma de todos los elementosde un vector

gt sum(vectorEdades)[1] 675

Ejercicio 8iquestCuaacutento vale la suma de los cuadrados de los nuacutemeros del 1 al 100 Solucioacuten en la paacutegina 47

A lo mejor te ha pasado desapercibido pero con las funciones length y sum estamos por fin encondiciones de empezar a hacer Estadiacutestica Descriptiva Por ejemplo podemos calcular la mediaaritmeacutetica de vectorEdades

gt ( mediaEdades = sum(vectorEdades) length(vectorEdades) )[1] 675

Y una vez que tenemos la media podemos calcular la varianza poblacional Para que resulte maacutesclaro vamos a mostrarte el proceso paso a paso aunque al final lo ejecutaremos en un soacutelo paso

1 Empezamos restando la media que estaacute en la variable mediaEdades de cada uno de loselementos de vectorEdades

vectorEdades - mediaEdades

El resultado es un vector de diferencias

2 Ahora elevamos cada una de esas diferencias al cuadrado

( vectorEdades - mediaEdades )^2

El resultado de este paso es de nuevo un vector ahora con las diferencias al cuadrado Fiacutejateen el pareacutentesis para garantizar que elevamos al cuadrado la diferencia Si no incluyeacuteramosel pareacutentesis iquestqueacute calculariacuteamos

20

3 A continuacioacuten sumamos todas esas diferencias al cuadrado usando la funcioacuten sum

sum( ( vectorEdades - mediaEdades )^2)

De nuevo el pareacutentesis es fundamental para que el cuadrado del vector de diferencias secalcule antes que la suma En este paso el resultado ya no es un vector sino un nuacutemero

4 Por uacuteltimo dividimos esa suma por n el nuacutemero de elementos de vectorEdades que seobtiene con la funcioacuten length

sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades)

El resultado de estos pasos se puede condensar en un soacutelo comando de R en el que a la vezcalculamos la varianza y la asignamos a una variable

gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades) )[1] 19875

Ejercicio 9

1 Calcula la desviacioacuten tiacutepica (poblacional) de vectorEdades

2 Calcula la cuasivarianza y cuasidesviacioacuten tiacutepica (muestrales) de vectorEdades

3 iquestQueacute sucede si en el tercer paso ejecutas el siguiente comandosum( vectorEdades - mediaEdades )^2iquestPor queacute sucede esto

Solucioacuten en la paacutegina 48

Con estos caacutelculos hemos empezado a hacer Estadiacutestica con R Naturalmente nos queda muchiacutesimoque aprender sobre los vectores de R Por ejemplo como se accede a una componente individualdel vector para responder a preguntas como ldquoiquestCuaacutento vale el quinto elemento del vectorrdquo Maacutesen general aprenderemos a extraer aquellos elementos del vector que cumplan alguna condicioacutenrespondiendo a preguntas como ldquoiquestQueacute elementos del vector son mayores que 7rdquo

42 Y por fin hagamos Estadiacutestica DescriptivaEn esta seccioacuten vamos a trabajar con un vector de datos contenido en este fichero adjunto

Este vector contiene los datos de la variable var3 del fichero Tut01-PracticaConCalccsv queya hemos utilizado en el Tutorial-00 para aprender a hacer Estadiacutestica Descriptiva con Calc Enesta seccioacuten vamos a reproducir los resultados que obtuvimos alliacute pero esta vez usando R Parapreparar el terreno vamos a hacer limpieza

Ejercicio 10

1 Cierra Rstudio y vuelve a abrirlo para limpiar la memora del sistema El trabajo que hemoshecho hasta ahora se perderaacute (aunque los comandos siguen en el Historial de Comandos queya vimos)

2 Establece el Directorio de Trabajo (por ejemplo el Escritorio) y aseguacuterate de que Tut02-var3csvestaacute guardado en la subcarpeta datos de ese directorio

3 Carga de nuevo el contenido de ese fichero en un vector var3 de R

Solucioacuten en la paacutegina 48

Veraacutes en lo que sigue que siempre que calculamos un objeto le asignamos una variable Eso permiteahorrarse la repeticioacuten innecesaria de caacutelculos si maacutes adelante volvemos a necesitar ese objeto Yen algunos casos como veremos maacutes adelante al hacer esto podemos acceder a propiedades delobjeto calculado que R no muestra en su respuesta por defecto

21

4 138 134 134 135 135 133 136 136 132 134 134 133 133 133 132 136 134 135 132 135 136 135 132 136 134 135 133 134 134 134 1310 136 138 134 135 137 133 135 138 136 137 135 134 137 135 136 138 137 134 133 135 135 134 131 135 137 133 133 137 136 135 135 132 138 135 135 135 136 135 133 1311 136 1310 134 131 133 138 139 135 134 1310 134 134 137 135 134 133 132 135 132 136 135 134 133 139 136 135 134 135 132 132 138 134 133 136 138 134 134 134 138 134 132 135 1310 136 1312 135 139 135 138 138 135 132 135 1310 136 135 136 135 135 137 134 133 134 133 133 134 133 133 133 133 137 138 135 134 135 134 135 137 135 133 134 134 137 133 132 135 137 135 134 136 132 135 132 136 1310 134 132 139 134 136 136 132 137 134 138 135 135 134 134 137 134 136 136 135 134 133 135 133 133 136 132 133 134 138 138 137 137 136 135 1310 134 134 134 138 136 134 136 137 135 135 136 138 134 138 134 135 137 136 134 137 137 135 137 132 136 135 133 135 136 130 133 135 135 137 134 137 131 135 136 135 138 132 134 136 139 137 1310 134 135 136 132 135 135 135 1313 133 136 133 136 135 130 1310 134 136 136 134 131 133 135 137 136 133 135 133 134 132 132 138 138 134 136 135 135 134 133 139 134 139 136 1311 133 132 132 136 138 1310 133 137 133 134 135 139 133 135 133 134 138 139 132 138 133 133 137 138 136 133 135 134 132 1311 137 137 136 134 133 135 1310 135 134 135 133 135 136 135 139 135 134 135 135 134 133 137 134 1310 135 134 132 139 134 137 133 135 134 131 136 135 136 134 138 135 135 138 138 134 132 135 133 134 138 138 135 138 132 1311 135 134 134 136 139 1310 137 134 137 132 133 135 1310 135 135 133 135 136 134 134 136 135 137 136 136 134 133 134 135 132 134 136 139 133 135 133 136 133 133 135 134 134 134 137 135 139 1310 133 134 136 131 137 138 135 133 133 135 133 133 137 136 135 135 138 134 139 136 135 135 138 134 130 133 137 133 134 1311 132 137 133 136 135 133 134 133 133 132 138 133 134 134 134 134 138 138 137 136 132 132 137 135 133 135 138 135 134 135 134 135 134 1312 133 135 133 133 133 132 134 131 139 135 135 135 138 138 135 138 133 134 133 136 136 135 134 133 133 135 133 137 135 132 133 133 132 131 132 136 137 130 136 133 134 1310 132 136 137 134 133 132 138 133 135 133 135 136 132 134 134 133 135 135 135 134 134 136 133 132 138 1310 135 135 132 132 137 136 134 135 134 134 136 134 136 135 133 137 137 136 137 134 134 137 133 130 134 136 135 137 136 136 135 137 134 134 135 136 136 135 136 132 134 133 139 135 133 137 135 136 137 136 136 136 134 135 137 137 133 134 137 137 136 133 134 137 131 135 136 133 137 133 135 133 137 138 133 137 132 135 134 133 132 135 134 134 135 133 134 139 135 134 139 137 133 132 133 134 133 134 135 135 138 134 135 134 135 139 137 133 133 132 136 132 138 135 132 137 134 135 136 132 134 135 135 133 135 136 137 135 138 132 131 137 135 135 138 134 137 136 139 1310 137 134 131 136 132 136 137 133 135 137 135 132 135 135 133 133 137 134 133 133 131 138 139 132 134 138 135 136 138 137 1310 138 133 134 134 135 134 134 135 136 135 134 134 135 133 136 135 137 132 133 139 132 133 137 136 134 137 131 135 134 132 134 138 135 134 131 132 134 135 136 133 134 138 134 132 135 134 132 134 133 136 135 138 133 139 1310 134 133 133 137 137 136 137 133 133 133 135 139 136 136 137 136 135 132 132 139 136 132 139 132 137 135 133 138 137 135 134 136 131 133 135 133 134 137 135 134 132 136 136 136 137 133 132 135 134 135 134 137 134 133 133 134 132 134 135 134 134 136 134 135 138 133 135 135 138 133 135 134 135 135 138 1311 132 134 134 136 133 135 133 136 132 131 136 134 136 132 136 136 136 136 130 136 134 134 131 138 131 1310 135 139 136 132 136 138 135 138 134 132 134 133 136 137 133 133 133 133 137 136 135 133 139 133 132 135 136 136 134 132 132 135 137 136 136 136 138 137 137 135 135 131 136 133 136 135 133 134 130 133 135 136 137 138 136 134 135 132 137 132 137 132 133 134 135 138 134 136 133 135 135 139 134 134 136 134 134 134 135 134 133 135 135 138 133 136 136 134 135 134 134 138 136 133 137 132 134 137 136 135 133 134 133 135 134 134 136 134 133 137 133 135 135 136 135 138 134 136 132 137 136 138 134 136 136 137 136 136 135 136 1310 138 133 137 135 136 137 134 136 133 134 133 132 132 134 137 132 132 133 132 138 134 134 135 135 139 135 134 132 134 135 134 139 137 133 134 134 135 133 133 137 138 135 139 133 138 136 136 134 133 136 135 1314 137 133 137 135 136 134 134 136 133 135 134 135 136 136 135 133 135 131 135 137 135 136 133 137 135 134 133 134 134 134 134 134 136 132 134 136 136 137 139 134 138 133 133 132 135 131 134 133 137 133 133 134 139 138 134 134 137 137 135 136 134 139 137 138 134 133 134 134 135 137 134 135 138 133 132 134 1310 133 135 134 132 138 137 136 135 138 1314 139 135 135 131 134 135 134 135 135 135 133 136 135 135 132 136 139 133 133 136 134 132 132 137 136 131 137 135 135 134 1313 1310 132 134 134 133 138 135 134 133 136 136 136 1310 134 137 136 138 139 137 135 134 134 137 137 138 133 134 135 137 135 136 1310 136 136 138 133 136 133 134 135 135 134 136 133 136 136 137 134 135 1316 136 136 132 136 136 133 134 133 137 134 135 134 133 138 134 1310 136 136 136 137 134 136 137 132 138 136 131 132 134 135 130 134 135 135 137 130 136 135 131 136 137 133 137 135 139 138 135 139 133 137 139 133 136 137 136 138 134 1310 136 134 133 139 136 137 133 13713

Rango maacuteximo y miacutenimo

Para empezar vamos a aprender tres nuevas funciones de R que nos permiten calcular esos tresvalores

gt (minimo = min(var3) )[1] 0gt (maximo = max(var3) )[1] 16gt (rango = range(var3) )[1] 0 16

El funcionamiento de las dos primeras es evidente La funcioacuten range devuelve un vector formadopor el maacuteximo y el miacutenimo

Tablas de frecuencia Clases de objetos en R

La tabla de frecuencia absoluta de var3 se obtiene usando la funcioacuten table de esta forma tansencilla

gt ( tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

La primera fila contiene los elementos de var3 y en la segunda aparece la frecuencia de cada unode ellos Puedes comprobar que son los mismos resultados que obtuvimos con Calc en la paacutegina10 del Tutorial01 Aunque alliacute desde luego el proceso fue maacutes laborioso

A lo mejor te has dado cuenta de que el formato de la respuesta es diferente de los que hemosobtenido hasta ahora Para empezar la respuesta no empieza con el [1] al que ya nos vamosacostumbrando El motivo de esto es que el objeto que hemos obtenido como respuesta no es unvector sino una tabla Ya dijimos que R utiliza distintos tipos de objetos con fines distintosiquestCoacutemo podemos saber de queacute clase es un objeto Pues usando una funcioacuten de R oportunamentellamada class Si la usamos con el vector var3 y con su tabla de frecuencias obtenemos

gt class(var3)[1] numericgt class(tablaFrecAbs)[1] table

El vector var3 es de clase numeric porque es un vector de nuacutemeros Y la tabla de frecuencias esde clase table Veremos a lo largo del curso otros objetos de tipo tabular como las matrices (clasematrix) los conjuntos de datos (clase dataframe) y los arraysAunque las tablas son objetos distintos de los vectores tienen algunas propiedades en comuacuten yalgunas de las funciones que hemos usado con vectores tambieacuten se pueden usar con tablas

Ejercicio 11Aplica las funciones length sum min max y range a la tabla tablaFrecAbs Solucioacuten en la paacutegina48

Siguiendo con los parecidos entre tablas y vectores puedes multiplicar (o dividir) una tabla porun nuacutemero y la operacioacuten se haraacute elemento a elemento

gt 2 tablaFrecAbsvar30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1618 50 200 376 488 492 372 262 174 86 56 12 4 4 4 2

Como ves cada frecuencia se multiplica por 2 Esta propiedad de las tablas permite obtener deforma muy sencilla la tabla de frecuencias relativa de var3 Como primer paso vamos a guardarla longitud de var3 en la variable n

22

gt ( n = length( var3 ) )[1] 1300

Y ahora podemos dividir la tabla por n para conseguir la tabla de frecuencias relativas (hemosestrechado la Consola de Comandos para que el resultado cupiera en esta paacutegina)

gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 400069230769 00192307692 00769230769 01446153846 01876923077

5 6 7 8 901892307692 01430769231 01007692308 00669230769 00330769231

10 11 12 13 1400215384615 00046153846 00015384615 00015384615 00015384615

1600007692308

Ejercicio 12Ya sabemos cuanto debe sumar esta tabla de frecuencias relativas Comprueacutebalo Solucioacuten en lapaacutegina 48

Si lo que queremos es una tabla de frecuencias acumuladas debemos emplear la funcioacuten cumsum

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Ejercicio 13La uacuteltima tabla que falta es la de frecuencias relativas acumuladas pero ya tienes todos los ingre-dientes para obtenerla de dos maneras diferentes Hazlo y comprueba si dan el mismo resultadoSi no es asiacute iquesta queacute crees que se debe y cuaacutel es la mejor opcioacuten Asigna el resultado a la variabletablaFrecRelAcu Solucioacuten en la paacutegina 49

Graacuteficos de columnas y diagramas de caja (boxplot) Argumentos con nombre

Vamos a fabricar nuestros primeros graacuteficos con R En concreto vamos a dibujar un graacutefico debarras a partir de la tabla de frecuencias de var3 usando la funcioacuten barplot de R

gt barplot(tablaFrecAbs)

Al ejecutar este comando no debes ver ninguna salida en la Consola de Comandos En su lugaren el panel inferior derecho de RStudio concretamente en la ventana Plots apareceraacute el graacuteficodeseado El resultado puede variar dependiendo de la anchura de tu ventana de RStudio

23

Hemos destacado ademaacutes en la figura los dos botones Zoom y Export que te permiten respecti-vamente ver una versioacuten ampliada de la Figura (que se redimensiona dinaacutemicamente si cambiasla ventana) y guardar esa figura como un fichero de graacuteficos que puedes insertar en cualquierdocumento editar con un programa de manipulacioacuten de graacuteficos etceacuteteraLos graacuteficos de R se pueden controlar hasta en sus detalles maacutes miacutenimos Como aperitivo miacutenimovamos a antildeadir algo de color al graacutefico

gt barplot(tablaFrecAbs col = heatcolors(15))

El resultado es esta figura

Las posibilidades de control de los graacuteficos de R son como decimos inmensas y pueden llegar aser abrumadoras Hay libros de cientos de paacuteginas dedicados a este tema como el R GraphicsCookbook de W Chang (ver las referencias del curso) Nosotros a lo largo de los tutoriales delcurso vamos a aprender algo maacutes aunque a penas nos podremos limitar a rozar la superficie delo que se puede llegar a hacerEn la Seccioacuten 231 del libro hemos descrito los diagramas de cajas o boxplots (recuerda la Figura22 de la paacuteg 36 del libro) Y en el Tutorial-01 dijimos que con Calc no es faacutecil dibujar ese tipode diagramas En cambio con R no podriacutea ser maacutes faacutecil

gt boxplot(var3)

Y el resultado es esta figura

24

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

que el fichero contiene soacutelo una columna de datos que en este ejemplo corresponde a valores deuna variable cuantitativa discreta En la figura soacutelo se muestra una parte de los datos

Ejercicio 3iquestCuaacutentos datos hay en ese vector Usa Calc para averiguarlo pronto aprenderemos a hacerlo conR Solucioacuten en la paacutegina 47

Queremos utilizar esos datos en R y para eso vamos a (1) leerlos desde el fichero y (2)guardarlos enun vector El resultado seraacute como si nosotros hubieacuteramos creado ese vector tecleaacutendo sus elementosdirectamentePara el primer paso (la lectura del fichero csv) vamos a tener que empezar por explicarle a R(usando RStudio como intermediario) donde estaacute el fichero que contiene esos datos Cuando tra-bajamos con ficheros R utiliza un directorio de nuestro ordenador como directorio de trabajo Acontinuacioacuten vamos a aprender a elegir un directorio de trabajo Puedes usar cualquier carpeta yen lo que sigue vamos a suponer que hemos elegido el Escritorio Lo maacutes importante es que esacarpeta debe contener a su vez una subcarpeta llamada datos Y aseguacuterate de que los ficheroscsv que vas a usar estaacuten almacenados en esa subcarpeta llamada datos

Usamos el menuacute Session rarr Set Working Directory rarr Choose Directory

Se abre un cuadro de diaacutelogo del sistema y navegamos hasta la carpeta que contiene el ficherocsv que en mi caso es el Escritorio Cuando selecciono el Escritorio veo aparecer en la Consolade Comandos de R un comando que RStudio ha escrito y ejecutado por nosotros

13

setwd(CUsersFernandoDesktop)

Este es el resultado en mi ordenador (de ahiacute el nombre de usuario) usando Windows 10 Enversiones maacutes antiguas de Windows o en una maacutequina con Linux o un Mac el comando seraacuteligeramente distinto Cuando tengamos maacutes praacutectica aprenderemos otras formas de seleccionar eldirectorio de trabajo o incluso de utilizar ficheros situados fuera de ese directorio de trabajo Peropor el momento resulta maacutes coacutemodo dejar que RStudio haga ese trabajo para nosotrosAhora R ya sabe doacutende estaacute el fichero que nos interesa pero todaviacutea no sabe cual es Para ello vamosa utilizar la funcioacuten readtable de R Aunque esta funcioacuten tiene muchas opciones disponiblesnuestro primer uso de ella seraacute bastante sencillo Copia y ejecuta el siguiente coacutedigo en RStudio

(vectorEdades = readtable(datosTut02-Edadescsvheader = FALSE)[1])

En esta instruccioacuten le decimos a R que use la funcioacuten readtable para leer el contenido del ficheroTut02-Edadescsv y que almacene lo que ha leiacutedo en un vector que hemos decidido llamarvectorEdades Y aunque no es necesario entender en detalle el funcionamiento de readtable eneste momento vamos a explicar un poco maacutes lo que hemos hecho A medida que el curso avanceiraacutes teniendo maacutes ocasiones de practicar esto e iraacute quedando cada vez maacutes claroLa opcioacuten header = FALSE sirver para indicarle a R que la tabla almacenada en el fichero no tieneuna liacutenea de cabecera (en ingleacutes header) que cuando existe suele contener los nombres de lasvariables de la tabla Ademaacutes la funcioacuten readtable sirve para leer tablas con varias columnasobteniendo como resultado un objeto de R de tipo dataframe Pero nuestro primer ejemplo esmuy sencillo y la tabla soacutelo tiene una columna Asiacute que usamos la notacioacuten [1] para indicarle aR que soacutelo queremos la primera columna de esa tabla considerada como un vectorAl ejecutar esa orden habraacutes obtenido una respuesta como esta

gt gt (vectorEdades = readtable(datosTut02-Edadescsv header = FALSE)[1])[1] 6 7 8 8 8 9 9 5 8 7 8 7 7 6 6 7 5 8 9 4 7 5 7[24] 7 5 9 4 7 7 7 8 5 8 9 7 4 6 6 6 9 8 6 7 6 7 6[47] 6 8 6 5 5 6 6 8 5 8 5 9 7 6 9 5 7 8 8 7 10 7 8[70] 7 5 6 8 8 7 3 5 6 7 5 7 7 5 8 4 8 8 8 6 7 6 6[93] 8 5 6 5 8 6 9 7

Como hemos dicho antes los nuacutemeros entre corchetes al principio de cada fila que en mi casoson [1] [24] [47] [70] y [93] son soacutelo ayudas para que podamos localizar los elementos delvector En mi pantalla cada primera fila muestra 23 nuacutemeros del vector Pero en la tuya si laventana de RStudio es de distinta anchura los nuacutemeros entre corchetes pueden ser distintos

En cualquier caso ahora el vector vectorEdades contiene la informacioacuten del fichero csv con el quehemos empezado En la Seccioacuten 4 vamos a empezar a hacer Estadiacutestica Descriptiva Pero antes tepedimos un poco maacutes de paciencia porque vamos a entretenernos un poco maacutes en los detalles delmanejo de ficheros csv con R No pretendemos ser exhaustivos ni mucho menos pero siacute queremosaprender lo suficiente como para evitarnos los problemas maacutes habituales en los casos maacutes sencillosPara cerrar este apartado es conveniente haber visto el error que se produce cuando el fichero quetratamos de leer desde R no existe o no estaacute en el directorio de trabajo

Ejercicio 4Prueba a ejecutar

errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)

y fiacutejate en el mensaje de error Solucioacuten en la paacutegina 47

Otra variante del fichero de entrada

Los ficheros csv que contienen un uacutenico vector (en lugar de una tabla de datos) pueden adoptarformatos distintos del que acabamos de ver Por ejemplo el fichero adjunto

contiene los mismos datos que Tut02-Edadescsv pero ahora los datos del vector estaacuten todos enuna fila y separados por comas Guaacuterdalo como antes en la subcarpeta datos El aspecto delfichero visto a traveacutes de un editor de texto es este (soacutelo son visibles una parte de los datos)

14

67888995878776675894757759477785897466698676766865566858597695788710787568873567577584888676685658697

Desde luego no nos podemos plantear transformar a mano este vector en uno como el anteriorLa solucioacuten que te proponemos pasa por la hoja de caacutelculo y la opcioacuten de trasponer una tablaque hemos visto en el Tutorial-00 lo leeriacuteamos en una fila de la hoja y luego habriacutea que usar elPegado especial para trasponerlo -es decir girarlo- para finalmente volver a guardarlo Alterna-tivamente hay otras soluciones sin salir de R usando una funcioacuten llamada scan o usando de nuevoreadtable y trasponiendo la tabla dentro de R Esos meacutetodos son sencillos cuando se aprendeun poco maacutes sobre R pero por el momento y para los ejemplos sencillos que encontraremos nosvamos a conformar con ese enfoque baacutesico que usa la hoja de Caacutelculo si es necesario

31 Coacutemo obtener ayuda y usar el tabulador en RStudioVamos a aprovechar estos ejemplos de lectura de ficheros csv para aprender a obtener ayuda sobrelas funciones de R La mayoriacutea de las funciones de R como la funcioacuten readtable o la funcioacutenscan que hemos mencionado al final del anterior apartado tienen muchos argumentos opcionalesY hay muchiacutesimas funciones en R (cada vez maacutes porque como veremos maacutes adelante usuarios detodo el mundo antildeaden constantemente funciones nuevas a R cuando las necesitan) No es posiblerecordar todos esas funciones cada una con sus opciones asiacute que es muy importante aprender aobtener esa informacioacuten cuando la necesitamosPara ver como obtener esa informacioacuten en RStudio vamos a usar por ejemplo la funcioacuten scanSituacuteate en una liacutenea vaciacutea de la Consola de Comandos escribe scan y a continuacioacuten mientras elcursor parpadea junto a la n final de scan pulsa la tecla del tabulador (si esto no funciona usa latecla F1 y mira el panel ayuda de RStudio) Veraacutes aparecer una ventana emergente con informacioacutensobre la funcioacuten scan como en esta figura

15

Como ves se muestra un resumen sobre la funcioacuten scan que a veces seraacute suficiente Si necesitasmaacutes detalles haz caso a la indicacioacuten que aparece al final de esa ventana y pulsa la tecla F1 Alhacerlo veraacutes que en el panel inferior derecho de RStudio aparece el fichero de ayuda de la funcioacutenscan como en esta figura

Esos ficheros de ayuda son muy uacutetiles aunque al principio pueden resultar un poco intimidatoriosya sea por un exceso de informacioacuten ya sea porque se da por supuesto que el usuario ya entiendealgunos conceptos baacutesicos de R Podemos garantizar al lector que a medida que se progresa en Rla utilidad de estos ficheros aumentaPero la utilidad de la tecla tabulador en RStudio no se acaba ahiacute Supongamos que quieres aplicarreadtable para leer el fichero Tut02-Edadescsv Pero te da pereza escribir un nombre tan largoo no recuerdas exactamente el nombre o dudas entre dos nombres no importa cual sea el motivoEmpiezas a escribir la orden tecleas

(vectorEdades2 = readtable(datos

y de nuevo justo en este punto pulsas el tabulador Entonces RStudio te ofrece en una nuevaventana emergente todos los ficheros disponibles en la carpeta datos

Y ahora puedes usar esa lista seleccionar el fichero que quieras utilizar Puedes tambieacuten teclearalguna letra maacutes del nombre para acotar auacuten maacutes la buacutesqueda cuando la carpeta contiene muchosficherosEn general la idea es que en RStudio el tabulador es tu amigo Como tendremos ocasioacuten decomprobar RStudio nos ofrece bastante ayuda para hacer maacutes coacutemodo nuestro trabajo con R yel tabulador es una de las herramientas maacutes versaacutetiles y uacutetiles

16

32 El camino contrario escribir un vector a un fichero de tipo csvHemos aprendido a leer con R vectores de datos a partir de ficheros de tipo csv Pero muchasveces despueacutes de hacer operaciones en R obtendremos como resultados nuevos vectores (y maacutesadelante en el curso otro tipo de objetos) Lo natural entonces es aprender a guardar ese vectoren un fichero de tipo csv como el fichero con el que empezamos De esa forma por ejemplo puedescompartir tus resultados con otras personas que utilicen programas distintos de R Para ello siantes usaacutebamos la funcioacuten readtable ahora vamos a usar la funcioacuten writetable de R

Como ejemplo vamos a utilizar este vector de nuacutemeros enteros

29 17 63 31 55 9 92 61 10 16 63 6 61 59 66 41 68 6 99 21 87 68 52 83 66 98 45 5024 100 83 37 44 4 97 67 56 74 75 71 55 22 86 22 93 65 38 84 54 83 100 71 99 1963 11 11 62 91 20 79 42 59 95 70 74 8 25 45 58 57 75 81 34 70 68 39 12 14 21

Ejercicio 5Usa copiar y pegar a partir de este documento pdf para crear un vector de R llamado muestraque contenga esos datos

Para guardar ese vector muestra en un fichero csv (dentro de la subcarpeta datos del directoriode trabajo) podemos utilizar la funcioacuten writetable usando como argumentos

El nombre del vector que queremos guardar que es muestra

Y el nombre del fichero en el que lo guardamos Vamos llamarlo por ejemplo Tut02-muestracsvLe indicamos a R ademaacutes que lo ponga en la subcarpeta datos

La opcioacuten colnames = FALSE o colnames = TRUE para decidir si queremos que R incluyauna liacutenea de cabecera con el nombre de la variable que en este caso es muestra (y que novamos a incluir)

La opcioacuten rownames = FALSE para evitar que R incluya nuacutemeros de fila en el fichero desalida (normalmente no querremos esos nuacutemeros)

Es decir que ejecutamos

writetable(muestrafile = datosTut02-muestracsv colnames=FALSE rownames=FALSE)

Al ejecutar esa orden el fichero que obtenemos tiene la forma deseada (de nuevo soacutelo es visible elcomienzo del fichero)

17

Puedes probar a abrirlo en Calc para ver que es un fichero de datos como los que hemos visto hastaahora

Naturalmente apenas hemos rozado el tema de la entradasalida de datos en R Pero con lo quehemos aprendido en este apartado estamos listos para empezar a hacer Estadiacutestica Descriptivausando ejemplos que no sean demasiado triviales

4 Estadiacutestica descriptiva de una variable cuantitativa condatos no agrupados

Para seguir adelante tenemos que empezar por aprender un poco maacutes sobre la forma en la que Rpermite operar con los vectores Vamos a hacerlo a traveacutes de una serie de ejercicios-ejemplos

Ejercicio 6

1 Vamos a definir dos vectores cada uno de ellos con 12 nuacutemeros enteros El primero al quellamaremos vector1 estaacute formado por

8 5 19 9 17 2 28 18 3 4 19 1

Usa copiar y pegar a partir de este fichero pdf para definir el vector1 en R

2 El segundo vector al que en un rapto de originalidad llamaremos vector2 estaacute almacenadoen el fichero

Guaacuterdalo en datos y examiacutenalo primero con un editor de texto (como el Bloc de Notas)para ver coacutemo estaacuten almacenados los datos en ese fichero Una vez hecho esto usa Calc yla funcioacuten readtable para almacenar el contenido de ese fichero csv en el vector2 de REn alguacuten momento del proceso puede que tengas que usar el pegado especial de Calc paratrasponer los datos

Solucioacuten en la paacutegina 47

41 Aritmeacutetica vectorial en RAhora vamos a sumar los dos vectores Ejecuta el comando

vector1 + vector2

para comprobar que el resultado es la suma componente a componente de los dos vectores

gt vector1 + vector2[1] 26 23 39 21 37 3 58 24 29 24 34 26

Este resultado es bastante previsible Lo que quizaacute resulteacute un poco maacutes inesperado es que simultiplicas los dos vectores tambieacuten se obtienen los productos componente a componente el primerelemento de vector1 se multiplica por el primero de vector2 el segundo por el segundo etc

gt vector1 vector2[1] 144 90 380 108 340 2 840 108 78 80 285 25

Esta forma de operar de R como veremos pronto es muy uacutetil Si lo piensas un momento cadavector numeacuterico de R se corresponde con una columna de una hoja de caacutelculo como las queusaacutebamos en el Tutorial01 Alliacute vimos que para algunas operaciones era necesario multiplicar doscolumnas elemento a elemento En Calc esa operacioacuten no es complicada pero en R es auacuten maacutes faacutecilBasta con un comando como vector1 vector2 para conseguir el objetivo Veremos muchos maacutesejemplos a lo largo del curso en los que una operacioacuten que en Calc requeririacutea bastantes pasosen R se reduce a ejecutar un uacutenico comandoEn R las operaciones con vectores siguen en general este esquema de funcionamiento componentea componente Si por ejemplo ejecutas

18

1818201220130626201525

gt vector1 + 5[1] 13 10 24 14 22 7 33 23 8 9 24 6gt 2 vector1[1] 16 10 38 18 34 4 56 36 6 8 38 2

veraacutes que en el primer caso cada uno de los elementos de vector1 se ha incrementado en 5mientras que en el segundo caso cada uno se ha multiplicado por 2 Sucede lo mismo con otrasoperaciones como elevar al cuadrado

gt vector1^2[1] 64 25 361 81 289 4 784 324 9 16 361 1

Y podemos aplicar funciones en un solo paso Por ejemplo podemos calcular el logaritmo neperianode todos los elementos de un vector en un soacutelo paso

gt log(vector1)[1] 20794415 16094379 29444390 21972246 28332133 06931472[7] 33322045 28903718 10986123 13862944 29444390 00000000

Los resultados de todas estas operaciones son de nuevo vectores Y por tanto se pueden asignara nuevas variables para utilizarlos en nuestras operaciones Por ejemplo si luego vas a necesitar loslogaritmos de vector1 puedes definir una variable para identificar ese vector llamada logVector1(e el nombre que tuacute quieras) haciendo

gt logVector1 = log(vector1)

Recuerda que si ademaacutes de la asignacioacuten quieres ver el resultado puedes rodear toda esta senten-cia con pareacutentesis De lo contrario R la ejecuta pero no imprime ninguna respuesta como ya sabes

Aunque al principio puede parecer complicado cuando te acostumbres a esta forma de trabajarcon vectores veraacutes que resulta muy coacutemoda y eficiente

Generando vectores de nuacutemeros enteros consecutivos

Hay muchas ocasiones en que para alguna operacioacuten necesitamos un vector que contenga losnuacutemeros enteros consecutivos del 1 al n o del 0 al n etc En R esto es muy faacutecil de hacer Porejemplo para conseguir un vector con los nuacutemeros del 1 al 15 basta con ejecutar

gt 115[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Esa notacioacuten con los dos puntos permite generar vectores en los que cada elemento es igual alanterior maacutes 1 Otro ejemplo

gt -713[1] -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13

O incluso cuando los puntos de partida no son enteros

gt 1575[1] 15 25 35 45 55 65 75gt 1574[1] 15 25 35 45 55 65

iquestVes la diferencia entre estos dos casos

Es muy posible que te esteacutes preguntando iquesty si quiero ir avanzando de 2 en 2 o quiero ir hacia atraacutes(ldquoavanzandordquo de minus2 en minus2 por ejemplo) Pronto cuando hayamos aprendido un poco maacutes volve-remos sobre esto y comprobaremos que R nos ofrece un cataacutelogo de herramientas extremadamentepotentes para fabricar vectores de acuerdo con nuestros deseos y necesidadesLos vectores fabricados con este meacutetodo son vectores iguales que los demaacutes y se pueden asignar avariables operar con ellos etc

19

Ejercicio 7

1 Fabrica un vector con los cuadrados de los nuacutemeros del 1 al 10 y asiacutegnalo a la variablecuadrados Usa los pareacutentesis para ver el resultado de la asignacioacuten

2 Haz lo mismo con los cuadrados de los nuacutemeros del 2 al 11 y un vector cuadrados2

3 Resta los vectores cuadrados2 - cuadrados iquestObservas algo interesante

Solucioacuten en la paacutegina 47

Funciones vectoriales

Hemos visto antes que se puede aplicar una funcioacuten como la raiacutez cuadrada a un vector y seobtiene como resultado otro vector con las raiacuteces cuadradas elemento a elemento Pero hay otrotipo de funciones que permiten hacer caacutelculos con el vector en conjunto Por ejemplo antes hemosfabricado el vector -713 y la funcioacuten length nos dice cuantos elementos tiene ese vector

gt length(-713)[1] 21

En el Ejercicio 3 (paacuteg 13) nos preguntaacutebamos cuantos elementos teniacutea el vector vectorEdades quehabiacuteamos cargado desde el fichero csv Puedes obtener la respuesta con length(vectorEdades)Para comprobarlo aseguacuterate de que has creado el vector llamado vectorEdades y ejecuta estaorden

gt length(vectorEdades)[1] 100

Como ves el resultado de length es el esperado

Vamos a conocer otra funcioacuten llamada sum que sirve para calcular la suma de todos los elementosde un vector

gt sum(vectorEdades)[1] 675

Ejercicio 8iquestCuaacutento vale la suma de los cuadrados de los nuacutemeros del 1 al 100 Solucioacuten en la paacutegina 47

A lo mejor te ha pasado desapercibido pero con las funciones length y sum estamos por fin encondiciones de empezar a hacer Estadiacutestica Descriptiva Por ejemplo podemos calcular la mediaaritmeacutetica de vectorEdades

gt ( mediaEdades = sum(vectorEdades) length(vectorEdades) )[1] 675

Y una vez que tenemos la media podemos calcular la varianza poblacional Para que resulte maacutesclaro vamos a mostrarte el proceso paso a paso aunque al final lo ejecutaremos en un soacutelo paso

1 Empezamos restando la media que estaacute en la variable mediaEdades de cada uno de loselementos de vectorEdades

vectorEdades - mediaEdades

El resultado es un vector de diferencias

2 Ahora elevamos cada una de esas diferencias al cuadrado

( vectorEdades - mediaEdades )^2

El resultado de este paso es de nuevo un vector ahora con las diferencias al cuadrado Fiacutejateen el pareacutentesis para garantizar que elevamos al cuadrado la diferencia Si no incluyeacuteramosel pareacutentesis iquestqueacute calculariacuteamos

20

3 A continuacioacuten sumamos todas esas diferencias al cuadrado usando la funcioacuten sum

sum( ( vectorEdades - mediaEdades )^2)

De nuevo el pareacutentesis es fundamental para que el cuadrado del vector de diferencias secalcule antes que la suma En este paso el resultado ya no es un vector sino un nuacutemero

4 Por uacuteltimo dividimos esa suma por n el nuacutemero de elementos de vectorEdades que seobtiene con la funcioacuten length

sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades)

El resultado de estos pasos se puede condensar en un soacutelo comando de R en el que a la vezcalculamos la varianza y la asignamos a una variable

gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades) )[1] 19875

Ejercicio 9

1 Calcula la desviacioacuten tiacutepica (poblacional) de vectorEdades

2 Calcula la cuasivarianza y cuasidesviacioacuten tiacutepica (muestrales) de vectorEdades

3 iquestQueacute sucede si en el tercer paso ejecutas el siguiente comandosum( vectorEdades - mediaEdades )^2iquestPor queacute sucede esto

Solucioacuten en la paacutegina 48

Con estos caacutelculos hemos empezado a hacer Estadiacutestica con R Naturalmente nos queda muchiacutesimoque aprender sobre los vectores de R Por ejemplo como se accede a una componente individualdel vector para responder a preguntas como ldquoiquestCuaacutento vale el quinto elemento del vectorrdquo Maacutesen general aprenderemos a extraer aquellos elementos del vector que cumplan alguna condicioacutenrespondiendo a preguntas como ldquoiquestQueacute elementos del vector son mayores que 7rdquo

42 Y por fin hagamos Estadiacutestica DescriptivaEn esta seccioacuten vamos a trabajar con un vector de datos contenido en este fichero adjunto

Este vector contiene los datos de la variable var3 del fichero Tut01-PracticaConCalccsv queya hemos utilizado en el Tutorial-00 para aprender a hacer Estadiacutestica Descriptiva con Calc Enesta seccioacuten vamos a reproducir los resultados que obtuvimos alliacute pero esta vez usando R Parapreparar el terreno vamos a hacer limpieza

Ejercicio 10

1 Cierra Rstudio y vuelve a abrirlo para limpiar la memora del sistema El trabajo que hemoshecho hasta ahora se perderaacute (aunque los comandos siguen en el Historial de Comandos queya vimos)

2 Establece el Directorio de Trabajo (por ejemplo el Escritorio) y aseguacuterate de que Tut02-var3csvestaacute guardado en la subcarpeta datos de ese directorio

3 Carga de nuevo el contenido de ese fichero en un vector var3 de R

Solucioacuten en la paacutegina 48

Veraacutes en lo que sigue que siempre que calculamos un objeto le asignamos una variable Eso permiteahorrarse la repeticioacuten innecesaria de caacutelculos si maacutes adelante volvemos a necesitar ese objeto Yen algunos casos como veremos maacutes adelante al hacer esto podemos acceder a propiedades delobjeto calculado que R no muestra en su respuesta por defecto

21

4 138 134 134 135 135 133 136 136 132 134 134 133 133 133 132 136 134 135 132 135 136 135 132 136 134 135 133 134 134 134 1310 136 138 134 135 137 133 135 138 136 137 135 134 137 135 136 138 137 134 133 135 135 134 131 135 137 133 133 137 136 135 135 132 138 135 135 135 136 135 133 1311 136 1310 134 131 133 138 139 135 134 1310 134 134 137 135 134 133 132 135 132 136 135 134 133 139 136 135 134 135 132 132 138 134 133 136 138 134 134 134 138 134 132 135 1310 136 1312 135 139 135 138 138 135 132 135 1310 136 135 136 135 135 137 134 133 134 133 133 134 133 133 133 133 137 138 135 134 135 134 135 137 135 133 134 134 137 133 132 135 137 135 134 136 132 135 132 136 1310 134 132 139 134 136 136 132 137 134 138 135 135 134 134 137 134 136 136 135 134 133 135 133 133 136 132 133 134 138 138 137 137 136 135 1310 134 134 134 138 136 134 136 137 135 135 136 138 134 138 134 135 137 136 134 137 137 135 137 132 136 135 133 135 136 130 133 135 135 137 134 137 131 135 136 135 138 132 134 136 139 137 1310 134 135 136 132 135 135 135 1313 133 136 133 136 135 130 1310 134 136 136 134 131 133 135 137 136 133 135 133 134 132 132 138 138 134 136 135 135 134 133 139 134 139 136 1311 133 132 132 136 138 1310 133 137 133 134 135 139 133 135 133 134 138 139 132 138 133 133 137 138 136 133 135 134 132 1311 137 137 136 134 133 135 1310 135 134 135 133 135 136 135 139 135 134 135 135 134 133 137 134 1310 135 134 132 139 134 137 133 135 134 131 136 135 136 134 138 135 135 138 138 134 132 135 133 134 138 138 135 138 132 1311 135 134 134 136 139 1310 137 134 137 132 133 135 1310 135 135 133 135 136 134 134 136 135 137 136 136 134 133 134 135 132 134 136 139 133 135 133 136 133 133 135 134 134 134 137 135 139 1310 133 134 136 131 137 138 135 133 133 135 133 133 137 136 135 135 138 134 139 136 135 135 138 134 130 133 137 133 134 1311 132 137 133 136 135 133 134 133 133 132 138 133 134 134 134 134 138 138 137 136 132 132 137 135 133 135 138 135 134 135 134 135 134 1312 133 135 133 133 133 132 134 131 139 135 135 135 138 138 135 138 133 134 133 136 136 135 134 133 133 135 133 137 135 132 133 133 132 131 132 136 137 130 136 133 134 1310 132 136 137 134 133 132 138 133 135 133 135 136 132 134 134 133 135 135 135 134 134 136 133 132 138 1310 135 135 132 132 137 136 134 135 134 134 136 134 136 135 133 137 137 136 137 134 134 137 133 130 134 136 135 137 136 136 135 137 134 134 135 136 136 135 136 132 134 133 139 135 133 137 135 136 137 136 136 136 134 135 137 137 133 134 137 137 136 133 134 137 131 135 136 133 137 133 135 133 137 138 133 137 132 135 134 133 132 135 134 134 135 133 134 139 135 134 139 137 133 132 133 134 133 134 135 135 138 134 135 134 135 139 137 133 133 132 136 132 138 135 132 137 134 135 136 132 134 135 135 133 135 136 137 135 138 132 131 137 135 135 138 134 137 136 139 1310 137 134 131 136 132 136 137 133 135 137 135 132 135 135 133 133 137 134 133 133 131 138 139 132 134 138 135 136 138 137 1310 138 133 134 134 135 134 134 135 136 135 134 134 135 133 136 135 137 132 133 139 132 133 137 136 134 137 131 135 134 132 134 138 135 134 131 132 134 135 136 133 134 138 134 132 135 134 132 134 133 136 135 138 133 139 1310 134 133 133 137 137 136 137 133 133 133 135 139 136 136 137 136 135 132 132 139 136 132 139 132 137 135 133 138 137 135 134 136 131 133 135 133 134 137 135 134 132 136 136 136 137 133 132 135 134 135 134 137 134 133 133 134 132 134 135 134 134 136 134 135 138 133 135 135 138 133 135 134 135 135 138 1311 132 134 134 136 133 135 133 136 132 131 136 134 136 132 136 136 136 136 130 136 134 134 131 138 131 1310 135 139 136 132 136 138 135 138 134 132 134 133 136 137 133 133 133 133 137 136 135 133 139 133 132 135 136 136 134 132 132 135 137 136 136 136 138 137 137 135 135 131 136 133 136 135 133 134 130 133 135 136 137 138 136 134 135 132 137 132 137 132 133 134 135 138 134 136 133 135 135 139 134 134 136 134 134 134 135 134 133 135 135 138 133 136 136 134 135 134 134 138 136 133 137 132 134 137 136 135 133 134 133 135 134 134 136 134 133 137 133 135 135 136 135 138 134 136 132 137 136 138 134 136 136 137 136 136 135 136 1310 138 133 137 135 136 137 134 136 133 134 133 132 132 134 137 132 132 133 132 138 134 134 135 135 139 135 134 132 134 135 134 139 137 133 134 134 135 133 133 137 138 135 139 133 138 136 136 134 133 136 135 1314 137 133 137 135 136 134 134 136 133 135 134 135 136 136 135 133 135 131 135 137 135 136 133 137 135 134 133 134 134 134 134 134 136 132 134 136 136 137 139 134 138 133 133 132 135 131 134 133 137 133 133 134 139 138 134 134 137 137 135 136 134 139 137 138 134 133 134 134 135 137 134 135 138 133 132 134 1310 133 135 134 132 138 137 136 135 138 1314 139 135 135 131 134 135 134 135 135 135 133 136 135 135 132 136 139 133 133 136 134 132 132 137 136 131 137 135 135 134 1313 1310 132 134 134 133 138 135 134 133 136 136 136 1310 134 137 136 138 139 137 135 134 134 137 137 138 133 134 135 137 135 136 1310 136 136 138 133 136 133 134 135 135 134 136 133 136 136 137 134 135 1316 136 136 132 136 136 133 134 133 137 134 135 134 133 138 134 1310 136 136 136 137 134 136 137 132 138 136 131 132 134 135 130 134 135 135 137 130 136 135 131 136 137 133 137 135 139 138 135 139 133 137 139 133 136 137 136 138 134 1310 136 134 133 139 136 137 133 13713

Rango maacuteximo y miacutenimo

Para empezar vamos a aprender tres nuevas funciones de R que nos permiten calcular esos tresvalores

gt (minimo = min(var3) )[1] 0gt (maximo = max(var3) )[1] 16gt (rango = range(var3) )[1] 0 16

El funcionamiento de las dos primeras es evidente La funcioacuten range devuelve un vector formadopor el maacuteximo y el miacutenimo

Tablas de frecuencia Clases de objetos en R

La tabla de frecuencia absoluta de var3 se obtiene usando la funcioacuten table de esta forma tansencilla

gt ( tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

La primera fila contiene los elementos de var3 y en la segunda aparece la frecuencia de cada unode ellos Puedes comprobar que son los mismos resultados que obtuvimos con Calc en la paacutegina10 del Tutorial01 Aunque alliacute desde luego el proceso fue maacutes laborioso

A lo mejor te has dado cuenta de que el formato de la respuesta es diferente de los que hemosobtenido hasta ahora Para empezar la respuesta no empieza con el [1] al que ya nos vamosacostumbrando El motivo de esto es que el objeto que hemos obtenido como respuesta no es unvector sino una tabla Ya dijimos que R utiliza distintos tipos de objetos con fines distintosiquestCoacutemo podemos saber de queacute clase es un objeto Pues usando una funcioacuten de R oportunamentellamada class Si la usamos con el vector var3 y con su tabla de frecuencias obtenemos

gt class(var3)[1] numericgt class(tablaFrecAbs)[1] table

El vector var3 es de clase numeric porque es un vector de nuacutemeros Y la tabla de frecuencias esde clase table Veremos a lo largo del curso otros objetos de tipo tabular como las matrices (clasematrix) los conjuntos de datos (clase dataframe) y los arraysAunque las tablas son objetos distintos de los vectores tienen algunas propiedades en comuacuten yalgunas de las funciones que hemos usado con vectores tambieacuten se pueden usar con tablas

Ejercicio 11Aplica las funciones length sum min max y range a la tabla tablaFrecAbs Solucioacuten en la paacutegina48

Siguiendo con los parecidos entre tablas y vectores puedes multiplicar (o dividir) una tabla porun nuacutemero y la operacioacuten se haraacute elemento a elemento

gt 2 tablaFrecAbsvar30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1618 50 200 376 488 492 372 262 174 86 56 12 4 4 4 2

Como ves cada frecuencia se multiplica por 2 Esta propiedad de las tablas permite obtener deforma muy sencilla la tabla de frecuencias relativa de var3 Como primer paso vamos a guardarla longitud de var3 en la variable n

22

gt ( n = length( var3 ) )[1] 1300

Y ahora podemos dividir la tabla por n para conseguir la tabla de frecuencias relativas (hemosestrechado la Consola de Comandos para que el resultado cupiera en esta paacutegina)

gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 400069230769 00192307692 00769230769 01446153846 01876923077

5 6 7 8 901892307692 01430769231 01007692308 00669230769 00330769231

10 11 12 13 1400215384615 00046153846 00015384615 00015384615 00015384615

1600007692308

Ejercicio 12Ya sabemos cuanto debe sumar esta tabla de frecuencias relativas Comprueacutebalo Solucioacuten en lapaacutegina 48

Si lo que queremos es una tabla de frecuencias acumuladas debemos emplear la funcioacuten cumsum

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Ejercicio 13La uacuteltima tabla que falta es la de frecuencias relativas acumuladas pero ya tienes todos los ingre-dientes para obtenerla de dos maneras diferentes Hazlo y comprueba si dan el mismo resultadoSi no es asiacute iquesta queacute crees que se debe y cuaacutel es la mejor opcioacuten Asigna el resultado a la variabletablaFrecRelAcu Solucioacuten en la paacutegina 49

Graacuteficos de columnas y diagramas de caja (boxplot) Argumentos con nombre

Vamos a fabricar nuestros primeros graacuteficos con R En concreto vamos a dibujar un graacutefico debarras a partir de la tabla de frecuencias de var3 usando la funcioacuten barplot de R

gt barplot(tablaFrecAbs)

Al ejecutar este comando no debes ver ninguna salida en la Consola de Comandos En su lugaren el panel inferior derecho de RStudio concretamente en la ventana Plots apareceraacute el graacuteficodeseado El resultado puede variar dependiendo de la anchura de tu ventana de RStudio

23

Hemos destacado ademaacutes en la figura los dos botones Zoom y Export que te permiten respecti-vamente ver una versioacuten ampliada de la Figura (que se redimensiona dinaacutemicamente si cambiasla ventana) y guardar esa figura como un fichero de graacuteficos que puedes insertar en cualquierdocumento editar con un programa de manipulacioacuten de graacuteficos etceacuteteraLos graacuteficos de R se pueden controlar hasta en sus detalles maacutes miacutenimos Como aperitivo miacutenimovamos a antildeadir algo de color al graacutefico

gt barplot(tablaFrecAbs col = heatcolors(15))

El resultado es esta figura

Las posibilidades de control de los graacuteficos de R son como decimos inmensas y pueden llegar aser abrumadoras Hay libros de cientos de paacuteginas dedicados a este tema como el R GraphicsCookbook de W Chang (ver las referencias del curso) Nosotros a lo largo de los tutoriales delcurso vamos a aprender algo maacutes aunque a penas nos podremos limitar a rozar la superficie delo que se puede llegar a hacerEn la Seccioacuten 231 del libro hemos descrito los diagramas de cajas o boxplots (recuerda la Figura22 de la paacuteg 36 del libro) Y en el Tutorial-01 dijimos que con Calc no es faacutecil dibujar ese tipode diagramas En cambio con R no podriacutea ser maacutes faacutecil

gt boxplot(var3)

Y el resultado es esta figura

24

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

setwd(CUsersFernandoDesktop)

Este es el resultado en mi ordenador (de ahiacute el nombre de usuario) usando Windows 10 Enversiones maacutes antiguas de Windows o en una maacutequina con Linux o un Mac el comando seraacuteligeramente distinto Cuando tengamos maacutes praacutectica aprenderemos otras formas de seleccionar eldirectorio de trabajo o incluso de utilizar ficheros situados fuera de ese directorio de trabajo Peropor el momento resulta maacutes coacutemodo dejar que RStudio haga ese trabajo para nosotrosAhora R ya sabe doacutende estaacute el fichero que nos interesa pero todaviacutea no sabe cual es Para ello vamosa utilizar la funcioacuten readtable de R Aunque esta funcioacuten tiene muchas opciones disponiblesnuestro primer uso de ella seraacute bastante sencillo Copia y ejecuta el siguiente coacutedigo en RStudio

(vectorEdades = readtable(datosTut02-Edadescsvheader = FALSE)[1])

En esta instruccioacuten le decimos a R que use la funcioacuten readtable para leer el contenido del ficheroTut02-Edadescsv y que almacene lo que ha leiacutedo en un vector que hemos decidido llamarvectorEdades Y aunque no es necesario entender en detalle el funcionamiento de readtable eneste momento vamos a explicar un poco maacutes lo que hemos hecho A medida que el curso avanceiraacutes teniendo maacutes ocasiones de practicar esto e iraacute quedando cada vez maacutes claroLa opcioacuten header = FALSE sirver para indicarle a R que la tabla almacenada en el fichero no tieneuna liacutenea de cabecera (en ingleacutes header) que cuando existe suele contener los nombres de lasvariables de la tabla Ademaacutes la funcioacuten readtable sirve para leer tablas con varias columnasobteniendo como resultado un objeto de R de tipo dataframe Pero nuestro primer ejemplo esmuy sencillo y la tabla soacutelo tiene una columna Asiacute que usamos la notacioacuten [1] para indicarle aR que soacutelo queremos la primera columna de esa tabla considerada como un vectorAl ejecutar esa orden habraacutes obtenido una respuesta como esta

gt gt (vectorEdades = readtable(datosTut02-Edadescsv header = FALSE)[1])[1] 6 7 8 8 8 9 9 5 8 7 8 7 7 6 6 7 5 8 9 4 7 5 7[24] 7 5 9 4 7 7 7 8 5 8 9 7 4 6 6 6 9 8 6 7 6 7 6[47] 6 8 6 5 5 6 6 8 5 8 5 9 7 6 9 5 7 8 8 7 10 7 8[70] 7 5 6 8 8 7 3 5 6 7 5 7 7 5 8 4 8 8 8 6 7 6 6[93] 8 5 6 5 8 6 9 7

Como hemos dicho antes los nuacutemeros entre corchetes al principio de cada fila que en mi casoson [1] [24] [47] [70] y [93] son soacutelo ayudas para que podamos localizar los elementos delvector En mi pantalla cada primera fila muestra 23 nuacutemeros del vector Pero en la tuya si laventana de RStudio es de distinta anchura los nuacutemeros entre corchetes pueden ser distintos

En cualquier caso ahora el vector vectorEdades contiene la informacioacuten del fichero csv con el quehemos empezado En la Seccioacuten 4 vamos a empezar a hacer Estadiacutestica Descriptiva Pero antes tepedimos un poco maacutes de paciencia porque vamos a entretenernos un poco maacutes en los detalles delmanejo de ficheros csv con R No pretendemos ser exhaustivos ni mucho menos pero siacute queremosaprender lo suficiente como para evitarnos los problemas maacutes habituales en los casos maacutes sencillosPara cerrar este apartado es conveniente haber visto el error que se produce cuando el fichero quetratamos de leer desde R no existe o no estaacute en el directorio de trabajo

Ejercicio 4Prueba a ejecutar

errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)

y fiacutejate en el mensaje de error Solucioacuten en la paacutegina 47

Otra variante del fichero de entrada

Los ficheros csv que contienen un uacutenico vector (en lugar de una tabla de datos) pueden adoptarformatos distintos del que acabamos de ver Por ejemplo el fichero adjunto

contiene los mismos datos que Tut02-Edadescsv pero ahora los datos del vector estaacuten todos enuna fila y separados por comas Guaacuterdalo como antes en la subcarpeta datos El aspecto delfichero visto a traveacutes de un editor de texto es este (soacutelo son visibles una parte de los datos)

14

67888995878776675894757759477785897466698676766865566858597695788710787568873567577584888676685658697

Desde luego no nos podemos plantear transformar a mano este vector en uno como el anteriorLa solucioacuten que te proponemos pasa por la hoja de caacutelculo y la opcioacuten de trasponer una tablaque hemos visto en el Tutorial-00 lo leeriacuteamos en una fila de la hoja y luego habriacutea que usar elPegado especial para trasponerlo -es decir girarlo- para finalmente volver a guardarlo Alterna-tivamente hay otras soluciones sin salir de R usando una funcioacuten llamada scan o usando de nuevoreadtable y trasponiendo la tabla dentro de R Esos meacutetodos son sencillos cuando se aprendeun poco maacutes sobre R pero por el momento y para los ejemplos sencillos que encontraremos nosvamos a conformar con ese enfoque baacutesico que usa la hoja de Caacutelculo si es necesario

31 Coacutemo obtener ayuda y usar el tabulador en RStudioVamos a aprovechar estos ejemplos de lectura de ficheros csv para aprender a obtener ayuda sobrelas funciones de R La mayoriacutea de las funciones de R como la funcioacuten readtable o la funcioacutenscan que hemos mencionado al final del anterior apartado tienen muchos argumentos opcionalesY hay muchiacutesimas funciones en R (cada vez maacutes porque como veremos maacutes adelante usuarios detodo el mundo antildeaden constantemente funciones nuevas a R cuando las necesitan) No es posiblerecordar todos esas funciones cada una con sus opciones asiacute que es muy importante aprender aobtener esa informacioacuten cuando la necesitamosPara ver como obtener esa informacioacuten en RStudio vamos a usar por ejemplo la funcioacuten scanSituacuteate en una liacutenea vaciacutea de la Consola de Comandos escribe scan y a continuacioacuten mientras elcursor parpadea junto a la n final de scan pulsa la tecla del tabulador (si esto no funciona usa latecla F1 y mira el panel ayuda de RStudio) Veraacutes aparecer una ventana emergente con informacioacutensobre la funcioacuten scan como en esta figura

15

Como ves se muestra un resumen sobre la funcioacuten scan que a veces seraacute suficiente Si necesitasmaacutes detalles haz caso a la indicacioacuten que aparece al final de esa ventana y pulsa la tecla F1 Alhacerlo veraacutes que en el panel inferior derecho de RStudio aparece el fichero de ayuda de la funcioacutenscan como en esta figura

Esos ficheros de ayuda son muy uacutetiles aunque al principio pueden resultar un poco intimidatoriosya sea por un exceso de informacioacuten ya sea porque se da por supuesto que el usuario ya entiendealgunos conceptos baacutesicos de R Podemos garantizar al lector que a medida que se progresa en Rla utilidad de estos ficheros aumentaPero la utilidad de la tecla tabulador en RStudio no se acaba ahiacute Supongamos que quieres aplicarreadtable para leer el fichero Tut02-Edadescsv Pero te da pereza escribir un nombre tan largoo no recuerdas exactamente el nombre o dudas entre dos nombres no importa cual sea el motivoEmpiezas a escribir la orden tecleas

(vectorEdades2 = readtable(datos

y de nuevo justo en este punto pulsas el tabulador Entonces RStudio te ofrece en una nuevaventana emergente todos los ficheros disponibles en la carpeta datos

Y ahora puedes usar esa lista seleccionar el fichero que quieras utilizar Puedes tambieacuten teclearalguna letra maacutes del nombre para acotar auacuten maacutes la buacutesqueda cuando la carpeta contiene muchosficherosEn general la idea es que en RStudio el tabulador es tu amigo Como tendremos ocasioacuten decomprobar RStudio nos ofrece bastante ayuda para hacer maacutes coacutemodo nuestro trabajo con R yel tabulador es una de las herramientas maacutes versaacutetiles y uacutetiles

16

32 El camino contrario escribir un vector a un fichero de tipo csvHemos aprendido a leer con R vectores de datos a partir de ficheros de tipo csv Pero muchasveces despueacutes de hacer operaciones en R obtendremos como resultados nuevos vectores (y maacutesadelante en el curso otro tipo de objetos) Lo natural entonces es aprender a guardar ese vectoren un fichero de tipo csv como el fichero con el que empezamos De esa forma por ejemplo puedescompartir tus resultados con otras personas que utilicen programas distintos de R Para ello siantes usaacutebamos la funcioacuten readtable ahora vamos a usar la funcioacuten writetable de R

Como ejemplo vamos a utilizar este vector de nuacutemeros enteros

29 17 63 31 55 9 92 61 10 16 63 6 61 59 66 41 68 6 99 21 87 68 52 83 66 98 45 5024 100 83 37 44 4 97 67 56 74 75 71 55 22 86 22 93 65 38 84 54 83 100 71 99 1963 11 11 62 91 20 79 42 59 95 70 74 8 25 45 58 57 75 81 34 70 68 39 12 14 21

Ejercicio 5Usa copiar y pegar a partir de este documento pdf para crear un vector de R llamado muestraque contenga esos datos

Para guardar ese vector muestra en un fichero csv (dentro de la subcarpeta datos del directoriode trabajo) podemos utilizar la funcioacuten writetable usando como argumentos

El nombre del vector que queremos guardar que es muestra

Y el nombre del fichero en el que lo guardamos Vamos llamarlo por ejemplo Tut02-muestracsvLe indicamos a R ademaacutes que lo ponga en la subcarpeta datos

La opcioacuten colnames = FALSE o colnames = TRUE para decidir si queremos que R incluyauna liacutenea de cabecera con el nombre de la variable que en este caso es muestra (y que novamos a incluir)

La opcioacuten rownames = FALSE para evitar que R incluya nuacutemeros de fila en el fichero desalida (normalmente no querremos esos nuacutemeros)

Es decir que ejecutamos

writetable(muestrafile = datosTut02-muestracsv colnames=FALSE rownames=FALSE)

Al ejecutar esa orden el fichero que obtenemos tiene la forma deseada (de nuevo soacutelo es visible elcomienzo del fichero)

17

Puedes probar a abrirlo en Calc para ver que es un fichero de datos como los que hemos visto hastaahora

Naturalmente apenas hemos rozado el tema de la entradasalida de datos en R Pero con lo quehemos aprendido en este apartado estamos listos para empezar a hacer Estadiacutestica Descriptivausando ejemplos que no sean demasiado triviales

4 Estadiacutestica descriptiva de una variable cuantitativa condatos no agrupados

Para seguir adelante tenemos que empezar por aprender un poco maacutes sobre la forma en la que Rpermite operar con los vectores Vamos a hacerlo a traveacutes de una serie de ejercicios-ejemplos

Ejercicio 6

1 Vamos a definir dos vectores cada uno de ellos con 12 nuacutemeros enteros El primero al quellamaremos vector1 estaacute formado por

8 5 19 9 17 2 28 18 3 4 19 1

Usa copiar y pegar a partir de este fichero pdf para definir el vector1 en R

2 El segundo vector al que en un rapto de originalidad llamaremos vector2 estaacute almacenadoen el fichero

Guaacuterdalo en datos y examiacutenalo primero con un editor de texto (como el Bloc de Notas)para ver coacutemo estaacuten almacenados los datos en ese fichero Una vez hecho esto usa Calc yla funcioacuten readtable para almacenar el contenido de ese fichero csv en el vector2 de REn alguacuten momento del proceso puede que tengas que usar el pegado especial de Calc paratrasponer los datos

Solucioacuten en la paacutegina 47

41 Aritmeacutetica vectorial en RAhora vamos a sumar los dos vectores Ejecuta el comando

vector1 + vector2

para comprobar que el resultado es la suma componente a componente de los dos vectores

gt vector1 + vector2[1] 26 23 39 21 37 3 58 24 29 24 34 26

Este resultado es bastante previsible Lo que quizaacute resulteacute un poco maacutes inesperado es que simultiplicas los dos vectores tambieacuten se obtienen los productos componente a componente el primerelemento de vector1 se multiplica por el primero de vector2 el segundo por el segundo etc

gt vector1 vector2[1] 144 90 380 108 340 2 840 108 78 80 285 25

Esta forma de operar de R como veremos pronto es muy uacutetil Si lo piensas un momento cadavector numeacuterico de R se corresponde con una columna de una hoja de caacutelculo como las queusaacutebamos en el Tutorial01 Alliacute vimos que para algunas operaciones era necesario multiplicar doscolumnas elemento a elemento En Calc esa operacioacuten no es complicada pero en R es auacuten maacutes faacutecilBasta con un comando como vector1 vector2 para conseguir el objetivo Veremos muchos maacutesejemplos a lo largo del curso en los que una operacioacuten que en Calc requeririacutea bastantes pasosen R se reduce a ejecutar un uacutenico comandoEn R las operaciones con vectores siguen en general este esquema de funcionamiento componentea componente Si por ejemplo ejecutas

18

1818201220130626201525

gt vector1 + 5[1] 13 10 24 14 22 7 33 23 8 9 24 6gt 2 vector1[1] 16 10 38 18 34 4 56 36 6 8 38 2

veraacutes que en el primer caso cada uno de los elementos de vector1 se ha incrementado en 5mientras que en el segundo caso cada uno se ha multiplicado por 2 Sucede lo mismo con otrasoperaciones como elevar al cuadrado

gt vector1^2[1] 64 25 361 81 289 4 784 324 9 16 361 1

Y podemos aplicar funciones en un solo paso Por ejemplo podemos calcular el logaritmo neperianode todos los elementos de un vector en un soacutelo paso

gt log(vector1)[1] 20794415 16094379 29444390 21972246 28332133 06931472[7] 33322045 28903718 10986123 13862944 29444390 00000000

Los resultados de todas estas operaciones son de nuevo vectores Y por tanto se pueden asignara nuevas variables para utilizarlos en nuestras operaciones Por ejemplo si luego vas a necesitar loslogaritmos de vector1 puedes definir una variable para identificar ese vector llamada logVector1(e el nombre que tuacute quieras) haciendo

gt logVector1 = log(vector1)

Recuerda que si ademaacutes de la asignacioacuten quieres ver el resultado puedes rodear toda esta senten-cia con pareacutentesis De lo contrario R la ejecuta pero no imprime ninguna respuesta como ya sabes

Aunque al principio puede parecer complicado cuando te acostumbres a esta forma de trabajarcon vectores veraacutes que resulta muy coacutemoda y eficiente

Generando vectores de nuacutemeros enteros consecutivos

Hay muchas ocasiones en que para alguna operacioacuten necesitamos un vector que contenga losnuacutemeros enteros consecutivos del 1 al n o del 0 al n etc En R esto es muy faacutecil de hacer Porejemplo para conseguir un vector con los nuacutemeros del 1 al 15 basta con ejecutar

gt 115[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Esa notacioacuten con los dos puntos permite generar vectores en los que cada elemento es igual alanterior maacutes 1 Otro ejemplo

gt -713[1] -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13

O incluso cuando los puntos de partida no son enteros

gt 1575[1] 15 25 35 45 55 65 75gt 1574[1] 15 25 35 45 55 65

iquestVes la diferencia entre estos dos casos

Es muy posible que te esteacutes preguntando iquesty si quiero ir avanzando de 2 en 2 o quiero ir hacia atraacutes(ldquoavanzandordquo de minus2 en minus2 por ejemplo) Pronto cuando hayamos aprendido un poco maacutes volve-remos sobre esto y comprobaremos que R nos ofrece un cataacutelogo de herramientas extremadamentepotentes para fabricar vectores de acuerdo con nuestros deseos y necesidadesLos vectores fabricados con este meacutetodo son vectores iguales que los demaacutes y se pueden asignar avariables operar con ellos etc

19

Ejercicio 7

1 Fabrica un vector con los cuadrados de los nuacutemeros del 1 al 10 y asiacutegnalo a la variablecuadrados Usa los pareacutentesis para ver el resultado de la asignacioacuten

2 Haz lo mismo con los cuadrados de los nuacutemeros del 2 al 11 y un vector cuadrados2

3 Resta los vectores cuadrados2 - cuadrados iquestObservas algo interesante

Solucioacuten en la paacutegina 47

Funciones vectoriales

Hemos visto antes que se puede aplicar una funcioacuten como la raiacutez cuadrada a un vector y seobtiene como resultado otro vector con las raiacuteces cuadradas elemento a elemento Pero hay otrotipo de funciones que permiten hacer caacutelculos con el vector en conjunto Por ejemplo antes hemosfabricado el vector -713 y la funcioacuten length nos dice cuantos elementos tiene ese vector

gt length(-713)[1] 21

En el Ejercicio 3 (paacuteg 13) nos preguntaacutebamos cuantos elementos teniacutea el vector vectorEdades quehabiacuteamos cargado desde el fichero csv Puedes obtener la respuesta con length(vectorEdades)Para comprobarlo aseguacuterate de que has creado el vector llamado vectorEdades y ejecuta estaorden

gt length(vectorEdades)[1] 100

Como ves el resultado de length es el esperado

Vamos a conocer otra funcioacuten llamada sum que sirve para calcular la suma de todos los elementosde un vector

gt sum(vectorEdades)[1] 675

Ejercicio 8iquestCuaacutento vale la suma de los cuadrados de los nuacutemeros del 1 al 100 Solucioacuten en la paacutegina 47

A lo mejor te ha pasado desapercibido pero con las funciones length y sum estamos por fin encondiciones de empezar a hacer Estadiacutestica Descriptiva Por ejemplo podemos calcular la mediaaritmeacutetica de vectorEdades

gt ( mediaEdades = sum(vectorEdades) length(vectorEdades) )[1] 675

Y una vez que tenemos la media podemos calcular la varianza poblacional Para que resulte maacutesclaro vamos a mostrarte el proceso paso a paso aunque al final lo ejecutaremos en un soacutelo paso

1 Empezamos restando la media que estaacute en la variable mediaEdades de cada uno de loselementos de vectorEdades

vectorEdades - mediaEdades

El resultado es un vector de diferencias

2 Ahora elevamos cada una de esas diferencias al cuadrado

( vectorEdades - mediaEdades )^2

El resultado de este paso es de nuevo un vector ahora con las diferencias al cuadrado Fiacutejateen el pareacutentesis para garantizar que elevamos al cuadrado la diferencia Si no incluyeacuteramosel pareacutentesis iquestqueacute calculariacuteamos

20

3 A continuacioacuten sumamos todas esas diferencias al cuadrado usando la funcioacuten sum

sum( ( vectorEdades - mediaEdades )^2)

De nuevo el pareacutentesis es fundamental para que el cuadrado del vector de diferencias secalcule antes que la suma En este paso el resultado ya no es un vector sino un nuacutemero

4 Por uacuteltimo dividimos esa suma por n el nuacutemero de elementos de vectorEdades que seobtiene con la funcioacuten length

sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades)

El resultado de estos pasos se puede condensar en un soacutelo comando de R en el que a la vezcalculamos la varianza y la asignamos a una variable

gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades) )[1] 19875

Ejercicio 9

1 Calcula la desviacioacuten tiacutepica (poblacional) de vectorEdades

2 Calcula la cuasivarianza y cuasidesviacioacuten tiacutepica (muestrales) de vectorEdades

3 iquestQueacute sucede si en el tercer paso ejecutas el siguiente comandosum( vectorEdades - mediaEdades )^2iquestPor queacute sucede esto

Solucioacuten en la paacutegina 48

Con estos caacutelculos hemos empezado a hacer Estadiacutestica con R Naturalmente nos queda muchiacutesimoque aprender sobre los vectores de R Por ejemplo como se accede a una componente individualdel vector para responder a preguntas como ldquoiquestCuaacutento vale el quinto elemento del vectorrdquo Maacutesen general aprenderemos a extraer aquellos elementos del vector que cumplan alguna condicioacutenrespondiendo a preguntas como ldquoiquestQueacute elementos del vector son mayores que 7rdquo

42 Y por fin hagamos Estadiacutestica DescriptivaEn esta seccioacuten vamos a trabajar con un vector de datos contenido en este fichero adjunto

Este vector contiene los datos de la variable var3 del fichero Tut01-PracticaConCalccsv queya hemos utilizado en el Tutorial-00 para aprender a hacer Estadiacutestica Descriptiva con Calc Enesta seccioacuten vamos a reproducir los resultados que obtuvimos alliacute pero esta vez usando R Parapreparar el terreno vamos a hacer limpieza

Ejercicio 10

1 Cierra Rstudio y vuelve a abrirlo para limpiar la memora del sistema El trabajo que hemoshecho hasta ahora se perderaacute (aunque los comandos siguen en el Historial de Comandos queya vimos)

2 Establece el Directorio de Trabajo (por ejemplo el Escritorio) y aseguacuterate de que Tut02-var3csvestaacute guardado en la subcarpeta datos de ese directorio

3 Carga de nuevo el contenido de ese fichero en un vector var3 de R

Solucioacuten en la paacutegina 48

Veraacutes en lo que sigue que siempre que calculamos un objeto le asignamos una variable Eso permiteahorrarse la repeticioacuten innecesaria de caacutelculos si maacutes adelante volvemos a necesitar ese objeto Yen algunos casos como veremos maacutes adelante al hacer esto podemos acceder a propiedades delobjeto calculado que R no muestra en su respuesta por defecto

21

4 138 134 134 135 135 133 136 136 132 134 134 133 133 133 132 136 134 135 132 135 136 135 132 136 134 135 133 134 134 134 1310 136 138 134 135 137 133 135 138 136 137 135 134 137 135 136 138 137 134 133 135 135 134 131 135 137 133 133 137 136 135 135 132 138 135 135 135 136 135 133 1311 136 1310 134 131 133 138 139 135 134 1310 134 134 137 135 134 133 132 135 132 136 135 134 133 139 136 135 134 135 132 132 138 134 133 136 138 134 134 134 138 134 132 135 1310 136 1312 135 139 135 138 138 135 132 135 1310 136 135 136 135 135 137 134 133 134 133 133 134 133 133 133 133 137 138 135 134 135 134 135 137 135 133 134 134 137 133 132 135 137 135 134 136 132 135 132 136 1310 134 132 139 134 136 136 132 137 134 138 135 135 134 134 137 134 136 136 135 134 133 135 133 133 136 132 133 134 138 138 137 137 136 135 1310 134 134 134 138 136 134 136 137 135 135 136 138 134 138 134 135 137 136 134 137 137 135 137 132 136 135 133 135 136 130 133 135 135 137 134 137 131 135 136 135 138 132 134 136 139 137 1310 134 135 136 132 135 135 135 1313 133 136 133 136 135 130 1310 134 136 136 134 131 133 135 137 136 133 135 133 134 132 132 138 138 134 136 135 135 134 133 139 134 139 136 1311 133 132 132 136 138 1310 133 137 133 134 135 139 133 135 133 134 138 139 132 138 133 133 137 138 136 133 135 134 132 1311 137 137 136 134 133 135 1310 135 134 135 133 135 136 135 139 135 134 135 135 134 133 137 134 1310 135 134 132 139 134 137 133 135 134 131 136 135 136 134 138 135 135 138 138 134 132 135 133 134 138 138 135 138 132 1311 135 134 134 136 139 1310 137 134 137 132 133 135 1310 135 135 133 135 136 134 134 136 135 137 136 136 134 133 134 135 132 134 136 139 133 135 133 136 133 133 135 134 134 134 137 135 139 1310 133 134 136 131 137 138 135 133 133 135 133 133 137 136 135 135 138 134 139 136 135 135 138 134 130 133 137 133 134 1311 132 137 133 136 135 133 134 133 133 132 138 133 134 134 134 134 138 138 137 136 132 132 137 135 133 135 138 135 134 135 134 135 134 1312 133 135 133 133 133 132 134 131 139 135 135 135 138 138 135 138 133 134 133 136 136 135 134 133 133 135 133 137 135 132 133 133 132 131 132 136 137 130 136 133 134 1310 132 136 137 134 133 132 138 133 135 133 135 136 132 134 134 133 135 135 135 134 134 136 133 132 138 1310 135 135 132 132 137 136 134 135 134 134 136 134 136 135 133 137 137 136 137 134 134 137 133 130 134 136 135 137 136 136 135 137 134 134 135 136 136 135 136 132 134 133 139 135 133 137 135 136 137 136 136 136 134 135 137 137 133 134 137 137 136 133 134 137 131 135 136 133 137 133 135 133 137 138 133 137 132 135 134 133 132 135 134 134 135 133 134 139 135 134 139 137 133 132 133 134 133 134 135 135 138 134 135 134 135 139 137 133 133 132 136 132 138 135 132 137 134 135 136 132 134 135 135 133 135 136 137 135 138 132 131 137 135 135 138 134 137 136 139 1310 137 134 131 136 132 136 137 133 135 137 135 132 135 135 133 133 137 134 133 133 131 138 139 132 134 138 135 136 138 137 1310 138 133 134 134 135 134 134 135 136 135 134 134 135 133 136 135 137 132 133 139 132 133 137 136 134 137 131 135 134 132 134 138 135 134 131 132 134 135 136 133 134 138 134 132 135 134 132 134 133 136 135 138 133 139 1310 134 133 133 137 137 136 137 133 133 133 135 139 136 136 137 136 135 132 132 139 136 132 139 132 137 135 133 138 137 135 134 136 131 133 135 133 134 137 135 134 132 136 136 136 137 133 132 135 134 135 134 137 134 133 133 134 132 134 135 134 134 136 134 135 138 133 135 135 138 133 135 134 135 135 138 1311 132 134 134 136 133 135 133 136 132 131 136 134 136 132 136 136 136 136 130 136 134 134 131 138 131 1310 135 139 136 132 136 138 135 138 134 132 134 133 136 137 133 133 133 133 137 136 135 133 139 133 132 135 136 136 134 132 132 135 137 136 136 136 138 137 137 135 135 131 136 133 136 135 133 134 130 133 135 136 137 138 136 134 135 132 137 132 137 132 133 134 135 138 134 136 133 135 135 139 134 134 136 134 134 134 135 134 133 135 135 138 133 136 136 134 135 134 134 138 136 133 137 132 134 137 136 135 133 134 133 135 134 134 136 134 133 137 133 135 135 136 135 138 134 136 132 137 136 138 134 136 136 137 136 136 135 136 1310 138 133 137 135 136 137 134 136 133 134 133 132 132 134 137 132 132 133 132 138 134 134 135 135 139 135 134 132 134 135 134 139 137 133 134 134 135 133 133 137 138 135 139 133 138 136 136 134 133 136 135 1314 137 133 137 135 136 134 134 136 133 135 134 135 136 136 135 133 135 131 135 137 135 136 133 137 135 134 133 134 134 134 134 134 136 132 134 136 136 137 139 134 138 133 133 132 135 131 134 133 137 133 133 134 139 138 134 134 137 137 135 136 134 139 137 138 134 133 134 134 135 137 134 135 138 133 132 134 1310 133 135 134 132 138 137 136 135 138 1314 139 135 135 131 134 135 134 135 135 135 133 136 135 135 132 136 139 133 133 136 134 132 132 137 136 131 137 135 135 134 1313 1310 132 134 134 133 138 135 134 133 136 136 136 1310 134 137 136 138 139 137 135 134 134 137 137 138 133 134 135 137 135 136 1310 136 136 138 133 136 133 134 135 135 134 136 133 136 136 137 134 135 1316 136 136 132 136 136 133 134 133 137 134 135 134 133 138 134 1310 136 136 136 137 134 136 137 132 138 136 131 132 134 135 130 134 135 135 137 130 136 135 131 136 137 133 137 135 139 138 135 139 133 137 139 133 136 137 136 138 134 1310 136 134 133 139 136 137 133 13713

Rango maacuteximo y miacutenimo

Para empezar vamos a aprender tres nuevas funciones de R que nos permiten calcular esos tresvalores

gt (minimo = min(var3) )[1] 0gt (maximo = max(var3) )[1] 16gt (rango = range(var3) )[1] 0 16

El funcionamiento de las dos primeras es evidente La funcioacuten range devuelve un vector formadopor el maacuteximo y el miacutenimo

Tablas de frecuencia Clases de objetos en R

La tabla de frecuencia absoluta de var3 se obtiene usando la funcioacuten table de esta forma tansencilla

gt ( tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

La primera fila contiene los elementos de var3 y en la segunda aparece la frecuencia de cada unode ellos Puedes comprobar que son los mismos resultados que obtuvimos con Calc en la paacutegina10 del Tutorial01 Aunque alliacute desde luego el proceso fue maacutes laborioso

A lo mejor te has dado cuenta de que el formato de la respuesta es diferente de los que hemosobtenido hasta ahora Para empezar la respuesta no empieza con el [1] al que ya nos vamosacostumbrando El motivo de esto es que el objeto que hemos obtenido como respuesta no es unvector sino una tabla Ya dijimos que R utiliza distintos tipos de objetos con fines distintosiquestCoacutemo podemos saber de queacute clase es un objeto Pues usando una funcioacuten de R oportunamentellamada class Si la usamos con el vector var3 y con su tabla de frecuencias obtenemos

gt class(var3)[1] numericgt class(tablaFrecAbs)[1] table

El vector var3 es de clase numeric porque es un vector de nuacutemeros Y la tabla de frecuencias esde clase table Veremos a lo largo del curso otros objetos de tipo tabular como las matrices (clasematrix) los conjuntos de datos (clase dataframe) y los arraysAunque las tablas son objetos distintos de los vectores tienen algunas propiedades en comuacuten yalgunas de las funciones que hemos usado con vectores tambieacuten se pueden usar con tablas

Ejercicio 11Aplica las funciones length sum min max y range a la tabla tablaFrecAbs Solucioacuten en la paacutegina48

Siguiendo con los parecidos entre tablas y vectores puedes multiplicar (o dividir) una tabla porun nuacutemero y la operacioacuten se haraacute elemento a elemento

gt 2 tablaFrecAbsvar30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1618 50 200 376 488 492 372 262 174 86 56 12 4 4 4 2

Como ves cada frecuencia se multiplica por 2 Esta propiedad de las tablas permite obtener deforma muy sencilla la tabla de frecuencias relativa de var3 Como primer paso vamos a guardarla longitud de var3 en la variable n

22

gt ( n = length( var3 ) )[1] 1300

Y ahora podemos dividir la tabla por n para conseguir la tabla de frecuencias relativas (hemosestrechado la Consola de Comandos para que el resultado cupiera en esta paacutegina)

gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 400069230769 00192307692 00769230769 01446153846 01876923077

5 6 7 8 901892307692 01430769231 01007692308 00669230769 00330769231

10 11 12 13 1400215384615 00046153846 00015384615 00015384615 00015384615

1600007692308

Ejercicio 12Ya sabemos cuanto debe sumar esta tabla de frecuencias relativas Comprueacutebalo Solucioacuten en lapaacutegina 48

Si lo que queremos es una tabla de frecuencias acumuladas debemos emplear la funcioacuten cumsum

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Ejercicio 13La uacuteltima tabla que falta es la de frecuencias relativas acumuladas pero ya tienes todos los ingre-dientes para obtenerla de dos maneras diferentes Hazlo y comprueba si dan el mismo resultadoSi no es asiacute iquesta queacute crees que se debe y cuaacutel es la mejor opcioacuten Asigna el resultado a la variabletablaFrecRelAcu Solucioacuten en la paacutegina 49

Graacuteficos de columnas y diagramas de caja (boxplot) Argumentos con nombre

Vamos a fabricar nuestros primeros graacuteficos con R En concreto vamos a dibujar un graacutefico debarras a partir de la tabla de frecuencias de var3 usando la funcioacuten barplot de R

gt barplot(tablaFrecAbs)

Al ejecutar este comando no debes ver ninguna salida en la Consola de Comandos En su lugaren el panel inferior derecho de RStudio concretamente en la ventana Plots apareceraacute el graacuteficodeseado El resultado puede variar dependiendo de la anchura de tu ventana de RStudio

23

Hemos destacado ademaacutes en la figura los dos botones Zoom y Export que te permiten respecti-vamente ver una versioacuten ampliada de la Figura (que se redimensiona dinaacutemicamente si cambiasla ventana) y guardar esa figura como un fichero de graacuteficos que puedes insertar en cualquierdocumento editar con un programa de manipulacioacuten de graacuteficos etceacuteteraLos graacuteficos de R se pueden controlar hasta en sus detalles maacutes miacutenimos Como aperitivo miacutenimovamos a antildeadir algo de color al graacutefico

gt barplot(tablaFrecAbs col = heatcolors(15))

El resultado es esta figura

Las posibilidades de control de los graacuteficos de R son como decimos inmensas y pueden llegar aser abrumadoras Hay libros de cientos de paacuteginas dedicados a este tema como el R GraphicsCookbook de W Chang (ver las referencias del curso) Nosotros a lo largo de los tutoriales delcurso vamos a aprender algo maacutes aunque a penas nos podremos limitar a rozar la superficie delo que se puede llegar a hacerEn la Seccioacuten 231 del libro hemos descrito los diagramas de cajas o boxplots (recuerda la Figura22 de la paacuteg 36 del libro) Y en el Tutorial-01 dijimos que con Calc no es faacutecil dibujar ese tipode diagramas En cambio con R no podriacutea ser maacutes faacutecil

gt boxplot(var3)

Y el resultado es esta figura

24

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

Desde luego no nos podemos plantear transformar a mano este vector en uno como el anteriorLa solucioacuten que te proponemos pasa por la hoja de caacutelculo y la opcioacuten de trasponer una tablaque hemos visto en el Tutorial-00 lo leeriacuteamos en una fila de la hoja y luego habriacutea que usar elPegado especial para trasponerlo -es decir girarlo- para finalmente volver a guardarlo Alterna-tivamente hay otras soluciones sin salir de R usando una funcioacuten llamada scan o usando de nuevoreadtable y trasponiendo la tabla dentro de R Esos meacutetodos son sencillos cuando se aprendeun poco maacutes sobre R pero por el momento y para los ejemplos sencillos que encontraremos nosvamos a conformar con ese enfoque baacutesico que usa la hoja de Caacutelculo si es necesario

31 Coacutemo obtener ayuda y usar el tabulador en RStudioVamos a aprovechar estos ejemplos de lectura de ficheros csv para aprender a obtener ayuda sobrelas funciones de R La mayoriacutea de las funciones de R como la funcioacuten readtable o la funcioacutenscan que hemos mencionado al final del anterior apartado tienen muchos argumentos opcionalesY hay muchiacutesimas funciones en R (cada vez maacutes porque como veremos maacutes adelante usuarios detodo el mundo antildeaden constantemente funciones nuevas a R cuando las necesitan) No es posiblerecordar todos esas funciones cada una con sus opciones asiacute que es muy importante aprender aobtener esa informacioacuten cuando la necesitamosPara ver como obtener esa informacioacuten en RStudio vamos a usar por ejemplo la funcioacuten scanSituacuteate en una liacutenea vaciacutea de la Consola de Comandos escribe scan y a continuacioacuten mientras elcursor parpadea junto a la n final de scan pulsa la tecla del tabulador (si esto no funciona usa latecla F1 y mira el panel ayuda de RStudio) Veraacutes aparecer una ventana emergente con informacioacutensobre la funcioacuten scan como en esta figura

15

Como ves se muestra un resumen sobre la funcioacuten scan que a veces seraacute suficiente Si necesitasmaacutes detalles haz caso a la indicacioacuten que aparece al final de esa ventana y pulsa la tecla F1 Alhacerlo veraacutes que en el panel inferior derecho de RStudio aparece el fichero de ayuda de la funcioacutenscan como en esta figura

Esos ficheros de ayuda son muy uacutetiles aunque al principio pueden resultar un poco intimidatoriosya sea por un exceso de informacioacuten ya sea porque se da por supuesto que el usuario ya entiendealgunos conceptos baacutesicos de R Podemos garantizar al lector que a medida que se progresa en Rla utilidad de estos ficheros aumentaPero la utilidad de la tecla tabulador en RStudio no se acaba ahiacute Supongamos que quieres aplicarreadtable para leer el fichero Tut02-Edadescsv Pero te da pereza escribir un nombre tan largoo no recuerdas exactamente el nombre o dudas entre dos nombres no importa cual sea el motivoEmpiezas a escribir la orden tecleas

(vectorEdades2 = readtable(datos

y de nuevo justo en este punto pulsas el tabulador Entonces RStudio te ofrece en una nuevaventana emergente todos los ficheros disponibles en la carpeta datos

Y ahora puedes usar esa lista seleccionar el fichero que quieras utilizar Puedes tambieacuten teclearalguna letra maacutes del nombre para acotar auacuten maacutes la buacutesqueda cuando la carpeta contiene muchosficherosEn general la idea es que en RStudio el tabulador es tu amigo Como tendremos ocasioacuten decomprobar RStudio nos ofrece bastante ayuda para hacer maacutes coacutemodo nuestro trabajo con R yel tabulador es una de las herramientas maacutes versaacutetiles y uacutetiles

16

32 El camino contrario escribir un vector a un fichero de tipo csvHemos aprendido a leer con R vectores de datos a partir de ficheros de tipo csv Pero muchasveces despueacutes de hacer operaciones en R obtendremos como resultados nuevos vectores (y maacutesadelante en el curso otro tipo de objetos) Lo natural entonces es aprender a guardar ese vectoren un fichero de tipo csv como el fichero con el que empezamos De esa forma por ejemplo puedescompartir tus resultados con otras personas que utilicen programas distintos de R Para ello siantes usaacutebamos la funcioacuten readtable ahora vamos a usar la funcioacuten writetable de R

Como ejemplo vamos a utilizar este vector de nuacutemeros enteros

29 17 63 31 55 9 92 61 10 16 63 6 61 59 66 41 68 6 99 21 87 68 52 83 66 98 45 5024 100 83 37 44 4 97 67 56 74 75 71 55 22 86 22 93 65 38 84 54 83 100 71 99 1963 11 11 62 91 20 79 42 59 95 70 74 8 25 45 58 57 75 81 34 70 68 39 12 14 21

Ejercicio 5Usa copiar y pegar a partir de este documento pdf para crear un vector de R llamado muestraque contenga esos datos

Para guardar ese vector muestra en un fichero csv (dentro de la subcarpeta datos del directoriode trabajo) podemos utilizar la funcioacuten writetable usando como argumentos

El nombre del vector que queremos guardar que es muestra

Y el nombre del fichero en el que lo guardamos Vamos llamarlo por ejemplo Tut02-muestracsvLe indicamos a R ademaacutes que lo ponga en la subcarpeta datos

La opcioacuten colnames = FALSE o colnames = TRUE para decidir si queremos que R incluyauna liacutenea de cabecera con el nombre de la variable que en este caso es muestra (y que novamos a incluir)

La opcioacuten rownames = FALSE para evitar que R incluya nuacutemeros de fila en el fichero desalida (normalmente no querremos esos nuacutemeros)

Es decir que ejecutamos

writetable(muestrafile = datosTut02-muestracsv colnames=FALSE rownames=FALSE)

Al ejecutar esa orden el fichero que obtenemos tiene la forma deseada (de nuevo soacutelo es visible elcomienzo del fichero)

17

Puedes probar a abrirlo en Calc para ver que es un fichero de datos como los que hemos visto hastaahora

Naturalmente apenas hemos rozado el tema de la entradasalida de datos en R Pero con lo quehemos aprendido en este apartado estamos listos para empezar a hacer Estadiacutestica Descriptivausando ejemplos que no sean demasiado triviales

4 Estadiacutestica descriptiva de una variable cuantitativa condatos no agrupados

Para seguir adelante tenemos que empezar por aprender un poco maacutes sobre la forma en la que Rpermite operar con los vectores Vamos a hacerlo a traveacutes de una serie de ejercicios-ejemplos

Ejercicio 6

1 Vamos a definir dos vectores cada uno de ellos con 12 nuacutemeros enteros El primero al quellamaremos vector1 estaacute formado por

8 5 19 9 17 2 28 18 3 4 19 1

Usa copiar y pegar a partir de este fichero pdf para definir el vector1 en R

2 El segundo vector al que en un rapto de originalidad llamaremos vector2 estaacute almacenadoen el fichero

Guaacuterdalo en datos y examiacutenalo primero con un editor de texto (como el Bloc de Notas)para ver coacutemo estaacuten almacenados los datos en ese fichero Una vez hecho esto usa Calc yla funcioacuten readtable para almacenar el contenido de ese fichero csv en el vector2 de REn alguacuten momento del proceso puede que tengas que usar el pegado especial de Calc paratrasponer los datos

Solucioacuten en la paacutegina 47

41 Aritmeacutetica vectorial en RAhora vamos a sumar los dos vectores Ejecuta el comando

vector1 + vector2

para comprobar que el resultado es la suma componente a componente de los dos vectores

gt vector1 + vector2[1] 26 23 39 21 37 3 58 24 29 24 34 26

Este resultado es bastante previsible Lo que quizaacute resulteacute un poco maacutes inesperado es que simultiplicas los dos vectores tambieacuten se obtienen los productos componente a componente el primerelemento de vector1 se multiplica por el primero de vector2 el segundo por el segundo etc

gt vector1 vector2[1] 144 90 380 108 340 2 840 108 78 80 285 25

Esta forma de operar de R como veremos pronto es muy uacutetil Si lo piensas un momento cadavector numeacuterico de R se corresponde con una columna de una hoja de caacutelculo como las queusaacutebamos en el Tutorial01 Alliacute vimos que para algunas operaciones era necesario multiplicar doscolumnas elemento a elemento En Calc esa operacioacuten no es complicada pero en R es auacuten maacutes faacutecilBasta con un comando como vector1 vector2 para conseguir el objetivo Veremos muchos maacutesejemplos a lo largo del curso en los que una operacioacuten que en Calc requeririacutea bastantes pasosen R se reduce a ejecutar un uacutenico comandoEn R las operaciones con vectores siguen en general este esquema de funcionamiento componentea componente Si por ejemplo ejecutas

18

1818201220130626201525

gt vector1 + 5[1] 13 10 24 14 22 7 33 23 8 9 24 6gt 2 vector1[1] 16 10 38 18 34 4 56 36 6 8 38 2

veraacutes que en el primer caso cada uno de los elementos de vector1 se ha incrementado en 5mientras que en el segundo caso cada uno se ha multiplicado por 2 Sucede lo mismo con otrasoperaciones como elevar al cuadrado

gt vector1^2[1] 64 25 361 81 289 4 784 324 9 16 361 1

Y podemos aplicar funciones en un solo paso Por ejemplo podemos calcular el logaritmo neperianode todos los elementos de un vector en un soacutelo paso

gt log(vector1)[1] 20794415 16094379 29444390 21972246 28332133 06931472[7] 33322045 28903718 10986123 13862944 29444390 00000000

Los resultados de todas estas operaciones son de nuevo vectores Y por tanto se pueden asignara nuevas variables para utilizarlos en nuestras operaciones Por ejemplo si luego vas a necesitar loslogaritmos de vector1 puedes definir una variable para identificar ese vector llamada logVector1(e el nombre que tuacute quieras) haciendo

gt logVector1 = log(vector1)

Recuerda que si ademaacutes de la asignacioacuten quieres ver el resultado puedes rodear toda esta senten-cia con pareacutentesis De lo contrario R la ejecuta pero no imprime ninguna respuesta como ya sabes

Aunque al principio puede parecer complicado cuando te acostumbres a esta forma de trabajarcon vectores veraacutes que resulta muy coacutemoda y eficiente

Generando vectores de nuacutemeros enteros consecutivos

Hay muchas ocasiones en que para alguna operacioacuten necesitamos un vector que contenga losnuacutemeros enteros consecutivos del 1 al n o del 0 al n etc En R esto es muy faacutecil de hacer Porejemplo para conseguir un vector con los nuacutemeros del 1 al 15 basta con ejecutar

gt 115[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Esa notacioacuten con los dos puntos permite generar vectores en los que cada elemento es igual alanterior maacutes 1 Otro ejemplo

gt -713[1] -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13

O incluso cuando los puntos de partida no son enteros

gt 1575[1] 15 25 35 45 55 65 75gt 1574[1] 15 25 35 45 55 65

iquestVes la diferencia entre estos dos casos

Es muy posible que te esteacutes preguntando iquesty si quiero ir avanzando de 2 en 2 o quiero ir hacia atraacutes(ldquoavanzandordquo de minus2 en minus2 por ejemplo) Pronto cuando hayamos aprendido un poco maacutes volve-remos sobre esto y comprobaremos que R nos ofrece un cataacutelogo de herramientas extremadamentepotentes para fabricar vectores de acuerdo con nuestros deseos y necesidadesLos vectores fabricados con este meacutetodo son vectores iguales que los demaacutes y se pueden asignar avariables operar con ellos etc

19

Ejercicio 7

1 Fabrica un vector con los cuadrados de los nuacutemeros del 1 al 10 y asiacutegnalo a la variablecuadrados Usa los pareacutentesis para ver el resultado de la asignacioacuten

2 Haz lo mismo con los cuadrados de los nuacutemeros del 2 al 11 y un vector cuadrados2

3 Resta los vectores cuadrados2 - cuadrados iquestObservas algo interesante

Solucioacuten en la paacutegina 47

Funciones vectoriales

Hemos visto antes que se puede aplicar una funcioacuten como la raiacutez cuadrada a un vector y seobtiene como resultado otro vector con las raiacuteces cuadradas elemento a elemento Pero hay otrotipo de funciones que permiten hacer caacutelculos con el vector en conjunto Por ejemplo antes hemosfabricado el vector -713 y la funcioacuten length nos dice cuantos elementos tiene ese vector

gt length(-713)[1] 21

En el Ejercicio 3 (paacuteg 13) nos preguntaacutebamos cuantos elementos teniacutea el vector vectorEdades quehabiacuteamos cargado desde el fichero csv Puedes obtener la respuesta con length(vectorEdades)Para comprobarlo aseguacuterate de que has creado el vector llamado vectorEdades y ejecuta estaorden

gt length(vectorEdades)[1] 100

Como ves el resultado de length es el esperado

Vamos a conocer otra funcioacuten llamada sum que sirve para calcular la suma de todos los elementosde un vector

gt sum(vectorEdades)[1] 675

Ejercicio 8iquestCuaacutento vale la suma de los cuadrados de los nuacutemeros del 1 al 100 Solucioacuten en la paacutegina 47

A lo mejor te ha pasado desapercibido pero con las funciones length y sum estamos por fin encondiciones de empezar a hacer Estadiacutestica Descriptiva Por ejemplo podemos calcular la mediaaritmeacutetica de vectorEdades

gt ( mediaEdades = sum(vectorEdades) length(vectorEdades) )[1] 675

Y una vez que tenemos la media podemos calcular la varianza poblacional Para que resulte maacutesclaro vamos a mostrarte el proceso paso a paso aunque al final lo ejecutaremos en un soacutelo paso

1 Empezamos restando la media que estaacute en la variable mediaEdades de cada uno de loselementos de vectorEdades

vectorEdades - mediaEdades

El resultado es un vector de diferencias

2 Ahora elevamos cada una de esas diferencias al cuadrado

( vectorEdades - mediaEdades )^2

El resultado de este paso es de nuevo un vector ahora con las diferencias al cuadrado Fiacutejateen el pareacutentesis para garantizar que elevamos al cuadrado la diferencia Si no incluyeacuteramosel pareacutentesis iquestqueacute calculariacuteamos

20

3 A continuacioacuten sumamos todas esas diferencias al cuadrado usando la funcioacuten sum

sum( ( vectorEdades - mediaEdades )^2)

De nuevo el pareacutentesis es fundamental para que el cuadrado del vector de diferencias secalcule antes que la suma En este paso el resultado ya no es un vector sino un nuacutemero

4 Por uacuteltimo dividimos esa suma por n el nuacutemero de elementos de vectorEdades que seobtiene con la funcioacuten length

sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades)

El resultado de estos pasos se puede condensar en un soacutelo comando de R en el que a la vezcalculamos la varianza y la asignamos a una variable

gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades) )[1] 19875

Ejercicio 9

1 Calcula la desviacioacuten tiacutepica (poblacional) de vectorEdades

2 Calcula la cuasivarianza y cuasidesviacioacuten tiacutepica (muestrales) de vectorEdades

3 iquestQueacute sucede si en el tercer paso ejecutas el siguiente comandosum( vectorEdades - mediaEdades )^2iquestPor queacute sucede esto

Solucioacuten en la paacutegina 48

Con estos caacutelculos hemos empezado a hacer Estadiacutestica con R Naturalmente nos queda muchiacutesimoque aprender sobre los vectores de R Por ejemplo como se accede a una componente individualdel vector para responder a preguntas como ldquoiquestCuaacutento vale el quinto elemento del vectorrdquo Maacutesen general aprenderemos a extraer aquellos elementos del vector que cumplan alguna condicioacutenrespondiendo a preguntas como ldquoiquestQueacute elementos del vector son mayores que 7rdquo

42 Y por fin hagamos Estadiacutestica DescriptivaEn esta seccioacuten vamos a trabajar con un vector de datos contenido en este fichero adjunto

Este vector contiene los datos de la variable var3 del fichero Tut01-PracticaConCalccsv queya hemos utilizado en el Tutorial-00 para aprender a hacer Estadiacutestica Descriptiva con Calc Enesta seccioacuten vamos a reproducir los resultados que obtuvimos alliacute pero esta vez usando R Parapreparar el terreno vamos a hacer limpieza

Ejercicio 10

1 Cierra Rstudio y vuelve a abrirlo para limpiar la memora del sistema El trabajo que hemoshecho hasta ahora se perderaacute (aunque los comandos siguen en el Historial de Comandos queya vimos)

2 Establece el Directorio de Trabajo (por ejemplo el Escritorio) y aseguacuterate de que Tut02-var3csvestaacute guardado en la subcarpeta datos de ese directorio

3 Carga de nuevo el contenido de ese fichero en un vector var3 de R

Solucioacuten en la paacutegina 48

Veraacutes en lo que sigue que siempre que calculamos un objeto le asignamos una variable Eso permiteahorrarse la repeticioacuten innecesaria de caacutelculos si maacutes adelante volvemos a necesitar ese objeto Yen algunos casos como veremos maacutes adelante al hacer esto podemos acceder a propiedades delobjeto calculado que R no muestra en su respuesta por defecto

21

4 138 134 134 135 135 133 136 136 132 134 134 133 133 133 132 136 134 135 132 135 136 135 132 136 134 135 133 134 134 134 1310 136 138 134 135 137 133 135 138 136 137 135 134 137 135 136 138 137 134 133 135 135 134 131 135 137 133 133 137 136 135 135 132 138 135 135 135 136 135 133 1311 136 1310 134 131 133 138 139 135 134 1310 134 134 137 135 134 133 132 135 132 136 135 134 133 139 136 135 134 135 132 132 138 134 133 136 138 134 134 134 138 134 132 135 1310 136 1312 135 139 135 138 138 135 132 135 1310 136 135 136 135 135 137 134 133 134 133 133 134 133 133 133 133 137 138 135 134 135 134 135 137 135 133 134 134 137 133 132 135 137 135 134 136 132 135 132 136 1310 134 132 139 134 136 136 132 137 134 138 135 135 134 134 137 134 136 136 135 134 133 135 133 133 136 132 133 134 138 138 137 137 136 135 1310 134 134 134 138 136 134 136 137 135 135 136 138 134 138 134 135 137 136 134 137 137 135 137 132 136 135 133 135 136 130 133 135 135 137 134 137 131 135 136 135 138 132 134 136 139 137 1310 134 135 136 132 135 135 135 1313 133 136 133 136 135 130 1310 134 136 136 134 131 133 135 137 136 133 135 133 134 132 132 138 138 134 136 135 135 134 133 139 134 139 136 1311 133 132 132 136 138 1310 133 137 133 134 135 139 133 135 133 134 138 139 132 138 133 133 137 138 136 133 135 134 132 1311 137 137 136 134 133 135 1310 135 134 135 133 135 136 135 139 135 134 135 135 134 133 137 134 1310 135 134 132 139 134 137 133 135 134 131 136 135 136 134 138 135 135 138 138 134 132 135 133 134 138 138 135 138 132 1311 135 134 134 136 139 1310 137 134 137 132 133 135 1310 135 135 133 135 136 134 134 136 135 137 136 136 134 133 134 135 132 134 136 139 133 135 133 136 133 133 135 134 134 134 137 135 139 1310 133 134 136 131 137 138 135 133 133 135 133 133 137 136 135 135 138 134 139 136 135 135 138 134 130 133 137 133 134 1311 132 137 133 136 135 133 134 133 133 132 138 133 134 134 134 134 138 138 137 136 132 132 137 135 133 135 138 135 134 135 134 135 134 1312 133 135 133 133 133 132 134 131 139 135 135 135 138 138 135 138 133 134 133 136 136 135 134 133 133 135 133 137 135 132 133 133 132 131 132 136 137 130 136 133 134 1310 132 136 137 134 133 132 138 133 135 133 135 136 132 134 134 133 135 135 135 134 134 136 133 132 138 1310 135 135 132 132 137 136 134 135 134 134 136 134 136 135 133 137 137 136 137 134 134 137 133 130 134 136 135 137 136 136 135 137 134 134 135 136 136 135 136 132 134 133 139 135 133 137 135 136 137 136 136 136 134 135 137 137 133 134 137 137 136 133 134 137 131 135 136 133 137 133 135 133 137 138 133 137 132 135 134 133 132 135 134 134 135 133 134 139 135 134 139 137 133 132 133 134 133 134 135 135 138 134 135 134 135 139 137 133 133 132 136 132 138 135 132 137 134 135 136 132 134 135 135 133 135 136 137 135 138 132 131 137 135 135 138 134 137 136 139 1310 137 134 131 136 132 136 137 133 135 137 135 132 135 135 133 133 137 134 133 133 131 138 139 132 134 138 135 136 138 137 1310 138 133 134 134 135 134 134 135 136 135 134 134 135 133 136 135 137 132 133 139 132 133 137 136 134 137 131 135 134 132 134 138 135 134 131 132 134 135 136 133 134 138 134 132 135 134 132 134 133 136 135 138 133 139 1310 134 133 133 137 137 136 137 133 133 133 135 139 136 136 137 136 135 132 132 139 136 132 139 132 137 135 133 138 137 135 134 136 131 133 135 133 134 137 135 134 132 136 136 136 137 133 132 135 134 135 134 137 134 133 133 134 132 134 135 134 134 136 134 135 138 133 135 135 138 133 135 134 135 135 138 1311 132 134 134 136 133 135 133 136 132 131 136 134 136 132 136 136 136 136 130 136 134 134 131 138 131 1310 135 139 136 132 136 138 135 138 134 132 134 133 136 137 133 133 133 133 137 136 135 133 139 133 132 135 136 136 134 132 132 135 137 136 136 136 138 137 137 135 135 131 136 133 136 135 133 134 130 133 135 136 137 138 136 134 135 132 137 132 137 132 133 134 135 138 134 136 133 135 135 139 134 134 136 134 134 134 135 134 133 135 135 138 133 136 136 134 135 134 134 138 136 133 137 132 134 137 136 135 133 134 133 135 134 134 136 134 133 137 133 135 135 136 135 138 134 136 132 137 136 138 134 136 136 137 136 136 135 136 1310 138 133 137 135 136 137 134 136 133 134 133 132 132 134 137 132 132 133 132 138 134 134 135 135 139 135 134 132 134 135 134 139 137 133 134 134 135 133 133 137 138 135 139 133 138 136 136 134 133 136 135 1314 137 133 137 135 136 134 134 136 133 135 134 135 136 136 135 133 135 131 135 137 135 136 133 137 135 134 133 134 134 134 134 134 136 132 134 136 136 137 139 134 138 133 133 132 135 131 134 133 137 133 133 134 139 138 134 134 137 137 135 136 134 139 137 138 134 133 134 134 135 137 134 135 138 133 132 134 1310 133 135 134 132 138 137 136 135 138 1314 139 135 135 131 134 135 134 135 135 135 133 136 135 135 132 136 139 133 133 136 134 132 132 137 136 131 137 135 135 134 1313 1310 132 134 134 133 138 135 134 133 136 136 136 1310 134 137 136 138 139 137 135 134 134 137 137 138 133 134 135 137 135 136 1310 136 136 138 133 136 133 134 135 135 134 136 133 136 136 137 134 135 1316 136 136 132 136 136 133 134 133 137 134 135 134 133 138 134 1310 136 136 136 137 134 136 137 132 138 136 131 132 134 135 130 134 135 135 137 130 136 135 131 136 137 133 137 135 139 138 135 139 133 137 139 133 136 137 136 138 134 1310 136 134 133 139 136 137 133 13713

Rango maacuteximo y miacutenimo

Para empezar vamos a aprender tres nuevas funciones de R que nos permiten calcular esos tresvalores

gt (minimo = min(var3) )[1] 0gt (maximo = max(var3) )[1] 16gt (rango = range(var3) )[1] 0 16

El funcionamiento de las dos primeras es evidente La funcioacuten range devuelve un vector formadopor el maacuteximo y el miacutenimo

Tablas de frecuencia Clases de objetos en R

La tabla de frecuencia absoluta de var3 se obtiene usando la funcioacuten table de esta forma tansencilla

gt ( tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

La primera fila contiene los elementos de var3 y en la segunda aparece la frecuencia de cada unode ellos Puedes comprobar que son los mismos resultados que obtuvimos con Calc en la paacutegina10 del Tutorial01 Aunque alliacute desde luego el proceso fue maacutes laborioso

A lo mejor te has dado cuenta de que el formato de la respuesta es diferente de los que hemosobtenido hasta ahora Para empezar la respuesta no empieza con el [1] al que ya nos vamosacostumbrando El motivo de esto es que el objeto que hemos obtenido como respuesta no es unvector sino una tabla Ya dijimos que R utiliza distintos tipos de objetos con fines distintosiquestCoacutemo podemos saber de queacute clase es un objeto Pues usando una funcioacuten de R oportunamentellamada class Si la usamos con el vector var3 y con su tabla de frecuencias obtenemos

gt class(var3)[1] numericgt class(tablaFrecAbs)[1] table

El vector var3 es de clase numeric porque es un vector de nuacutemeros Y la tabla de frecuencias esde clase table Veremos a lo largo del curso otros objetos de tipo tabular como las matrices (clasematrix) los conjuntos de datos (clase dataframe) y los arraysAunque las tablas son objetos distintos de los vectores tienen algunas propiedades en comuacuten yalgunas de las funciones que hemos usado con vectores tambieacuten se pueden usar con tablas

Ejercicio 11Aplica las funciones length sum min max y range a la tabla tablaFrecAbs Solucioacuten en la paacutegina48

Siguiendo con los parecidos entre tablas y vectores puedes multiplicar (o dividir) una tabla porun nuacutemero y la operacioacuten se haraacute elemento a elemento

gt 2 tablaFrecAbsvar30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1618 50 200 376 488 492 372 262 174 86 56 12 4 4 4 2

Como ves cada frecuencia se multiplica por 2 Esta propiedad de las tablas permite obtener deforma muy sencilla la tabla de frecuencias relativa de var3 Como primer paso vamos a guardarla longitud de var3 en la variable n

22

gt ( n = length( var3 ) )[1] 1300

Y ahora podemos dividir la tabla por n para conseguir la tabla de frecuencias relativas (hemosestrechado la Consola de Comandos para que el resultado cupiera en esta paacutegina)

gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 400069230769 00192307692 00769230769 01446153846 01876923077

5 6 7 8 901892307692 01430769231 01007692308 00669230769 00330769231

10 11 12 13 1400215384615 00046153846 00015384615 00015384615 00015384615

1600007692308

Ejercicio 12Ya sabemos cuanto debe sumar esta tabla de frecuencias relativas Comprueacutebalo Solucioacuten en lapaacutegina 48

Si lo que queremos es una tabla de frecuencias acumuladas debemos emplear la funcioacuten cumsum

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Ejercicio 13La uacuteltima tabla que falta es la de frecuencias relativas acumuladas pero ya tienes todos los ingre-dientes para obtenerla de dos maneras diferentes Hazlo y comprueba si dan el mismo resultadoSi no es asiacute iquesta queacute crees que se debe y cuaacutel es la mejor opcioacuten Asigna el resultado a la variabletablaFrecRelAcu Solucioacuten en la paacutegina 49

Graacuteficos de columnas y diagramas de caja (boxplot) Argumentos con nombre

Vamos a fabricar nuestros primeros graacuteficos con R En concreto vamos a dibujar un graacutefico debarras a partir de la tabla de frecuencias de var3 usando la funcioacuten barplot de R

gt barplot(tablaFrecAbs)

Al ejecutar este comando no debes ver ninguna salida en la Consola de Comandos En su lugaren el panel inferior derecho de RStudio concretamente en la ventana Plots apareceraacute el graacuteficodeseado El resultado puede variar dependiendo de la anchura de tu ventana de RStudio

23

Hemos destacado ademaacutes en la figura los dos botones Zoom y Export que te permiten respecti-vamente ver una versioacuten ampliada de la Figura (que se redimensiona dinaacutemicamente si cambiasla ventana) y guardar esa figura como un fichero de graacuteficos que puedes insertar en cualquierdocumento editar con un programa de manipulacioacuten de graacuteficos etceacuteteraLos graacuteficos de R se pueden controlar hasta en sus detalles maacutes miacutenimos Como aperitivo miacutenimovamos a antildeadir algo de color al graacutefico

gt barplot(tablaFrecAbs col = heatcolors(15))

El resultado es esta figura

Las posibilidades de control de los graacuteficos de R son como decimos inmensas y pueden llegar aser abrumadoras Hay libros de cientos de paacuteginas dedicados a este tema como el R GraphicsCookbook de W Chang (ver las referencias del curso) Nosotros a lo largo de los tutoriales delcurso vamos a aprender algo maacutes aunque a penas nos podremos limitar a rozar la superficie delo que se puede llegar a hacerEn la Seccioacuten 231 del libro hemos descrito los diagramas de cajas o boxplots (recuerda la Figura22 de la paacuteg 36 del libro) Y en el Tutorial-01 dijimos que con Calc no es faacutecil dibujar ese tipode diagramas En cambio con R no podriacutea ser maacutes faacutecil

gt boxplot(var3)

Y el resultado es esta figura

24

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

Como ves se muestra un resumen sobre la funcioacuten scan que a veces seraacute suficiente Si necesitasmaacutes detalles haz caso a la indicacioacuten que aparece al final de esa ventana y pulsa la tecla F1 Alhacerlo veraacutes que en el panel inferior derecho de RStudio aparece el fichero de ayuda de la funcioacutenscan como en esta figura

Esos ficheros de ayuda son muy uacutetiles aunque al principio pueden resultar un poco intimidatoriosya sea por un exceso de informacioacuten ya sea porque se da por supuesto que el usuario ya entiendealgunos conceptos baacutesicos de R Podemos garantizar al lector que a medida que se progresa en Rla utilidad de estos ficheros aumentaPero la utilidad de la tecla tabulador en RStudio no se acaba ahiacute Supongamos que quieres aplicarreadtable para leer el fichero Tut02-Edadescsv Pero te da pereza escribir un nombre tan largoo no recuerdas exactamente el nombre o dudas entre dos nombres no importa cual sea el motivoEmpiezas a escribir la orden tecleas

(vectorEdades2 = readtable(datos

y de nuevo justo en este punto pulsas el tabulador Entonces RStudio te ofrece en una nuevaventana emergente todos los ficheros disponibles en la carpeta datos

Y ahora puedes usar esa lista seleccionar el fichero que quieras utilizar Puedes tambieacuten teclearalguna letra maacutes del nombre para acotar auacuten maacutes la buacutesqueda cuando la carpeta contiene muchosficherosEn general la idea es que en RStudio el tabulador es tu amigo Como tendremos ocasioacuten decomprobar RStudio nos ofrece bastante ayuda para hacer maacutes coacutemodo nuestro trabajo con R yel tabulador es una de las herramientas maacutes versaacutetiles y uacutetiles

16

32 El camino contrario escribir un vector a un fichero de tipo csvHemos aprendido a leer con R vectores de datos a partir de ficheros de tipo csv Pero muchasveces despueacutes de hacer operaciones en R obtendremos como resultados nuevos vectores (y maacutesadelante en el curso otro tipo de objetos) Lo natural entonces es aprender a guardar ese vectoren un fichero de tipo csv como el fichero con el que empezamos De esa forma por ejemplo puedescompartir tus resultados con otras personas que utilicen programas distintos de R Para ello siantes usaacutebamos la funcioacuten readtable ahora vamos a usar la funcioacuten writetable de R

Como ejemplo vamos a utilizar este vector de nuacutemeros enteros

29 17 63 31 55 9 92 61 10 16 63 6 61 59 66 41 68 6 99 21 87 68 52 83 66 98 45 5024 100 83 37 44 4 97 67 56 74 75 71 55 22 86 22 93 65 38 84 54 83 100 71 99 1963 11 11 62 91 20 79 42 59 95 70 74 8 25 45 58 57 75 81 34 70 68 39 12 14 21

Ejercicio 5Usa copiar y pegar a partir de este documento pdf para crear un vector de R llamado muestraque contenga esos datos

Para guardar ese vector muestra en un fichero csv (dentro de la subcarpeta datos del directoriode trabajo) podemos utilizar la funcioacuten writetable usando como argumentos

El nombre del vector que queremos guardar que es muestra

Y el nombre del fichero en el que lo guardamos Vamos llamarlo por ejemplo Tut02-muestracsvLe indicamos a R ademaacutes que lo ponga en la subcarpeta datos

La opcioacuten colnames = FALSE o colnames = TRUE para decidir si queremos que R incluyauna liacutenea de cabecera con el nombre de la variable que en este caso es muestra (y que novamos a incluir)

La opcioacuten rownames = FALSE para evitar que R incluya nuacutemeros de fila en el fichero desalida (normalmente no querremos esos nuacutemeros)

Es decir que ejecutamos

writetable(muestrafile = datosTut02-muestracsv colnames=FALSE rownames=FALSE)

Al ejecutar esa orden el fichero que obtenemos tiene la forma deseada (de nuevo soacutelo es visible elcomienzo del fichero)

17

Puedes probar a abrirlo en Calc para ver que es un fichero de datos como los que hemos visto hastaahora

Naturalmente apenas hemos rozado el tema de la entradasalida de datos en R Pero con lo quehemos aprendido en este apartado estamos listos para empezar a hacer Estadiacutestica Descriptivausando ejemplos que no sean demasiado triviales

4 Estadiacutestica descriptiva de una variable cuantitativa condatos no agrupados

Para seguir adelante tenemos que empezar por aprender un poco maacutes sobre la forma en la que Rpermite operar con los vectores Vamos a hacerlo a traveacutes de una serie de ejercicios-ejemplos

Ejercicio 6

1 Vamos a definir dos vectores cada uno de ellos con 12 nuacutemeros enteros El primero al quellamaremos vector1 estaacute formado por

8 5 19 9 17 2 28 18 3 4 19 1

Usa copiar y pegar a partir de este fichero pdf para definir el vector1 en R

2 El segundo vector al que en un rapto de originalidad llamaremos vector2 estaacute almacenadoen el fichero

Guaacuterdalo en datos y examiacutenalo primero con un editor de texto (como el Bloc de Notas)para ver coacutemo estaacuten almacenados los datos en ese fichero Una vez hecho esto usa Calc yla funcioacuten readtable para almacenar el contenido de ese fichero csv en el vector2 de REn alguacuten momento del proceso puede que tengas que usar el pegado especial de Calc paratrasponer los datos

Solucioacuten en la paacutegina 47

41 Aritmeacutetica vectorial en RAhora vamos a sumar los dos vectores Ejecuta el comando

vector1 + vector2

para comprobar que el resultado es la suma componente a componente de los dos vectores

gt vector1 + vector2[1] 26 23 39 21 37 3 58 24 29 24 34 26

Este resultado es bastante previsible Lo que quizaacute resulteacute un poco maacutes inesperado es que simultiplicas los dos vectores tambieacuten se obtienen los productos componente a componente el primerelemento de vector1 se multiplica por el primero de vector2 el segundo por el segundo etc

gt vector1 vector2[1] 144 90 380 108 340 2 840 108 78 80 285 25

Esta forma de operar de R como veremos pronto es muy uacutetil Si lo piensas un momento cadavector numeacuterico de R se corresponde con una columna de una hoja de caacutelculo como las queusaacutebamos en el Tutorial01 Alliacute vimos que para algunas operaciones era necesario multiplicar doscolumnas elemento a elemento En Calc esa operacioacuten no es complicada pero en R es auacuten maacutes faacutecilBasta con un comando como vector1 vector2 para conseguir el objetivo Veremos muchos maacutesejemplos a lo largo del curso en los que una operacioacuten que en Calc requeririacutea bastantes pasosen R se reduce a ejecutar un uacutenico comandoEn R las operaciones con vectores siguen en general este esquema de funcionamiento componentea componente Si por ejemplo ejecutas

18

1818201220130626201525

gt vector1 + 5[1] 13 10 24 14 22 7 33 23 8 9 24 6gt 2 vector1[1] 16 10 38 18 34 4 56 36 6 8 38 2

veraacutes que en el primer caso cada uno de los elementos de vector1 se ha incrementado en 5mientras que en el segundo caso cada uno se ha multiplicado por 2 Sucede lo mismo con otrasoperaciones como elevar al cuadrado

gt vector1^2[1] 64 25 361 81 289 4 784 324 9 16 361 1

Y podemos aplicar funciones en un solo paso Por ejemplo podemos calcular el logaritmo neperianode todos los elementos de un vector en un soacutelo paso

gt log(vector1)[1] 20794415 16094379 29444390 21972246 28332133 06931472[7] 33322045 28903718 10986123 13862944 29444390 00000000

Los resultados de todas estas operaciones son de nuevo vectores Y por tanto se pueden asignara nuevas variables para utilizarlos en nuestras operaciones Por ejemplo si luego vas a necesitar loslogaritmos de vector1 puedes definir una variable para identificar ese vector llamada logVector1(e el nombre que tuacute quieras) haciendo

gt logVector1 = log(vector1)

Recuerda que si ademaacutes de la asignacioacuten quieres ver el resultado puedes rodear toda esta senten-cia con pareacutentesis De lo contrario R la ejecuta pero no imprime ninguna respuesta como ya sabes

Aunque al principio puede parecer complicado cuando te acostumbres a esta forma de trabajarcon vectores veraacutes que resulta muy coacutemoda y eficiente

Generando vectores de nuacutemeros enteros consecutivos

Hay muchas ocasiones en que para alguna operacioacuten necesitamos un vector que contenga losnuacutemeros enteros consecutivos del 1 al n o del 0 al n etc En R esto es muy faacutecil de hacer Porejemplo para conseguir un vector con los nuacutemeros del 1 al 15 basta con ejecutar

gt 115[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Esa notacioacuten con los dos puntos permite generar vectores en los que cada elemento es igual alanterior maacutes 1 Otro ejemplo

gt -713[1] -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13

O incluso cuando los puntos de partida no son enteros

gt 1575[1] 15 25 35 45 55 65 75gt 1574[1] 15 25 35 45 55 65

iquestVes la diferencia entre estos dos casos

Es muy posible que te esteacutes preguntando iquesty si quiero ir avanzando de 2 en 2 o quiero ir hacia atraacutes(ldquoavanzandordquo de minus2 en minus2 por ejemplo) Pronto cuando hayamos aprendido un poco maacutes volve-remos sobre esto y comprobaremos que R nos ofrece un cataacutelogo de herramientas extremadamentepotentes para fabricar vectores de acuerdo con nuestros deseos y necesidadesLos vectores fabricados con este meacutetodo son vectores iguales que los demaacutes y se pueden asignar avariables operar con ellos etc

19

Ejercicio 7

1 Fabrica un vector con los cuadrados de los nuacutemeros del 1 al 10 y asiacutegnalo a la variablecuadrados Usa los pareacutentesis para ver el resultado de la asignacioacuten

2 Haz lo mismo con los cuadrados de los nuacutemeros del 2 al 11 y un vector cuadrados2

3 Resta los vectores cuadrados2 - cuadrados iquestObservas algo interesante

Solucioacuten en la paacutegina 47

Funciones vectoriales

Hemos visto antes que se puede aplicar una funcioacuten como la raiacutez cuadrada a un vector y seobtiene como resultado otro vector con las raiacuteces cuadradas elemento a elemento Pero hay otrotipo de funciones que permiten hacer caacutelculos con el vector en conjunto Por ejemplo antes hemosfabricado el vector -713 y la funcioacuten length nos dice cuantos elementos tiene ese vector

gt length(-713)[1] 21

En el Ejercicio 3 (paacuteg 13) nos preguntaacutebamos cuantos elementos teniacutea el vector vectorEdades quehabiacuteamos cargado desde el fichero csv Puedes obtener la respuesta con length(vectorEdades)Para comprobarlo aseguacuterate de que has creado el vector llamado vectorEdades y ejecuta estaorden

gt length(vectorEdades)[1] 100

Como ves el resultado de length es el esperado

Vamos a conocer otra funcioacuten llamada sum que sirve para calcular la suma de todos los elementosde un vector

gt sum(vectorEdades)[1] 675

Ejercicio 8iquestCuaacutento vale la suma de los cuadrados de los nuacutemeros del 1 al 100 Solucioacuten en la paacutegina 47

A lo mejor te ha pasado desapercibido pero con las funciones length y sum estamos por fin encondiciones de empezar a hacer Estadiacutestica Descriptiva Por ejemplo podemos calcular la mediaaritmeacutetica de vectorEdades

gt ( mediaEdades = sum(vectorEdades) length(vectorEdades) )[1] 675

Y una vez que tenemos la media podemos calcular la varianza poblacional Para que resulte maacutesclaro vamos a mostrarte el proceso paso a paso aunque al final lo ejecutaremos en un soacutelo paso

1 Empezamos restando la media que estaacute en la variable mediaEdades de cada uno de loselementos de vectorEdades

vectorEdades - mediaEdades

El resultado es un vector de diferencias

2 Ahora elevamos cada una de esas diferencias al cuadrado

( vectorEdades - mediaEdades )^2

El resultado de este paso es de nuevo un vector ahora con las diferencias al cuadrado Fiacutejateen el pareacutentesis para garantizar que elevamos al cuadrado la diferencia Si no incluyeacuteramosel pareacutentesis iquestqueacute calculariacuteamos

20

3 A continuacioacuten sumamos todas esas diferencias al cuadrado usando la funcioacuten sum

sum( ( vectorEdades - mediaEdades )^2)

De nuevo el pareacutentesis es fundamental para que el cuadrado del vector de diferencias secalcule antes que la suma En este paso el resultado ya no es un vector sino un nuacutemero

4 Por uacuteltimo dividimos esa suma por n el nuacutemero de elementos de vectorEdades que seobtiene con la funcioacuten length

sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades)

El resultado de estos pasos se puede condensar en un soacutelo comando de R en el que a la vezcalculamos la varianza y la asignamos a una variable

gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades) )[1] 19875

Ejercicio 9

1 Calcula la desviacioacuten tiacutepica (poblacional) de vectorEdades

2 Calcula la cuasivarianza y cuasidesviacioacuten tiacutepica (muestrales) de vectorEdades

3 iquestQueacute sucede si en el tercer paso ejecutas el siguiente comandosum( vectorEdades - mediaEdades )^2iquestPor queacute sucede esto

Solucioacuten en la paacutegina 48

Con estos caacutelculos hemos empezado a hacer Estadiacutestica con R Naturalmente nos queda muchiacutesimoque aprender sobre los vectores de R Por ejemplo como se accede a una componente individualdel vector para responder a preguntas como ldquoiquestCuaacutento vale el quinto elemento del vectorrdquo Maacutesen general aprenderemos a extraer aquellos elementos del vector que cumplan alguna condicioacutenrespondiendo a preguntas como ldquoiquestQueacute elementos del vector son mayores que 7rdquo

42 Y por fin hagamos Estadiacutestica DescriptivaEn esta seccioacuten vamos a trabajar con un vector de datos contenido en este fichero adjunto

Este vector contiene los datos de la variable var3 del fichero Tut01-PracticaConCalccsv queya hemos utilizado en el Tutorial-00 para aprender a hacer Estadiacutestica Descriptiva con Calc Enesta seccioacuten vamos a reproducir los resultados que obtuvimos alliacute pero esta vez usando R Parapreparar el terreno vamos a hacer limpieza

Ejercicio 10

1 Cierra Rstudio y vuelve a abrirlo para limpiar la memora del sistema El trabajo que hemoshecho hasta ahora se perderaacute (aunque los comandos siguen en el Historial de Comandos queya vimos)

2 Establece el Directorio de Trabajo (por ejemplo el Escritorio) y aseguacuterate de que Tut02-var3csvestaacute guardado en la subcarpeta datos de ese directorio

3 Carga de nuevo el contenido de ese fichero en un vector var3 de R

Solucioacuten en la paacutegina 48

Veraacutes en lo que sigue que siempre que calculamos un objeto le asignamos una variable Eso permiteahorrarse la repeticioacuten innecesaria de caacutelculos si maacutes adelante volvemos a necesitar ese objeto Yen algunos casos como veremos maacutes adelante al hacer esto podemos acceder a propiedades delobjeto calculado que R no muestra en su respuesta por defecto

21

4 138 134 134 135 135 133 136 136 132 134 134 133 133 133 132 136 134 135 132 135 136 135 132 136 134 135 133 134 134 134 1310 136 138 134 135 137 133 135 138 136 137 135 134 137 135 136 138 137 134 133 135 135 134 131 135 137 133 133 137 136 135 135 132 138 135 135 135 136 135 133 1311 136 1310 134 131 133 138 139 135 134 1310 134 134 137 135 134 133 132 135 132 136 135 134 133 139 136 135 134 135 132 132 138 134 133 136 138 134 134 134 138 134 132 135 1310 136 1312 135 139 135 138 138 135 132 135 1310 136 135 136 135 135 137 134 133 134 133 133 134 133 133 133 133 137 138 135 134 135 134 135 137 135 133 134 134 137 133 132 135 137 135 134 136 132 135 132 136 1310 134 132 139 134 136 136 132 137 134 138 135 135 134 134 137 134 136 136 135 134 133 135 133 133 136 132 133 134 138 138 137 137 136 135 1310 134 134 134 138 136 134 136 137 135 135 136 138 134 138 134 135 137 136 134 137 137 135 137 132 136 135 133 135 136 130 133 135 135 137 134 137 131 135 136 135 138 132 134 136 139 137 1310 134 135 136 132 135 135 135 1313 133 136 133 136 135 130 1310 134 136 136 134 131 133 135 137 136 133 135 133 134 132 132 138 138 134 136 135 135 134 133 139 134 139 136 1311 133 132 132 136 138 1310 133 137 133 134 135 139 133 135 133 134 138 139 132 138 133 133 137 138 136 133 135 134 132 1311 137 137 136 134 133 135 1310 135 134 135 133 135 136 135 139 135 134 135 135 134 133 137 134 1310 135 134 132 139 134 137 133 135 134 131 136 135 136 134 138 135 135 138 138 134 132 135 133 134 138 138 135 138 132 1311 135 134 134 136 139 1310 137 134 137 132 133 135 1310 135 135 133 135 136 134 134 136 135 137 136 136 134 133 134 135 132 134 136 139 133 135 133 136 133 133 135 134 134 134 137 135 139 1310 133 134 136 131 137 138 135 133 133 135 133 133 137 136 135 135 138 134 139 136 135 135 138 134 130 133 137 133 134 1311 132 137 133 136 135 133 134 133 133 132 138 133 134 134 134 134 138 138 137 136 132 132 137 135 133 135 138 135 134 135 134 135 134 1312 133 135 133 133 133 132 134 131 139 135 135 135 138 138 135 138 133 134 133 136 136 135 134 133 133 135 133 137 135 132 133 133 132 131 132 136 137 130 136 133 134 1310 132 136 137 134 133 132 138 133 135 133 135 136 132 134 134 133 135 135 135 134 134 136 133 132 138 1310 135 135 132 132 137 136 134 135 134 134 136 134 136 135 133 137 137 136 137 134 134 137 133 130 134 136 135 137 136 136 135 137 134 134 135 136 136 135 136 132 134 133 139 135 133 137 135 136 137 136 136 136 134 135 137 137 133 134 137 137 136 133 134 137 131 135 136 133 137 133 135 133 137 138 133 137 132 135 134 133 132 135 134 134 135 133 134 139 135 134 139 137 133 132 133 134 133 134 135 135 138 134 135 134 135 139 137 133 133 132 136 132 138 135 132 137 134 135 136 132 134 135 135 133 135 136 137 135 138 132 131 137 135 135 138 134 137 136 139 1310 137 134 131 136 132 136 137 133 135 137 135 132 135 135 133 133 137 134 133 133 131 138 139 132 134 138 135 136 138 137 1310 138 133 134 134 135 134 134 135 136 135 134 134 135 133 136 135 137 132 133 139 132 133 137 136 134 137 131 135 134 132 134 138 135 134 131 132 134 135 136 133 134 138 134 132 135 134 132 134 133 136 135 138 133 139 1310 134 133 133 137 137 136 137 133 133 133 135 139 136 136 137 136 135 132 132 139 136 132 139 132 137 135 133 138 137 135 134 136 131 133 135 133 134 137 135 134 132 136 136 136 137 133 132 135 134 135 134 137 134 133 133 134 132 134 135 134 134 136 134 135 138 133 135 135 138 133 135 134 135 135 138 1311 132 134 134 136 133 135 133 136 132 131 136 134 136 132 136 136 136 136 130 136 134 134 131 138 131 1310 135 139 136 132 136 138 135 138 134 132 134 133 136 137 133 133 133 133 137 136 135 133 139 133 132 135 136 136 134 132 132 135 137 136 136 136 138 137 137 135 135 131 136 133 136 135 133 134 130 133 135 136 137 138 136 134 135 132 137 132 137 132 133 134 135 138 134 136 133 135 135 139 134 134 136 134 134 134 135 134 133 135 135 138 133 136 136 134 135 134 134 138 136 133 137 132 134 137 136 135 133 134 133 135 134 134 136 134 133 137 133 135 135 136 135 138 134 136 132 137 136 138 134 136 136 137 136 136 135 136 1310 138 133 137 135 136 137 134 136 133 134 133 132 132 134 137 132 132 133 132 138 134 134 135 135 139 135 134 132 134 135 134 139 137 133 134 134 135 133 133 137 138 135 139 133 138 136 136 134 133 136 135 1314 137 133 137 135 136 134 134 136 133 135 134 135 136 136 135 133 135 131 135 137 135 136 133 137 135 134 133 134 134 134 134 134 136 132 134 136 136 137 139 134 138 133 133 132 135 131 134 133 137 133 133 134 139 138 134 134 137 137 135 136 134 139 137 138 134 133 134 134 135 137 134 135 138 133 132 134 1310 133 135 134 132 138 137 136 135 138 1314 139 135 135 131 134 135 134 135 135 135 133 136 135 135 132 136 139 133 133 136 134 132 132 137 136 131 137 135 135 134 1313 1310 132 134 134 133 138 135 134 133 136 136 136 1310 134 137 136 138 139 137 135 134 134 137 137 138 133 134 135 137 135 136 1310 136 136 138 133 136 133 134 135 135 134 136 133 136 136 137 134 135 1316 136 136 132 136 136 133 134 133 137 134 135 134 133 138 134 1310 136 136 136 137 134 136 137 132 138 136 131 132 134 135 130 134 135 135 137 130 136 135 131 136 137 133 137 135 139 138 135 139 133 137 139 133 136 137 136 138 134 1310 136 134 133 139 136 137 133 13713

Rango maacuteximo y miacutenimo

Para empezar vamos a aprender tres nuevas funciones de R que nos permiten calcular esos tresvalores

gt (minimo = min(var3) )[1] 0gt (maximo = max(var3) )[1] 16gt (rango = range(var3) )[1] 0 16

El funcionamiento de las dos primeras es evidente La funcioacuten range devuelve un vector formadopor el maacuteximo y el miacutenimo

Tablas de frecuencia Clases de objetos en R

La tabla de frecuencia absoluta de var3 se obtiene usando la funcioacuten table de esta forma tansencilla

gt ( tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

La primera fila contiene los elementos de var3 y en la segunda aparece la frecuencia de cada unode ellos Puedes comprobar que son los mismos resultados que obtuvimos con Calc en la paacutegina10 del Tutorial01 Aunque alliacute desde luego el proceso fue maacutes laborioso

A lo mejor te has dado cuenta de que el formato de la respuesta es diferente de los que hemosobtenido hasta ahora Para empezar la respuesta no empieza con el [1] al que ya nos vamosacostumbrando El motivo de esto es que el objeto que hemos obtenido como respuesta no es unvector sino una tabla Ya dijimos que R utiliza distintos tipos de objetos con fines distintosiquestCoacutemo podemos saber de queacute clase es un objeto Pues usando una funcioacuten de R oportunamentellamada class Si la usamos con el vector var3 y con su tabla de frecuencias obtenemos

gt class(var3)[1] numericgt class(tablaFrecAbs)[1] table

El vector var3 es de clase numeric porque es un vector de nuacutemeros Y la tabla de frecuencias esde clase table Veremos a lo largo del curso otros objetos de tipo tabular como las matrices (clasematrix) los conjuntos de datos (clase dataframe) y los arraysAunque las tablas son objetos distintos de los vectores tienen algunas propiedades en comuacuten yalgunas de las funciones que hemos usado con vectores tambieacuten se pueden usar con tablas

Ejercicio 11Aplica las funciones length sum min max y range a la tabla tablaFrecAbs Solucioacuten en la paacutegina48

Siguiendo con los parecidos entre tablas y vectores puedes multiplicar (o dividir) una tabla porun nuacutemero y la operacioacuten se haraacute elemento a elemento

gt 2 tablaFrecAbsvar30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1618 50 200 376 488 492 372 262 174 86 56 12 4 4 4 2

Como ves cada frecuencia se multiplica por 2 Esta propiedad de las tablas permite obtener deforma muy sencilla la tabla de frecuencias relativa de var3 Como primer paso vamos a guardarla longitud de var3 en la variable n

22

gt ( n = length( var3 ) )[1] 1300

Y ahora podemos dividir la tabla por n para conseguir la tabla de frecuencias relativas (hemosestrechado la Consola de Comandos para que el resultado cupiera en esta paacutegina)

gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 400069230769 00192307692 00769230769 01446153846 01876923077

5 6 7 8 901892307692 01430769231 01007692308 00669230769 00330769231

10 11 12 13 1400215384615 00046153846 00015384615 00015384615 00015384615

1600007692308

Ejercicio 12Ya sabemos cuanto debe sumar esta tabla de frecuencias relativas Comprueacutebalo Solucioacuten en lapaacutegina 48

Si lo que queremos es una tabla de frecuencias acumuladas debemos emplear la funcioacuten cumsum

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Ejercicio 13La uacuteltima tabla que falta es la de frecuencias relativas acumuladas pero ya tienes todos los ingre-dientes para obtenerla de dos maneras diferentes Hazlo y comprueba si dan el mismo resultadoSi no es asiacute iquesta queacute crees que se debe y cuaacutel es la mejor opcioacuten Asigna el resultado a la variabletablaFrecRelAcu Solucioacuten en la paacutegina 49

Graacuteficos de columnas y diagramas de caja (boxplot) Argumentos con nombre

Vamos a fabricar nuestros primeros graacuteficos con R En concreto vamos a dibujar un graacutefico debarras a partir de la tabla de frecuencias de var3 usando la funcioacuten barplot de R

gt barplot(tablaFrecAbs)

Al ejecutar este comando no debes ver ninguna salida en la Consola de Comandos En su lugaren el panel inferior derecho de RStudio concretamente en la ventana Plots apareceraacute el graacuteficodeseado El resultado puede variar dependiendo de la anchura de tu ventana de RStudio

23

Hemos destacado ademaacutes en la figura los dos botones Zoom y Export que te permiten respecti-vamente ver una versioacuten ampliada de la Figura (que se redimensiona dinaacutemicamente si cambiasla ventana) y guardar esa figura como un fichero de graacuteficos que puedes insertar en cualquierdocumento editar con un programa de manipulacioacuten de graacuteficos etceacuteteraLos graacuteficos de R se pueden controlar hasta en sus detalles maacutes miacutenimos Como aperitivo miacutenimovamos a antildeadir algo de color al graacutefico

gt barplot(tablaFrecAbs col = heatcolors(15))

El resultado es esta figura

Las posibilidades de control de los graacuteficos de R son como decimos inmensas y pueden llegar aser abrumadoras Hay libros de cientos de paacuteginas dedicados a este tema como el R GraphicsCookbook de W Chang (ver las referencias del curso) Nosotros a lo largo de los tutoriales delcurso vamos a aprender algo maacutes aunque a penas nos podremos limitar a rozar la superficie delo que se puede llegar a hacerEn la Seccioacuten 231 del libro hemos descrito los diagramas de cajas o boxplots (recuerda la Figura22 de la paacuteg 36 del libro) Y en el Tutorial-01 dijimos que con Calc no es faacutecil dibujar ese tipode diagramas En cambio con R no podriacutea ser maacutes faacutecil

gt boxplot(var3)

Y el resultado es esta figura

24

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

32 El camino contrario escribir un vector a un fichero de tipo csvHemos aprendido a leer con R vectores de datos a partir de ficheros de tipo csv Pero muchasveces despueacutes de hacer operaciones en R obtendremos como resultados nuevos vectores (y maacutesadelante en el curso otro tipo de objetos) Lo natural entonces es aprender a guardar ese vectoren un fichero de tipo csv como el fichero con el que empezamos De esa forma por ejemplo puedescompartir tus resultados con otras personas que utilicen programas distintos de R Para ello siantes usaacutebamos la funcioacuten readtable ahora vamos a usar la funcioacuten writetable de R

Como ejemplo vamos a utilizar este vector de nuacutemeros enteros

29 17 63 31 55 9 92 61 10 16 63 6 61 59 66 41 68 6 99 21 87 68 52 83 66 98 45 5024 100 83 37 44 4 97 67 56 74 75 71 55 22 86 22 93 65 38 84 54 83 100 71 99 1963 11 11 62 91 20 79 42 59 95 70 74 8 25 45 58 57 75 81 34 70 68 39 12 14 21

Ejercicio 5Usa copiar y pegar a partir de este documento pdf para crear un vector de R llamado muestraque contenga esos datos

Para guardar ese vector muestra en un fichero csv (dentro de la subcarpeta datos del directoriode trabajo) podemos utilizar la funcioacuten writetable usando como argumentos

El nombre del vector que queremos guardar que es muestra

Y el nombre del fichero en el que lo guardamos Vamos llamarlo por ejemplo Tut02-muestracsvLe indicamos a R ademaacutes que lo ponga en la subcarpeta datos

La opcioacuten colnames = FALSE o colnames = TRUE para decidir si queremos que R incluyauna liacutenea de cabecera con el nombre de la variable que en este caso es muestra (y que novamos a incluir)

La opcioacuten rownames = FALSE para evitar que R incluya nuacutemeros de fila en el fichero desalida (normalmente no querremos esos nuacutemeros)

Es decir que ejecutamos

writetable(muestrafile = datosTut02-muestracsv colnames=FALSE rownames=FALSE)

Al ejecutar esa orden el fichero que obtenemos tiene la forma deseada (de nuevo soacutelo es visible elcomienzo del fichero)

17

Puedes probar a abrirlo en Calc para ver que es un fichero de datos como los que hemos visto hastaahora

Naturalmente apenas hemos rozado el tema de la entradasalida de datos en R Pero con lo quehemos aprendido en este apartado estamos listos para empezar a hacer Estadiacutestica Descriptivausando ejemplos que no sean demasiado triviales

4 Estadiacutestica descriptiva de una variable cuantitativa condatos no agrupados

Para seguir adelante tenemos que empezar por aprender un poco maacutes sobre la forma en la que Rpermite operar con los vectores Vamos a hacerlo a traveacutes de una serie de ejercicios-ejemplos

Ejercicio 6

1 Vamos a definir dos vectores cada uno de ellos con 12 nuacutemeros enteros El primero al quellamaremos vector1 estaacute formado por

8 5 19 9 17 2 28 18 3 4 19 1

Usa copiar y pegar a partir de este fichero pdf para definir el vector1 en R

2 El segundo vector al que en un rapto de originalidad llamaremos vector2 estaacute almacenadoen el fichero

Guaacuterdalo en datos y examiacutenalo primero con un editor de texto (como el Bloc de Notas)para ver coacutemo estaacuten almacenados los datos en ese fichero Una vez hecho esto usa Calc yla funcioacuten readtable para almacenar el contenido de ese fichero csv en el vector2 de REn alguacuten momento del proceso puede que tengas que usar el pegado especial de Calc paratrasponer los datos

Solucioacuten en la paacutegina 47

41 Aritmeacutetica vectorial en RAhora vamos a sumar los dos vectores Ejecuta el comando

vector1 + vector2

para comprobar que el resultado es la suma componente a componente de los dos vectores

gt vector1 + vector2[1] 26 23 39 21 37 3 58 24 29 24 34 26

Este resultado es bastante previsible Lo que quizaacute resulteacute un poco maacutes inesperado es que simultiplicas los dos vectores tambieacuten se obtienen los productos componente a componente el primerelemento de vector1 se multiplica por el primero de vector2 el segundo por el segundo etc

gt vector1 vector2[1] 144 90 380 108 340 2 840 108 78 80 285 25

Esta forma de operar de R como veremos pronto es muy uacutetil Si lo piensas un momento cadavector numeacuterico de R se corresponde con una columna de una hoja de caacutelculo como las queusaacutebamos en el Tutorial01 Alliacute vimos que para algunas operaciones era necesario multiplicar doscolumnas elemento a elemento En Calc esa operacioacuten no es complicada pero en R es auacuten maacutes faacutecilBasta con un comando como vector1 vector2 para conseguir el objetivo Veremos muchos maacutesejemplos a lo largo del curso en los que una operacioacuten que en Calc requeririacutea bastantes pasosen R se reduce a ejecutar un uacutenico comandoEn R las operaciones con vectores siguen en general este esquema de funcionamiento componentea componente Si por ejemplo ejecutas

18

1818201220130626201525

gt vector1 + 5[1] 13 10 24 14 22 7 33 23 8 9 24 6gt 2 vector1[1] 16 10 38 18 34 4 56 36 6 8 38 2

veraacutes que en el primer caso cada uno de los elementos de vector1 se ha incrementado en 5mientras que en el segundo caso cada uno se ha multiplicado por 2 Sucede lo mismo con otrasoperaciones como elevar al cuadrado

gt vector1^2[1] 64 25 361 81 289 4 784 324 9 16 361 1

Y podemos aplicar funciones en un solo paso Por ejemplo podemos calcular el logaritmo neperianode todos los elementos de un vector en un soacutelo paso

gt log(vector1)[1] 20794415 16094379 29444390 21972246 28332133 06931472[7] 33322045 28903718 10986123 13862944 29444390 00000000

Los resultados de todas estas operaciones son de nuevo vectores Y por tanto se pueden asignara nuevas variables para utilizarlos en nuestras operaciones Por ejemplo si luego vas a necesitar loslogaritmos de vector1 puedes definir una variable para identificar ese vector llamada logVector1(e el nombre que tuacute quieras) haciendo

gt logVector1 = log(vector1)

Recuerda que si ademaacutes de la asignacioacuten quieres ver el resultado puedes rodear toda esta senten-cia con pareacutentesis De lo contrario R la ejecuta pero no imprime ninguna respuesta como ya sabes

Aunque al principio puede parecer complicado cuando te acostumbres a esta forma de trabajarcon vectores veraacutes que resulta muy coacutemoda y eficiente

Generando vectores de nuacutemeros enteros consecutivos

Hay muchas ocasiones en que para alguna operacioacuten necesitamos un vector que contenga losnuacutemeros enteros consecutivos del 1 al n o del 0 al n etc En R esto es muy faacutecil de hacer Porejemplo para conseguir un vector con los nuacutemeros del 1 al 15 basta con ejecutar

gt 115[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Esa notacioacuten con los dos puntos permite generar vectores en los que cada elemento es igual alanterior maacutes 1 Otro ejemplo

gt -713[1] -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13

O incluso cuando los puntos de partida no son enteros

gt 1575[1] 15 25 35 45 55 65 75gt 1574[1] 15 25 35 45 55 65

iquestVes la diferencia entre estos dos casos

Es muy posible que te esteacutes preguntando iquesty si quiero ir avanzando de 2 en 2 o quiero ir hacia atraacutes(ldquoavanzandordquo de minus2 en minus2 por ejemplo) Pronto cuando hayamos aprendido un poco maacutes volve-remos sobre esto y comprobaremos que R nos ofrece un cataacutelogo de herramientas extremadamentepotentes para fabricar vectores de acuerdo con nuestros deseos y necesidadesLos vectores fabricados con este meacutetodo son vectores iguales que los demaacutes y se pueden asignar avariables operar con ellos etc

19

Ejercicio 7

1 Fabrica un vector con los cuadrados de los nuacutemeros del 1 al 10 y asiacutegnalo a la variablecuadrados Usa los pareacutentesis para ver el resultado de la asignacioacuten

2 Haz lo mismo con los cuadrados de los nuacutemeros del 2 al 11 y un vector cuadrados2

3 Resta los vectores cuadrados2 - cuadrados iquestObservas algo interesante

Solucioacuten en la paacutegina 47

Funciones vectoriales

Hemos visto antes que se puede aplicar una funcioacuten como la raiacutez cuadrada a un vector y seobtiene como resultado otro vector con las raiacuteces cuadradas elemento a elemento Pero hay otrotipo de funciones que permiten hacer caacutelculos con el vector en conjunto Por ejemplo antes hemosfabricado el vector -713 y la funcioacuten length nos dice cuantos elementos tiene ese vector

gt length(-713)[1] 21

En el Ejercicio 3 (paacuteg 13) nos preguntaacutebamos cuantos elementos teniacutea el vector vectorEdades quehabiacuteamos cargado desde el fichero csv Puedes obtener la respuesta con length(vectorEdades)Para comprobarlo aseguacuterate de que has creado el vector llamado vectorEdades y ejecuta estaorden

gt length(vectorEdades)[1] 100

Como ves el resultado de length es el esperado

Vamos a conocer otra funcioacuten llamada sum que sirve para calcular la suma de todos los elementosde un vector

gt sum(vectorEdades)[1] 675

Ejercicio 8iquestCuaacutento vale la suma de los cuadrados de los nuacutemeros del 1 al 100 Solucioacuten en la paacutegina 47

A lo mejor te ha pasado desapercibido pero con las funciones length y sum estamos por fin encondiciones de empezar a hacer Estadiacutestica Descriptiva Por ejemplo podemos calcular la mediaaritmeacutetica de vectorEdades

gt ( mediaEdades = sum(vectorEdades) length(vectorEdades) )[1] 675

Y una vez que tenemos la media podemos calcular la varianza poblacional Para que resulte maacutesclaro vamos a mostrarte el proceso paso a paso aunque al final lo ejecutaremos en un soacutelo paso

1 Empezamos restando la media que estaacute en la variable mediaEdades de cada uno de loselementos de vectorEdades

vectorEdades - mediaEdades

El resultado es un vector de diferencias

2 Ahora elevamos cada una de esas diferencias al cuadrado

( vectorEdades - mediaEdades )^2

El resultado de este paso es de nuevo un vector ahora con las diferencias al cuadrado Fiacutejateen el pareacutentesis para garantizar que elevamos al cuadrado la diferencia Si no incluyeacuteramosel pareacutentesis iquestqueacute calculariacuteamos

20

3 A continuacioacuten sumamos todas esas diferencias al cuadrado usando la funcioacuten sum

sum( ( vectorEdades - mediaEdades )^2)

De nuevo el pareacutentesis es fundamental para que el cuadrado del vector de diferencias secalcule antes que la suma En este paso el resultado ya no es un vector sino un nuacutemero

4 Por uacuteltimo dividimos esa suma por n el nuacutemero de elementos de vectorEdades que seobtiene con la funcioacuten length

sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades)

El resultado de estos pasos se puede condensar en un soacutelo comando de R en el que a la vezcalculamos la varianza y la asignamos a una variable

gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades) )[1] 19875

Ejercicio 9

1 Calcula la desviacioacuten tiacutepica (poblacional) de vectorEdades

2 Calcula la cuasivarianza y cuasidesviacioacuten tiacutepica (muestrales) de vectorEdades

3 iquestQueacute sucede si en el tercer paso ejecutas el siguiente comandosum( vectorEdades - mediaEdades )^2iquestPor queacute sucede esto

Solucioacuten en la paacutegina 48

Con estos caacutelculos hemos empezado a hacer Estadiacutestica con R Naturalmente nos queda muchiacutesimoque aprender sobre los vectores de R Por ejemplo como se accede a una componente individualdel vector para responder a preguntas como ldquoiquestCuaacutento vale el quinto elemento del vectorrdquo Maacutesen general aprenderemos a extraer aquellos elementos del vector que cumplan alguna condicioacutenrespondiendo a preguntas como ldquoiquestQueacute elementos del vector son mayores que 7rdquo

42 Y por fin hagamos Estadiacutestica DescriptivaEn esta seccioacuten vamos a trabajar con un vector de datos contenido en este fichero adjunto

Este vector contiene los datos de la variable var3 del fichero Tut01-PracticaConCalccsv queya hemos utilizado en el Tutorial-00 para aprender a hacer Estadiacutestica Descriptiva con Calc Enesta seccioacuten vamos a reproducir los resultados que obtuvimos alliacute pero esta vez usando R Parapreparar el terreno vamos a hacer limpieza

Ejercicio 10

1 Cierra Rstudio y vuelve a abrirlo para limpiar la memora del sistema El trabajo que hemoshecho hasta ahora se perderaacute (aunque los comandos siguen en el Historial de Comandos queya vimos)

2 Establece el Directorio de Trabajo (por ejemplo el Escritorio) y aseguacuterate de que Tut02-var3csvestaacute guardado en la subcarpeta datos de ese directorio

3 Carga de nuevo el contenido de ese fichero en un vector var3 de R

Solucioacuten en la paacutegina 48

Veraacutes en lo que sigue que siempre que calculamos un objeto le asignamos una variable Eso permiteahorrarse la repeticioacuten innecesaria de caacutelculos si maacutes adelante volvemos a necesitar ese objeto Yen algunos casos como veremos maacutes adelante al hacer esto podemos acceder a propiedades delobjeto calculado que R no muestra en su respuesta por defecto

21

4 138 134 134 135 135 133 136 136 132 134 134 133 133 133 132 136 134 135 132 135 136 135 132 136 134 135 133 134 134 134 1310 136 138 134 135 137 133 135 138 136 137 135 134 137 135 136 138 137 134 133 135 135 134 131 135 137 133 133 137 136 135 135 132 138 135 135 135 136 135 133 1311 136 1310 134 131 133 138 139 135 134 1310 134 134 137 135 134 133 132 135 132 136 135 134 133 139 136 135 134 135 132 132 138 134 133 136 138 134 134 134 138 134 132 135 1310 136 1312 135 139 135 138 138 135 132 135 1310 136 135 136 135 135 137 134 133 134 133 133 134 133 133 133 133 137 138 135 134 135 134 135 137 135 133 134 134 137 133 132 135 137 135 134 136 132 135 132 136 1310 134 132 139 134 136 136 132 137 134 138 135 135 134 134 137 134 136 136 135 134 133 135 133 133 136 132 133 134 138 138 137 137 136 135 1310 134 134 134 138 136 134 136 137 135 135 136 138 134 138 134 135 137 136 134 137 137 135 137 132 136 135 133 135 136 130 133 135 135 137 134 137 131 135 136 135 138 132 134 136 139 137 1310 134 135 136 132 135 135 135 1313 133 136 133 136 135 130 1310 134 136 136 134 131 133 135 137 136 133 135 133 134 132 132 138 138 134 136 135 135 134 133 139 134 139 136 1311 133 132 132 136 138 1310 133 137 133 134 135 139 133 135 133 134 138 139 132 138 133 133 137 138 136 133 135 134 132 1311 137 137 136 134 133 135 1310 135 134 135 133 135 136 135 139 135 134 135 135 134 133 137 134 1310 135 134 132 139 134 137 133 135 134 131 136 135 136 134 138 135 135 138 138 134 132 135 133 134 138 138 135 138 132 1311 135 134 134 136 139 1310 137 134 137 132 133 135 1310 135 135 133 135 136 134 134 136 135 137 136 136 134 133 134 135 132 134 136 139 133 135 133 136 133 133 135 134 134 134 137 135 139 1310 133 134 136 131 137 138 135 133 133 135 133 133 137 136 135 135 138 134 139 136 135 135 138 134 130 133 137 133 134 1311 132 137 133 136 135 133 134 133 133 132 138 133 134 134 134 134 138 138 137 136 132 132 137 135 133 135 138 135 134 135 134 135 134 1312 133 135 133 133 133 132 134 131 139 135 135 135 138 138 135 138 133 134 133 136 136 135 134 133 133 135 133 137 135 132 133 133 132 131 132 136 137 130 136 133 134 1310 132 136 137 134 133 132 138 133 135 133 135 136 132 134 134 133 135 135 135 134 134 136 133 132 138 1310 135 135 132 132 137 136 134 135 134 134 136 134 136 135 133 137 137 136 137 134 134 137 133 130 134 136 135 137 136 136 135 137 134 134 135 136 136 135 136 132 134 133 139 135 133 137 135 136 137 136 136 136 134 135 137 137 133 134 137 137 136 133 134 137 131 135 136 133 137 133 135 133 137 138 133 137 132 135 134 133 132 135 134 134 135 133 134 139 135 134 139 137 133 132 133 134 133 134 135 135 138 134 135 134 135 139 137 133 133 132 136 132 138 135 132 137 134 135 136 132 134 135 135 133 135 136 137 135 138 132 131 137 135 135 138 134 137 136 139 1310 137 134 131 136 132 136 137 133 135 137 135 132 135 135 133 133 137 134 133 133 131 138 139 132 134 138 135 136 138 137 1310 138 133 134 134 135 134 134 135 136 135 134 134 135 133 136 135 137 132 133 139 132 133 137 136 134 137 131 135 134 132 134 138 135 134 131 132 134 135 136 133 134 138 134 132 135 134 132 134 133 136 135 138 133 139 1310 134 133 133 137 137 136 137 133 133 133 135 139 136 136 137 136 135 132 132 139 136 132 139 132 137 135 133 138 137 135 134 136 131 133 135 133 134 137 135 134 132 136 136 136 137 133 132 135 134 135 134 137 134 133 133 134 132 134 135 134 134 136 134 135 138 133 135 135 138 133 135 134 135 135 138 1311 132 134 134 136 133 135 133 136 132 131 136 134 136 132 136 136 136 136 130 136 134 134 131 138 131 1310 135 139 136 132 136 138 135 138 134 132 134 133 136 137 133 133 133 133 137 136 135 133 139 133 132 135 136 136 134 132 132 135 137 136 136 136 138 137 137 135 135 131 136 133 136 135 133 134 130 133 135 136 137 138 136 134 135 132 137 132 137 132 133 134 135 138 134 136 133 135 135 139 134 134 136 134 134 134 135 134 133 135 135 138 133 136 136 134 135 134 134 138 136 133 137 132 134 137 136 135 133 134 133 135 134 134 136 134 133 137 133 135 135 136 135 138 134 136 132 137 136 138 134 136 136 137 136 136 135 136 1310 138 133 137 135 136 137 134 136 133 134 133 132 132 134 137 132 132 133 132 138 134 134 135 135 139 135 134 132 134 135 134 139 137 133 134 134 135 133 133 137 138 135 139 133 138 136 136 134 133 136 135 1314 137 133 137 135 136 134 134 136 133 135 134 135 136 136 135 133 135 131 135 137 135 136 133 137 135 134 133 134 134 134 134 134 136 132 134 136 136 137 139 134 138 133 133 132 135 131 134 133 137 133 133 134 139 138 134 134 137 137 135 136 134 139 137 138 134 133 134 134 135 137 134 135 138 133 132 134 1310 133 135 134 132 138 137 136 135 138 1314 139 135 135 131 134 135 134 135 135 135 133 136 135 135 132 136 139 133 133 136 134 132 132 137 136 131 137 135 135 134 1313 1310 132 134 134 133 138 135 134 133 136 136 136 1310 134 137 136 138 139 137 135 134 134 137 137 138 133 134 135 137 135 136 1310 136 136 138 133 136 133 134 135 135 134 136 133 136 136 137 134 135 1316 136 136 132 136 136 133 134 133 137 134 135 134 133 138 134 1310 136 136 136 137 134 136 137 132 138 136 131 132 134 135 130 134 135 135 137 130 136 135 131 136 137 133 137 135 139 138 135 139 133 137 139 133 136 137 136 138 134 1310 136 134 133 139 136 137 133 13713

Rango maacuteximo y miacutenimo

Para empezar vamos a aprender tres nuevas funciones de R que nos permiten calcular esos tresvalores

gt (minimo = min(var3) )[1] 0gt (maximo = max(var3) )[1] 16gt (rango = range(var3) )[1] 0 16

El funcionamiento de las dos primeras es evidente La funcioacuten range devuelve un vector formadopor el maacuteximo y el miacutenimo

Tablas de frecuencia Clases de objetos en R

La tabla de frecuencia absoluta de var3 se obtiene usando la funcioacuten table de esta forma tansencilla

gt ( tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

La primera fila contiene los elementos de var3 y en la segunda aparece la frecuencia de cada unode ellos Puedes comprobar que son los mismos resultados que obtuvimos con Calc en la paacutegina10 del Tutorial01 Aunque alliacute desde luego el proceso fue maacutes laborioso

A lo mejor te has dado cuenta de que el formato de la respuesta es diferente de los que hemosobtenido hasta ahora Para empezar la respuesta no empieza con el [1] al que ya nos vamosacostumbrando El motivo de esto es que el objeto que hemos obtenido como respuesta no es unvector sino una tabla Ya dijimos que R utiliza distintos tipos de objetos con fines distintosiquestCoacutemo podemos saber de queacute clase es un objeto Pues usando una funcioacuten de R oportunamentellamada class Si la usamos con el vector var3 y con su tabla de frecuencias obtenemos

gt class(var3)[1] numericgt class(tablaFrecAbs)[1] table

El vector var3 es de clase numeric porque es un vector de nuacutemeros Y la tabla de frecuencias esde clase table Veremos a lo largo del curso otros objetos de tipo tabular como las matrices (clasematrix) los conjuntos de datos (clase dataframe) y los arraysAunque las tablas son objetos distintos de los vectores tienen algunas propiedades en comuacuten yalgunas de las funciones que hemos usado con vectores tambieacuten se pueden usar con tablas

Ejercicio 11Aplica las funciones length sum min max y range a la tabla tablaFrecAbs Solucioacuten en la paacutegina48

Siguiendo con los parecidos entre tablas y vectores puedes multiplicar (o dividir) una tabla porun nuacutemero y la operacioacuten se haraacute elemento a elemento

gt 2 tablaFrecAbsvar30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1618 50 200 376 488 492 372 262 174 86 56 12 4 4 4 2

Como ves cada frecuencia se multiplica por 2 Esta propiedad de las tablas permite obtener deforma muy sencilla la tabla de frecuencias relativa de var3 Como primer paso vamos a guardarla longitud de var3 en la variable n

22

gt ( n = length( var3 ) )[1] 1300

Y ahora podemos dividir la tabla por n para conseguir la tabla de frecuencias relativas (hemosestrechado la Consola de Comandos para que el resultado cupiera en esta paacutegina)

gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 400069230769 00192307692 00769230769 01446153846 01876923077

5 6 7 8 901892307692 01430769231 01007692308 00669230769 00330769231

10 11 12 13 1400215384615 00046153846 00015384615 00015384615 00015384615

1600007692308

Ejercicio 12Ya sabemos cuanto debe sumar esta tabla de frecuencias relativas Comprueacutebalo Solucioacuten en lapaacutegina 48

Si lo que queremos es una tabla de frecuencias acumuladas debemos emplear la funcioacuten cumsum

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Ejercicio 13La uacuteltima tabla que falta es la de frecuencias relativas acumuladas pero ya tienes todos los ingre-dientes para obtenerla de dos maneras diferentes Hazlo y comprueba si dan el mismo resultadoSi no es asiacute iquesta queacute crees que se debe y cuaacutel es la mejor opcioacuten Asigna el resultado a la variabletablaFrecRelAcu Solucioacuten en la paacutegina 49

Graacuteficos de columnas y diagramas de caja (boxplot) Argumentos con nombre

Vamos a fabricar nuestros primeros graacuteficos con R En concreto vamos a dibujar un graacutefico debarras a partir de la tabla de frecuencias de var3 usando la funcioacuten barplot de R

gt barplot(tablaFrecAbs)

Al ejecutar este comando no debes ver ninguna salida en la Consola de Comandos En su lugaren el panel inferior derecho de RStudio concretamente en la ventana Plots apareceraacute el graacuteficodeseado El resultado puede variar dependiendo de la anchura de tu ventana de RStudio

23

Hemos destacado ademaacutes en la figura los dos botones Zoom y Export que te permiten respecti-vamente ver una versioacuten ampliada de la Figura (que se redimensiona dinaacutemicamente si cambiasla ventana) y guardar esa figura como un fichero de graacuteficos que puedes insertar en cualquierdocumento editar con un programa de manipulacioacuten de graacuteficos etceacuteteraLos graacuteficos de R se pueden controlar hasta en sus detalles maacutes miacutenimos Como aperitivo miacutenimovamos a antildeadir algo de color al graacutefico

gt barplot(tablaFrecAbs col = heatcolors(15))

El resultado es esta figura

Las posibilidades de control de los graacuteficos de R son como decimos inmensas y pueden llegar aser abrumadoras Hay libros de cientos de paacuteginas dedicados a este tema como el R GraphicsCookbook de W Chang (ver las referencias del curso) Nosotros a lo largo de los tutoriales delcurso vamos a aprender algo maacutes aunque a penas nos podremos limitar a rozar la superficie delo que se puede llegar a hacerEn la Seccioacuten 231 del libro hemos descrito los diagramas de cajas o boxplots (recuerda la Figura22 de la paacuteg 36 del libro) Y en el Tutorial-01 dijimos que con Calc no es faacutecil dibujar ese tipode diagramas En cambio con R no podriacutea ser maacutes faacutecil

gt boxplot(var3)

Y el resultado es esta figura

24

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

Puedes probar a abrirlo en Calc para ver que es un fichero de datos como los que hemos visto hastaahora

Naturalmente apenas hemos rozado el tema de la entradasalida de datos en R Pero con lo quehemos aprendido en este apartado estamos listos para empezar a hacer Estadiacutestica Descriptivausando ejemplos que no sean demasiado triviales

4 Estadiacutestica descriptiva de una variable cuantitativa condatos no agrupados

Para seguir adelante tenemos que empezar por aprender un poco maacutes sobre la forma en la que Rpermite operar con los vectores Vamos a hacerlo a traveacutes de una serie de ejercicios-ejemplos

Ejercicio 6

1 Vamos a definir dos vectores cada uno de ellos con 12 nuacutemeros enteros El primero al quellamaremos vector1 estaacute formado por

8 5 19 9 17 2 28 18 3 4 19 1

Usa copiar y pegar a partir de este fichero pdf para definir el vector1 en R

2 El segundo vector al que en un rapto de originalidad llamaremos vector2 estaacute almacenadoen el fichero

Guaacuterdalo en datos y examiacutenalo primero con un editor de texto (como el Bloc de Notas)para ver coacutemo estaacuten almacenados los datos en ese fichero Una vez hecho esto usa Calc yla funcioacuten readtable para almacenar el contenido de ese fichero csv en el vector2 de REn alguacuten momento del proceso puede que tengas que usar el pegado especial de Calc paratrasponer los datos

Solucioacuten en la paacutegina 47

41 Aritmeacutetica vectorial en RAhora vamos a sumar los dos vectores Ejecuta el comando

vector1 + vector2

para comprobar que el resultado es la suma componente a componente de los dos vectores

gt vector1 + vector2[1] 26 23 39 21 37 3 58 24 29 24 34 26

Este resultado es bastante previsible Lo que quizaacute resulteacute un poco maacutes inesperado es que simultiplicas los dos vectores tambieacuten se obtienen los productos componente a componente el primerelemento de vector1 se multiplica por el primero de vector2 el segundo por el segundo etc

gt vector1 vector2[1] 144 90 380 108 340 2 840 108 78 80 285 25

Esta forma de operar de R como veremos pronto es muy uacutetil Si lo piensas un momento cadavector numeacuterico de R se corresponde con una columna de una hoja de caacutelculo como las queusaacutebamos en el Tutorial01 Alliacute vimos que para algunas operaciones era necesario multiplicar doscolumnas elemento a elemento En Calc esa operacioacuten no es complicada pero en R es auacuten maacutes faacutecilBasta con un comando como vector1 vector2 para conseguir el objetivo Veremos muchos maacutesejemplos a lo largo del curso en los que una operacioacuten que en Calc requeririacutea bastantes pasosen R se reduce a ejecutar un uacutenico comandoEn R las operaciones con vectores siguen en general este esquema de funcionamiento componentea componente Si por ejemplo ejecutas

18

1818201220130626201525

gt vector1 + 5[1] 13 10 24 14 22 7 33 23 8 9 24 6gt 2 vector1[1] 16 10 38 18 34 4 56 36 6 8 38 2

veraacutes que en el primer caso cada uno de los elementos de vector1 se ha incrementado en 5mientras que en el segundo caso cada uno se ha multiplicado por 2 Sucede lo mismo con otrasoperaciones como elevar al cuadrado

gt vector1^2[1] 64 25 361 81 289 4 784 324 9 16 361 1

Y podemos aplicar funciones en un solo paso Por ejemplo podemos calcular el logaritmo neperianode todos los elementos de un vector en un soacutelo paso

gt log(vector1)[1] 20794415 16094379 29444390 21972246 28332133 06931472[7] 33322045 28903718 10986123 13862944 29444390 00000000

Los resultados de todas estas operaciones son de nuevo vectores Y por tanto se pueden asignara nuevas variables para utilizarlos en nuestras operaciones Por ejemplo si luego vas a necesitar loslogaritmos de vector1 puedes definir una variable para identificar ese vector llamada logVector1(e el nombre que tuacute quieras) haciendo

gt logVector1 = log(vector1)

Recuerda que si ademaacutes de la asignacioacuten quieres ver el resultado puedes rodear toda esta senten-cia con pareacutentesis De lo contrario R la ejecuta pero no imprime ninguna respuesta como ya sabes

Aunque al principio puede parecer complicado cuando te acostumbres a esta forma de trabajarcon vectores veraacutes que resulta muy coacutemoda y eficiente

Generando vectores de nuacutemeros enteros consecutivos

Hay muchas ocasiones en que para alguna operacioacuten necesitamos un vector que contenga losnuacutemeros enteros consecutivos del 1 al n o del 0 al n etc En R esto es muy faacutecil de hacer Porejemplo para conseguir un vector con los nuacutemeros del 1 al 15 basta con ejecutar

gt 115[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Esa notacioacuten con los dos puntos permite generar vectores en los que cada elemento es igual alanterior maacutes 1 Otro ejemplo

gt -713[1] -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13

O incluso cuando los puntos de partida no son enteros

gt 1575[1] 15 25 35 45 55 65 75gt 1574[1] 15 25 35 45 55 65

iquestVes la diferencia entre estos dos casos

Es muy posible que te esteacutes preguntando iquesty si quiero ir avanzando de 2 en 2 o quiero ir hacia atraacutes(ldquoavanzandordquo de minus2 en minus2 por ejemplo) Pronto cuando hayamos aprendido un poco maacutes volve-remos sobre esto y comprobaremos que R nos ofrece un cataacutelogo de herramientas extremadamentepotentes para fabricar vectores de acuerdo con nuestros deseos y necesidadesLos vectores fabricados con este meacutetodo son vectores iguales que los demaacutes y se pueden asignar avariables operar con ellos etc

19

Ejercicio 7

1 Fabrica un vector con los cuadrados de los nuacutemeros del 1 al 10 y asiacutegnalo a la variablecuadrados Usa los pareacutentesis para ver el resultado de la asignacioacuten

2 Haz lo mismo con los cuadrados de los nuacutemeros del 2 al 11 y un vector cuadrados2

3 Resta los vectores cuadrados2 - cuadrados iquestObservas algo interesante

Solucioacuten en la paacutegina 47

Funciones vectoriales

Hemos visto antes que se puede aplicar una funcioacuten como la raiacutez cuadrada a un vector y seobtiene como resultado otro vector con las raiacuteces cuadradas elemento a elemento Pero hay otrotipo de funciones que permiten hacer caacutelculos con el vector en conjunto Por ejemplo antes hemosfabricado el vector -713 y la funcioacuten length nos dice cuantos elementos tiene ese vector

gt length(-713)[1] 21

En el Ejercicio 3 (paacuteg 13) nos preguntaacutebamos cuantos elementos teniacutea el vector vectorEdades quehabiacuteamos cargado desde el fichero csv Puedes obtener la respuesta con length(vectorEdades)Para comprobarlo aseguacuterate de que has creado el vector llamado vectorEdades y ejecuta estaorden

gt length(vectorEdades)[1] 100

Como ves el resultado de length es el esperado

Vamos a conocer otra funcioacuten llamada sum que sirve para calcular la suma de todos los elementosde un vector

gt sum(vectorEdades)[1] 675

Ejercicio 8iquestCuaacutento vale la suma de los cuadrados de los nuacutemeros del 1 al 100 Solucioacuten en la paacutegina 47

A lo mejor te ha pasado desapercibido pero con las funciones length y sum estamos por fin encondiciones de empezar a hacer Estadiacutestica Descriptiva Por ejemplo podemos calcular la mediaaritmeacutetica de vectorEdades

gt ( mediaEdades = sum(vectorEdades) length(vectorEdades) )[1] 675

Y una vez que tenemos la media podemos calcular la varianza poblacional Para que resulte maacutesclaro vamos a mostrarte el proceso paso a paso aunque al final lo ejecutaremos en un soacutelo paso

1 Empezamos restando la media que estaacute en la variable mediaEdades de cada uno de loselementos de vectorEdades

vectorEdades - mediaEdades

El resultado es un vector de diferencias

2 Ahora elevamos cada una de esas diferencias al cuadrado

( vectorEdades - mediaEdades )^2

El resultado de este paso es de nuevo un vector ahora con las diferencias al cuadrado Fiacutejateen el pareacutentesis para garantizar que elevamos al cuadrado la diferencia Si no incluyeacuteramosel pareacutentesis iquestqueacute calculariacuteamos

20

3 A continuacioacuten sumamos todas esas diferencias al cuadrado usando la funcioacuten sum

sum( ( vectorEdades - mediaEdades )^2)

De nuevo el pareacutentesis es fundamental para que el cuadrado del vector de diferencias secalcule antes que la suma En este paso el resultado ya no es un vector sino un nuacutemero

4 Por uacuteltimo dividimos esa suma por n el nuacutemero de elementos de vectorEdades que seobtiene con la funcioacuten length

sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades)

El resultado de estos pasos se puede condensar en un soacutelo comando de R en el que a la vezcalculamos la varianza y la asignamos a una variable

gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades) )[1] 19875

Ejercicio 9

1 Calcula la desviacioacuten tiacutepica (poblacional) de vectorEdades

2 Calcula la cuasivarianza y cuasidesviacioacuten tiacutepica (muestrales) de vectorEdades

3 iquestQueacute sucede si en el tercer paso ejecutas el siguiente comandosum( vectorEdades - mediaEdades )^2iquestPor queacute sucede esto

Solucioacuten en la paacutegina 48

Con estos caacutelculos hemos empezado a hacer Estadiacutestica con R Naturalmente nos queda muchiacutesimoque aprender sobre los vectores de R Por ejemplo como se accede a una componente individualdel vector para responder a preguntas como ldquoiquestCuaacutento vale el quinto elemento del vectorrdquo Maacutesen general aprenderemos a extraer aquellos elementos del vector que cumplan alguna condicioacutenrespondiendo a preguntas como ldquoiquestQueacute elementos del vector son mayores que 7rdquo

42 Y por fin hagamos Estadiacutestica DescriptivaEn esta seccioacuten vamos a trabajar con un vector de datos contenido en este fichero adjunto

Este vector contiene los datos de la variable var3 del fichero Tut01-PracticaConCalccsv queya hemos utilizado en el Tutorial-00 para aprender a hacer Estadiacutestica Descriptiva con Calc Enesta seccioacuten vamos a reproducir los resultados que obtuvimos alliacute pero esta vez usando R Parapreparar el terreno vamos a hacer limpieza

Ejercicio 10

1 Cierra Rstudio y vuelve a abrirlo para limpiar la memora del sistema El trabajo que hemoshecho hasta ahora se perderaacute (aunque los comandos siguen en el Historial de Comandos queya vimos)

2 Establece el Directorio de Trabajo (por ejemplo el Escritorio) y aseguacuterate de que Tut02-var3csvestaacute guardado en la subcarpeta datos de ese directorio

3 Carga de nuevo el contenido de ese fichero en un vector var3 de R

Solucioacuten en la paacutegina 48

Veraacutes en lo que sigue que siempre que calculamos un objeto le asignamos una variable Eso permiteahorrarse la repeticioacuten innecesaria de caacutelculos si maacutes adelante volvemos a necesitar ese objeto Yen algunos casos como veremos maacutes adelante al hacer esto podemos acceder a propiedades delobjeto calculado que R no muestra en su respuesta por defecto

21

4 138 134 134 135 135 133 136 136 132 134 134 133 133 133 132 136 134 135 132 135 136 135 132 136 134 135 133 134 134 134 1310 136 138 134 135 137 133 135 138 136 137 135 134 137 135 136 138 137 134 133 135 135 134 131 135 137 133 133 137 136 135 135 132 138 135 135 135 136 135 133 1311 136 1310 134 131 133 138 139 135 134 1310 134 134 137 135 134 133 132 135 132 136 135 134 133 139 136 135 134 135 132 132 138 134 133 136 138 134 134 134 138 134 132 135 1310 136 1312 135 139 135 138 138 135 132 135 1310 136 135 136 135 135 137 134 133 134 133 133 134 133 133 133 133 137 138 135 134 135 134 135 137 135 133 134 134 137 133 132 135 137 135 134 136 132 135 132 136 1310 134 132 139 134 136 136 132 137 134 138 135 135 134 134 137 134 136 136 135 134 133 135 133 133 136 132 133 134 138 138 137 137 136 135 1310 134 134 134 138 136 134 136 137 135 135 136 138 134 138 134 135 137 136 134 137 137 135 137 132 136 135 133 135 136 130 133 135 135 137 134 137 131 135 136 135 138 132 134 136 139 137 1310 134 135 136 132 135 135 135 1313 133 136 133 136 135 130 1310 134 136 136 134 131 133 135 137 136 133 135 133 134 132 132 138 138 134 136 135 135 134 133 139 134 139 136 1311 133 132 132 136 138 1310 133 137 133 134 135 139 133 135 133 134 138 139 132 138 133 133 137 138 136 133 135 134 132 1311 137 137 136 134 133 135 1310 135 134 135 133 135 136 135 139 135 134 135 135 134 133 137 134 1310 135 134 132 139 134 137 133 135 134 131 136 135 136 134 138 135 135 138 138 134 132 135 133 134 138 138 135 138 132 1311 135 134 134 136 139 1310 137 134 137 132 133 135 1310 135 135 133 135 136 134 134 136 135 137 136 136 134 133 134 135 132 134 136 139 133 135 133 136 133 133 135 134 134 134 137 135 139 1310 133 134 136 131 137 138 135 133 133 135 133 133 137 136 135 135 138 134 139 136 135 135 138 134 130 133 137 133 134 1311 132 137 133 136 135 133 134 133 133 132 138 133 134 134 134 134 138 138 137 136 132 132 137 135 133 135 138 135 134 135 134 135 134 1312 133 135 133 133 133 132 134 131 139 135 135 135 138 138 135 138 133 134 133 136 136 135 134 133 133 135 133 137 135 132 133 133 132 131 132 136 137 130 136 133 134 1310 132 136 137 134 133 132 138 133 135 133 135 136 132 134 134 133 135 135 135 134 134 136 133 132 138 1310 135 135 132 132 137 136 134 135 134 134 136 134 136 135 133 137 137 136 137 134 134 137 133 130 134 136 135 137 136 136 135 137 134 134 135 136 136 135 136 132 134 133 139 135 133 137 135 136 137 136 136 136 134 135 137 137 133 134 137 137 136 133 134 137 131 135 136 133 137 133 135 133 137 138 133 137 132 135 134 133 132 135 134 134 135 133 134 139 135 134 139 137 133 132 133 134 133 134 135 135 138 134 135 134 135 139 137 133 133 132 136 132 138 135 132 137 134 135 136 132 134 135 135 133 135 136 137 135 138 132 131 137 135 135 138 134 137 136 139 1310 137 134 131 136 132 136 137 133 135 137 135 132 135 135 133 133 137 134 133 133 131 138 139 132 134 138 135 136 138 137 1310 138 133 134 134 135 134 134 135 136 135 134 134 135 133 136 135 137 132 133 139 132 133 137 136 134 137 131 135 134 132 134 138 135 134 131 132 134 135 136 133 134 138 134 132 135 134 132 134 133 136 135 138 133 139 1310 134 133 133 137 137 136 137 133 133 133 135 139 136 136 137 136 135 132 132 139 136 132 139 132 137 135 133 138 137 135 134 136 131 133 135 133 134 137 135 134 132 136 136 136 137 133 132 135 134 135 134 137 134 133 133 134 132 134 135 134 134 136 134 135 138 133 135 135 138 133 135 134 135 135 138 1311 132 134 134 136 133 135 133 136 132 131 136 134 136 132 136 136 136 136 130 136 134 134 131 138 131 1310 135 139 136 132 136 138 135 138 134 132 134 133 136 137 133 133 133 133 137 136 135 133 139 133 132 135 136 136 134 132 132 135 137 136 136 136 138 137 137 135 135 131 136 133 136 135 133 134 130 133 135 136 137 138 136 134 135 132 137 132 137 132 133 134 135 138 134 136 133 135 135 139 134 134 136 134 134 134 135 134 133 135 135 138 133 136 136 134 135 134 134 138 136 133 137 132 134 137 136 135 133 134 133 135 134 134 136 134 133 137 133 135 135 136 135 138 134 136 132 137 136 138 134 136 136 137 136 136 135 136 1310 138 133 137 135 136 137 134 136 133 134 133 132 132 134 137 132 132 133 132 138 134 134 135 135 139 135 134 132 134 135 134 139 137 133 134 134 135 133 133 137 138 135 139 133 138 136 136 134 133 136 135 1314 137 133 137 135 136 134 134 136 133 135 134 135 136 136 135 133 135 131 135 137 135 136 133 137 135 134 133 134 134 134 134 134 136 132 134 136 136 137 139 134 138 133 133 132 135 131 134 133 137 133 133 134 139 138 134 134 137 137 135 136 134 139 137 138 134 133 134 134 135 137 134 135 138 133 132 134 1310 133 135 134 132 138 137 136 135 138 1314 139 135 135 131 134 135 134 135 135 135 133 136 135 135 132 136 139 133 133 136 134 132 132 137 136 131 137 135 135 134 1313 1310 132 134 134 133 138 135 134 133 136 136 136 1310 134 137 136 138 139 137 135 134 134 137 137 138 133 134 135 137 135 136 1310 136 136 138 133 136 133 134 135 135 134 136 133 136 136 137 134 135 1316 136 136 132 136 136 133 134 133 137 134 135 134 133 138 134 1310 136 136 136 137 134 136 137 132 138 136 131 132 134 135 130 134 135 135 137 130 136 135 131 136 137 133 137 135 139 138 135 139 133 137 139 133 136 137 136 138 134 1310 136 134 133 139 136 137 133 13713

Rango maacuteximo y miacutenimo

Para empezar vamos a aprender tres nuevas funciones de R que nos permiten calcular esos tresvalores

gt (minimo = min(var3) )[1] 0gt (maximo = max(var3) )[1] 16gt (rango = range(var3) )[1] 0 16

El funcionamiento de las dos primeras es evidente La funcioacuten range devuelve un vector formadopor el maacuteximo y el miacutenimo

Tablas de frecuencia Clases de objetos en R

La tabla de frecuencia absoluta de var3 se obtiene usando la funcioacuten table de esta forma tansencilla

gt ( tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

La primera fila contiene los elementos de var3 y en la segunda aparece la frecuencia de cada unode ellos Puedes comprobar que son los mismos resultados que obtuvimos con Calc en la paacutegina10 del Tutorial01 Aunque alliacute desde luego el proceso fue maacutes laborioso

A lo mejor te has dado cuenta de que el formato de la respuesta es diferente de los que hemosobtenido hasta ahora Para empezar la respuesta no empieza con el [1] al que ya nos vamosacostumbrando El motivo de esto es que el objeto que hemos obtenido como respuesta no es unvector sino una tabla Ya dijimos que R utiliza distintos tipos de objetos con fines distintosiquestCoacutemo podemos saber de queacute clase es un objeto Pues usando una funcioacuten de R oportunamentellamada class Si la usamos con el vector var3 y con su tabla de frecuencias obtenemos

gt class(var3)[1] numericgt class(tablaFrecAbs)[1] table

El vector var3 es de clase numeric porque es un vector de nuacutemeros Y la tabla de frecuencias esde clase table Veremos a lo largo del curso otros objetos de tipo tabular como las matrices (clasematrix) los conjuntos de datos (clase dataframe) y los arraysAunque las tablas son objetos distintos de los vectores tienen algunas propiedades en comuacuten yalgunas de las funciones que hemos usado con vectores tambieacuten se pueden usar con tablas

Ejercicio 11Aplica las funciones length sum min max y range a la tabla tablaFrecAbs Solucioacuten en la paacutegina48

Siguiendo con los parecidos entre tablas y vectores puedes multiplicar (o dividir) una tabla porun nuacutemero y la operacioacuten se haraacute elemento a elemento

gt 2 tablaFrecAbsvar30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1618 50 200 376 488 492 372 262 174 86 56 12 4 4 4 2

Como ves cada frecuencia se multiplica por 2 Esta propiedad de las tablas permite obtener deforma muy sencilla la tabla de frecuencias relativa de var3 Como primer paso vamos a guardarla longitud de var3 en la variable n

22

gt ( n = length( var3 ) )[1] 1300

Y ahora podemos dividir la tabla por n para conseguir la tabla de frecuencias relativas (hemosestrechado la Consola de Comandos para que el resultado cupiera en esta paacutegina)

gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 400069230769 00192307692 00769230769 01446153846 01876923077

5 6 7 8 901892307692 01430769231 01007692308 00669230769 00330769231

10 11 12 13 1400215384615 00046153846 00015384615 00015384615 00015384615

1600007692308

Ejercicio 12Ya sabemos cuanto debe sumar esta tabla de frecuencias relativas Comprueacutebalo Solucioacuten en lapaacutegina 48

Si lo que queremos es una tabla de frecuencias acumuladas debemos emplear la funcioacuten cumsum

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Ejercicio 13La uacuteltima tabla que falta es la de frecuencias relativas acumuladas pero ya tienes todos los ingre-dientes para obtenerla de dos maneras diferentes Hazlo y comprueba si dan el mismo resultadoSi no es asiacute iquesta queacute crees que se debe y cuaacutel es la mejor opcioacuten Asigna el resultado a la variabletablaFrecRelAcu Solucioacuten en la paacutegina 49

Graacuteficos de columnas y diagramas de caja (boxplot) Argumentos con nombre

Vamos a fabricar nuestros primeros graacuteficos con R En concreto vamos a dibujar un graacutefico debarras a partir de la tabla de frecuencias de var3 usando la funcioacuten barplot de R

gt barplot(tablaFrecAbs)

Al ejecutar este comando no debes ver ninguna salida en la Consola de Comandos En su lugaren el panel inferior derecho de RStudio concretamente en la ventana Plots apareceraacute el graacuteficodeseado El resultado puede variar dependiendo de la anchura de tu ventana de RStudio

23

Hemos destacado ademaacutes en la figura los dos botones Zoom y Export que te permiten respecti-vamente ver una versioacuten ampliada de la Figura (que se redimensiona dinaacutemicamente si cambiasla ventana) y guardar esa figura como un fichero de graacuteficos que puedes insertar en cualquierdocumento editar con un programa de manipulacioacuten de graacuteficos etceacuteteraLos graacuteficos de R se pueden controlar hasta en sus detalles maacutes miacutenimos Como aperitivo miacutenimovamos a antildeadir algo de color al graacutefico

gt barplot(tablaFrecAbs col = heatcolors(15))

El resultado es esta figura

Las posibilidades de control de los graacuteficos de R son como decimos inmensas y pueden llegar aser abrumadoras Hay libros de cientos de paacuteginas dedicados a este tema como el R GraphicsCookbook de W Chang (ver las referencias del curso) Nosotros a lo largo de los tutoriales delcurso vamos a aprender algo maacutes aunque a penas nos podremos limitar a rozar la superficie delo que se puede llegar a hacerEn la Seccioacuten 231 del libro hemos descrito los diagramas de cajas o boxplots (recuerda la Figura22 de la paacuteg 36 del libro) Y en el Tutorial-01 dijimos que con Calc no es faacutecil dibujar ese tipode diagramas En cambio con R no podriacutea ser maacutes faacutecil

gt boxplot(var3)

Y el resultado es esta figura

24

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

gt vector1 + 5[1] 13 10 24 14 22 7 33 23 8 9 24 6gt 2 vector1[1] 16 10 38 18 34 4 56 36 6 8 38 2

veraacutes que en el primer caso cada uno de los elementos de vector1 se ha incrementado en 5mientras que en el segundo caso cada uno se ha multiplicado por 2 Sucede lo mismo con otrasoperaciones como elevar al cuadrado

gt vector1^2[1] 64 25 361 81 289 4 784 324 9 16 361 1

Y podemos aplicar funciones en un solo paso Por ejemplo podemos calcular el logaritmo neperianode todos los elementos de un vector en un soacutelo paso

gt log(vector1)[1] 20794415 16094379 29444390 21972246 28332133 06931472[7] 33322045 28903718 10986123 13862944 29444390 00000000

Los resultados de todas estas operaciones son de nuevo vectores Y por tanto se pueden asignara nuevas variables para utilizarlos en nuestras operaciones Por ejemplo si luego vas a necesitar loslogaritmos de vector1 puedes definir una variable para identificar ese vector llamada logVector1(e el nombre que tuacute quieras) haciendo

gt logVector1 = log(vector1)

Recuerda que si ademaacutes de la asignacioacuten quieres ver el resultado puedes rodear toda esta senten-cia con pareacutentesis De lo contrario R la ejecuta pero no imprime ninguna respuesta como ya sabes

Aunque al principio puede parecer complicado cuando te acostumbres a esta forma de trabajarcon vectores veraacutes que resulta muy coacutemoda y eficiente

Generando vectores de nuacutemeros enteros consecutivos

Hay muchas ocasiones en que para alguna operacioacuten necesitamos un vector que contenga losnuacutemeros enteros consecutivos del 1 al n o del 0 al n etc En R esto es muy faacutecil de hacer Porejemplo para conseguir un vector con los nuacutemeros del 1 al 15 basta con ejecutar

gt 115[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Esa notacioacuten con los dos puntos permite generar vectores en los que cada elemento es igual alanterior maacutes 1 Otro ejemplo

gt -713[1] -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13

O incluso cuando los puntos de partida no son enteros

gt 1575[1] 15 25 35 45 55 65 75gt 1574[1] 15 25 35 45 55 65

iquestVes la diferencia entre estos dos casos

Es muy posible que te esteacutes preguntando iquesty si quiero ir avanzando de 2 en 2 o quiero ir hacia atraacutes(ldquoavanzandordquo de minus2 en minus2 por ejemplo) Pronto cuando hayamos aprendido un poco maacutes volve-remos sobre esto y comprobaremos que R nos ofrece un cataacutelogo de herramientas extremadamentepotentes para fabricar vectores de acuerdo con nuestros deseos y necesidadesLos vectores fabricados con este meacutetodo son vectores iguales que los demaacutes y se pueden asignar avariables operar con ellos etc

19

Ejercicio 7

1 Fabrica un vector con los cuadrados de los nuacutemeros del 1 al 10 y asiacutegnalo a la variablecuadrados Usa los pareacutentesis para ver el resultado de la asignacioacuten

2 Haz lo mismo con los cuadrados de los nuacutemeros del 2 al 11 y un vector cuadrados2

3 Resta los vectores cuadrados2 - cuadrados iquestObservas algo interesante

Solucioacuten en la paacutegina 47

Funciones vectoriales

Hemos visto antes que se puede aplicar una funcioacuten como la raiacutez cuadrada a un vector y seobtiene como resultado otro vector con las raiacuteces cuadradas elemento a elemento Pero hay otrotipo de funciones que permiten hacer caacutelculos con el vector en conjunto Por ejemplo antes hemosfabricado el vector -713 y la funcioacuten length nos dice cuantos elementos tiene ese vector

gt length(-713)[1] 21

En el Ejercicio 3 (paacuteg 13) nos preguntaacutebamos cuantos elementos teniacutea el vector vectorEdades quehabiacuteamos cargado desde el fichero csv Puedes obtener la respuesta con length(vectorEdades)Para comprobarlo aseguacuterate de que has creado el vector llamado vectorEdades y ejecuta estaorden

gt length(vectorEdades)[1] 100

Como ves el resultado de length es el esperado

Vamos a conocer otra funcioacuten llamada sum que sirve para calcular la suma de todos los elementosde un vector

gt sum(vectorEdades)[1] 675

Ejercicio 8iquestCuaacutento vale la suma de los cuadrados de los nuacutemeros del 1 al 100 Solucioacuten en la paacutegina 47

A lo mejor te ha pasado desapercibido pero con las funciones length y sum estamos por fin encondiciones de empezar a hacer Estadiacutestica Descriptiva Por ejemplo podemos calcular la mediaaritmeacutetica de vectorEdades

gt ( mediaEdades = sum(vectorEdades) length(vectorEdades) )[1] 675

Y una vez que tenemos la media podemos calcular la varianza poblacional Para que resulte maacutesclaro vamos a mostrarte el proceso paso a paso aunque al final lo ejecutaremos en un soacutelo paso

1 Empezamos restando la media que estaacute en la variable mediaEdades de cada uno de loselementos de vectorEdades

vectorEdades - mediaEdades

El resultado es un vector de diferencias

2 Ahora elevamos cada una de esas diferencias al cuadrado

( vectorEdades - mediaEdades )^2

El resultado de este paso es de nuevo un vector ahora con las diferencias al cuadrado Fiacutejateen el pareacutentesis para garantizar que elevamos al cuadrado la diferencia Si no incluyeacuteramosel pareacutentesis iquestqueacute calculariacuteamos

20

3 A continuacioacuten sumamos todas esas diferencias al cuadrado usando la funcioacuten sum

sum( ( vectorEdades - mediaEdades )^2)

De nuevo el pareacutentesis es fundamental para que el cuadrado del vector de diferencias secalcule antes que la suma En este paso el resultado ya no es un vector sino un nuacutemero

4 Por uacuteltimo dividimos esa suma por n el nuacutemero de elementos de vectorEdades que seobtiene con la funcioacuten length

sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades)

El resultado de estos pasos se puede condensar en un soacutelo comando de R en el que a la vezcalculamos la varianza y la asignamos a una variable

gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades) )[1] 19875

Ejercicio 9

1 Calcula la desviacioacuten tiacutepica (poblacional) de vectorEdades

2 Calcula la cuasivarianza y cuasidesviacioacuten tiacutepica (muestrales) de vectorEdades

3 iquestQueacute sucede si en el tercer paso ejecutas el siguiente comandosum( vectorEdades - mediaEdades )^2iquestPor queacute sucede esto

Solucioacuten en la paacutegina 48

Con estos caacutelculos hemos empezado a hacer Estadiacutestica con R Naturalmente nos queda muchiacutesimoque aprender sobre los vectores de R Por ejemplo como se accede a una componente individualdel vector para responder a preguntas como ldquoiquestCuaacutento vale el quinto elemento del vectorrdquo Maacutesen general aprenderemos a extraer aquellos elementos del vector que cumplan alguna condicioacutenrespondiendo a preguntas como ldquoiquestQueacute elementos del vector son mayores que 7rdquo

42 Y por fin hagamos Estadiacutestica DescriptivaEn esta seccioacuten vamos a trabajar con un vector de datos contenido en este fichero adjunto

Este vector contiene los datos de la variable var3 del fichero Tut01-PracticaConCalccsv queya hemos utilizado en el Tutorial-00 para aprender a hacer Estadiacutestica Descriptiva con Calc Enesta seccioacuten vamos a reproducir los resultados que obtuvimos alliacute pero esta vez usando R Parapreparar el terreno vamos a hacer limpieza

Ejercicio 10

1 Cierra Rstudio y vuelve a abrirlo para limpiar la memora del sistema El trabajo que hemoshecho hasta ahora se perderaacute (aunque los comandos siguen en el Historial de Comandos queya vimos)

2 Establece el Directorio de Trabajo (por ejemplo el Escritorio) y aseguacuterate de que Tut02-var3csvestaacute guardado en la subcarpeta datos de ese directorio

3 Carga de nuevo el contenido de ese fichero en un vector var3 de R

Solucioacuten en la paacutegina 48

Veraacutes en lo que sigue que siempre que calculamos un objeto le asignamos una variable Eso permiteahorrarse la repeticioacuten innecesaria de caacutelculos si maacutes adelante volvemos a necesitar ese objeto Yen algunos casos como veremos maacutes adelante al hacer esto podemos acceder a propiedades delobjeto calculado que R no muestra en su respuesta por defecto

21

4 138 134 134 135 135 133 136 136 132 134 134 133 133 133 132 136 134 135 132 135 136 135 132 136 134 135 133 134 134 134 1310 136 138 134 135 137 133 135 138 136 137 135 134 137 135 136 138 137 134 133 135 135 134 131 135 137 133 133 137 136 135 135 132 138 135 135 135 136 135 133 1311 136 1310 134 131 133 138 139 135 134 1310 134 134 137 135 134 133 132 135 132 136 135 134 133 139 136 135 134 135 132 132 138 134 133 136 138 134 134 134 138 134 132 135 1310 136 1312 135 139 135 138 138 135 132 135 1310 136 135 136 135 135 137 134 133 134 133 133 134 133 133 133 133 137 138 135 134 135 134 135 137 135 133 134 134 137 133 132 135 137 135 134 136 132 135 132 136 1310 134 132 139 134 136 136 132 137 134 138 135 135 134 134 137 134 136 136 135 134 133 135 133 133 136 132 133 134 138 138 137 137 136 135 1310 134 134 134 138 136 134 136 137 135 135 136 138 134 138 134 135 137 136 134 137 137 135 137 132 136 135 133 135 136 130 133 135 135 137 134 137 131 135 136 135 138 132 134 136 139 137 1310 134 135 136 132 135 135 135 1313 133 136 133 136 135 130 1310 134 136 136 134 131 133 135 137 136 133 135 133 134 132 132 138 138 134 136 135 135 134 133 139 134 139 136 1311 133 132 132 136 138 1310 133 137 133 134 135 139 133 135 133 134 138 139 132 138 133 133 137 138 136 133 135 134 132 1311 137 137 136 134 133 135 1310 135 134 135 133 135 136 135 139 135 134 135 135 134 133 137 134 1310 135 134 132 139 134 137 133 135 134 131 136 135 136 134 138 135 135 138 138 134 132 135 133 134 138 138 135 138 132 1311 135 134 134 136 139 1310 137 134 137 132 133 135 1310 135 135 133 135 136 134 134 136 135 137 136 136 134 133 134 135 132 134 136 139 133 135 133 136 133 133 135 134 134 134 137 135 139 1310 133 134 136 131 137 138 135 133 133 135 133 133 137 136 135 135 138 134 139 136 135 135 138 134 130 133 137 133 134 1311 132 137 133 136 135 133 134 133 133 132 138 133 134 134 134 134 138 138 137 136 132 132 137 135 133 135 138 135 134 135 134 135 134 1312 133 135 133 133 133 132 134 131 139 135 135 135 138 138 135 138 133 134 133 136 136 135 134 133 133 135 133 137 135 132 133 133 132 131 132 136 137 130 136 133 134 1310 132 136 137 134 133 132 138 133 135 133 135 136 132 134 134 133 135 135 135 134 134 136 133 132 138 1310 135 135 132 132 137 136 134 135 134 134 136 134 136 135 133 137 137 136 137 134 134 137 133 130 134 136 135 137 136 136 135 137 134 134 135 136 136 135 136 132 134 133 139 135 133 137 135 136 137 136 136 136 134 135 137 137 133 134 137 137 136 133 134 137 131 135 136 133 137 133 135 133 137 138 133 137 132 135 134 133 132 135 134 134 135 133 134 139 135 134 139 137 133 132 133 134 133 134 135 135 138 134 135 134 135 139 137 133 133 132 136 132 138 135 132 137 134 135 136 132 134 135 135 133 135 136 137 135 138 132 131 137 135 135 138 134 137 136 139 1310 137 134 131 136 132 136 137 133 135 137 135 132 135 135 133 133 137 134 133 133 131 138 139 132 134 138 135 136 138 137 1310 138 133 134 134 135 134 134 135 136 135 134 134 135 133 136 135 137 132 133 139 132 133 137 136 134 137 131 135 134 132 134 138 135 134 131 132 134 135 136 133 134 138 134 132 135 134 132 134 133 136 135 138 133 139 1310 134 133 133 137 137 136 137 133 133 133 135 139 136 136 137 136 135 132 132 139 136 132 139 132 137 135 133 138 137 135 134 136 131 133 135 133 134 137 135 134 132 136 136 136 137 133 132 135 134 135 134 137 134 133 133 134 132 134 135 134 134 136 134 135 138 133 135 135 138 133 135 134 135 135 138 1311 132 134 134 136 133 135 133 136 132 131 136 134 136 132 136 136 136 136 130 136 134 134 131 138 131 1310 135 139 136 132 136 138 135 138 134 132 134 133 136 137 133 133 133 133 137 136 135 133 139 133 132 135 136 136 134 132 132 135 137 136 136 136 138 137 137 135 135 131 136 133 136 135 133 134 130 133 135 136 137 138 136 134 135 132 137 132 137 132 133 134 135 138 134 136 133 135 135 139 134 134 136 134 134 134 135 134 133 135 135 138 133 136 136 134 135 134 134 138 136 133 137 132 134 137 136 135 133 134 133 135 134 134 136 134 133 137 133 135 135 136 135 138 134 136 132 137 136 138 134 136 136 137 136 136 135 136 1310 138 133 137 135 136 137 134 136 133 134 133 132 132 134 137 132 132 133 132 138 134 134 135 135 139 135 134 132 134 135 134 139 137 133 134 134 135 133 133 137 138 135 139 133 138 136 136 134 133 136 135 1314 137 133 137 135 136 134 134 136 133 135 134 135 136 136 135 133 135 131 135 137 135 136 133 137 135 134 133 134 134 134 134 134 136 132 134 136 136 137 139 134 138 133 133 132 135 131 134 133 137 133 133 134 139 138 134 134 137 137 135 136 134 139 137 138 134 133 134 134 135 137 134 135 138 133 132 134 1310 133 135 134 132 138 137 136 135 138 1314 139 135 135 131 134 135 134 135 135 135 133 136 135 135 132 136 139 133 133 136 134 132 132 137 136 131 137 135 135 134 1313 1310 132 134 134 133 138 135 134 133 136 136 136 1310 134 137 136 138 139 137 135 134 134 137 137 138 133 134 135 137 135 136 1310 136 136 138 133 136 133 134 135 135 134 136 133 136 136 137 134 135 1316 136 136 132 136 136 133 134 133 137 134 135 134 133 138 134 1310 136 136 136 137 134 136 137 132 138 136 131 132 134 135 130 134 135 135 137 130 136 135 131 136 137 133 137 135 139 138 135 139 133 137 139 133 136 137 136 138 134 1310 136 134 133 139 136 137 133 13713

Rango maacuteximo y miacutenimo

Para empezar vamos a aprender tres nuevas funciones de R que nos permiten calcular esos tresvalores

gt (minimo = min(var3) )[1] 0gt (maximo = max(var3) )[1] 16gt (rango = range(var3) )[1] 0 16

El funcionamiento de las dos primeras es evidente La funcioacuten range devuelve un vector formadopor el maacuteximo y el miacutenimo

Tablas de frecuencia Clases de objetos en R

La tabla de frecuencia absoluta de var3 se obtiene usando la funcioacuten table de esta forma tansencilla

gt ( tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

La primera fila contiene los elementos de var3 y en la segunda aparece la frecuencia de cada unode ellos Puedes comprobar que son los mismos resultados que obtuvimos con Calc en la paacutegina10 del Tutorial01 Aunque alliacute desde luego el proceso fue maacutes laborioso

A lo mejor te has dado cuenta de que el formato de la respuesta es diferente de los que hemosobtenido hasta ahora Para empezar la respuesta no empieza con el [1] al que ya nos vamosacostumbrando El motivo de esto es que el objeto que hemos obtenido como respuesta no es unvector sino una tabla Ya dijimos que R utiliza distintos tipos de objetos con fines distintosiquestCoacutemo podemos saber de queacute clase es un objeto Pues usando una funcioacuten de R oportunamentellamada class Si la usamos con el vector var3 y con su tabla de frecuencias obtenemos

gt class(var3)[1] numericgt class(tablaFrecAbs)[1] table

El vector var3 es de clase numeric porque es un vector de nuacutemeros Y la tabla de frecuencias esde clase table Veremos a lo largo del curso otros objetos de tipo tabular como las matrices (clasematrix) los conjuntos de datos (clase dataframe) y los arraysAunque las tablas son objetos distintos de los vectores tienen algunas propiedades en comuacuten yalgunas de las funciones que hemos usado con vectores tambieacuten se pueden usar con tablas

Ejercicio 11Aplica las funciones length sum min max y range a la tabla tablaFrecAbs Solucioacuten en la paacutegina48

Siguiendo con los parecidos entre tablas y vectores puedes multiplicar (o dividir) una tabla porun nuacutemero y la operacioacuten se haraacute elemento a elemento

gt 2 tablaFrecAbsvar30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1618 50 200 376 488 492 372 262 174 86 56 12 4 4 4 2

Como ves cada frecuencia se multiplica por 2 Esta propiedad de las tablas permite obtener deforma muy sencilla la tabla de frecuencias relativa de var3 Como primer paso vamos a guardarla longitud de var3 en la variable n

22

gt ( n = length( var3 ) )[1] 1300

Y ahora podemos dividir la tabla por n para conseguir la tabla de frecuencias relativas (hemosestrechado la Consola de Comandos para que el resultado cupiera en esta paacutegina)

gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 400069230769 00192307692 00769230769 01446153846 01876923077

5 6 7 8 901892307692 01430769231 01007692308 00669230769 00330769231

10 11 12 13 1400215384615 00046153846 00015384615 00015384615 00015384615

1600007692308

Ejercicio 12Ya sabemos cuanto debe sumar esta tabla de frecuencias relativas Comprueacutebalo Solucioacuten en lapaacutegina 48

Si lo que queremos es una tabla de frecuencias acumuladas debemos emplear la funcioacuten cumsum

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Ejercicio 13La uacuteltima tabla que falta es la de frecuencias relativas acumuladas pero ya tienes todos los ingre-dientes para obtenerla de dos maneras diferentes Hazlo y comprueba si dan el mismo resultadoSi no es asiacute iquesta queacute crees que se debe y cuaacutel es la mejor opcioacuten Asigna el resultado a la variabletablaFrecRelAcu Solucioacuten en la paacutegina 49

Graacuteficos de columnas y diagramas de caja (boxplot) Argumentos con nombre

Vamos a fabricar nuestros primeros graacuteficos con R En concreto vamos a dibujar un graacutefico debarras a partir de la tabla de frecuencias de var3 usando la funcioacuten barplot de R

gt barplot(tablaFrecAbs)

Al ejecutar este comando no debes ver ninguna salida en la Consola de Comandos En su lugaren el panel inferior derecho de RStudio concretamente en la ventana Plots apareceraacute el graacuteficodeseado El resultado puede variar dependiendo de la anchura de tu ventana de RStudio

23

Hemos destacado ademaacutes en la figura los dos botones Zoom y Export que te permiten respecti-vamente ver una versioacuten ampliada de la Figura (que se redimensiona dinaacutemicamente si cambiasla ventana) y guardar esa figura como un fichero de graacuteficos que puedes insertar en cualquierdocumento editar con un programa de manipulacioacuten de graacuteficos etceacuteteraLos graacuteficos de R se pueden controlar hasta en sus detalles maacutes miacutenimos Como aperitivo miacutenimovamos a antildeadir algo de color al graacutefico

gt barplot(tablaFrecAbs col = heatcolors(15))

El resultado es esta figura

Las posibilidades de control de los graacuteficos de R son como decimos inmensas y pueden llegar aser abrumadoras Hay libros de cientos de paacuteginas dedicados a este tema como el R GraphicsCookbook de W Chang (ver las referencias del curso) Nosotros a lo largo de los tutoriales delcurso vamos a aprender algo maacutes aunque a penas nos podremos limitar a rozar la superficie delo que se puede llegar a hacerEn la Seccioacuten 231 del libro hemos descrito los diagramas de cajas o boxplots (recuerda la Figura22 de la paacuteg 36 del libro) Y en el Tutorial-01 dijimos que con Calc no es faacutecil dibujar ese tipode diagramas En cambio con R no podriacutea ser maacutes faacutecil

gt boxplot(var3)

Y el resultado es esta figura

24

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

Ejercicio 7

1 Fabrica un vector con los cuadrados de los nuacutemeros del 1 al 10 y asiacutegnalo a la variablecuadrados Usa los pareacutentesis para ver el resultado de la asignacioacuten

2 Haz lo mismo con los cuadrados de los nuacutemeros del 2 al 11 y un vector cuadrados2

3 Resta los vectores cuadrados2 - cuadrados iquestObservas algo interesante

Solucioacuten en la paacutegina 47

Funciones vectoriales

Hemos visto antes que se puede aplicar una funcioacuten como la raiacutez cuadrada a un vector y seobtiene como resultado otro vector con las raiacuteces cuadradas elemento a elemento Pero hay otrotipo de funciones que permiten hacer caacutelculos con el vector en conjunto Por ejemplo antes hemosfabricado el vector -713 y la funcioacuten length nos dice cuantos elementos tiene ese vector

gt length(-713)[1] 21

En el Ejercicio 3 (paacuteg 13) nos preguntaacutebamos cuantos elementos teniacutea el vector vectorEdades quehabiacuteamos cargado desde el fichero csv Puedes obtener la respuesta con length(vectorEdades)Para comprobarlo aseguacuterate de que has creado el vector llamado vectorEdades y ejecuta estaorden

gt length(vectorEdades)[1] 100

Como ves el resultado de length es el esperado

Vamos a conocer otra funcioacuten llamada sum que sirve para calcular la suma de todos los elementosde un vector

gt sum(vectorEdades)[1] 675

Ejercicio 8iquestCuaacutento vale la suma de los cuadrados de los nuacutemeros del 1 al 100 Solucioacuten en la paacutegina 47

A lo mejor te ha pasado desapercibido pero con las funciones length y sum estamos por fin encondiciones de empezar a hacer Estadiacutestica Descriptiva Por ejemplo podemos calcular la mediaaritmeacutetica de vectorEdades

gt ( mediaEdades = sum(vectorEdades) length(vectorEdades) )[1] 675

Y una vez que tenemos la media podemos calcular la varianza poblacional Para que resulte maacutesclaro vamos a mostrarte el proceso paso a paso aunque al final lo ejecutaremos en un soacutelo paso

1 Empezamos restando la media que estaacute en la variable mediaEdades de cada uno de loselementos de vectorEdades

vectorEdades - mediaEdades

El resultado es un vector de diferencias

2 Ahora elevamos cada una de esas diferencias al cuadrado

( vectorEdades - mediaEdades )^2

El resultado de este paso es de nuevo un vector ahora con las diferencias al cuadrado Fiacutejateen el pareacutentesis para garantizar que elevamos al cuadrado la diferencia Si no incluyeacuteramosel pareacutentesis iquestqueacute calculariacuteamos

20

3 A continuacioacuten sumamos todas esas diferencias al cuadrado usando la funcioacuten sum

sum( ( vectorEdades - mediaEdades )^2)

De nuevo el pareacutentesis es fundamental para que el cuadrado del vector de diferencias secalcule antes que la suma En este paso el resultado ya no es un vector sino un nuacutemero

4 Por uacuteltimo dividimos esa suma por n el nuacutemero de elementos de vectorEdades que seobtiene con la funcioacuten length

sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades)

El resultado de estos pasos se puede condensar en un soacutelo comando de R en el que a la vezcalculamos la varianza y la asignamos a una variable

gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades) )[1] 19875

Ejercicio 9

1 Calcula la desviacioacuten tiacutepica (poblacional) de vectorEdades

2 Calcula la cuasivarianza y cuasidesviacioacuten tiacutepica (muestrales) de vectorEdades

3 iquestQueacute sucede si en el tercer paso ejecutas el siguiente comandosum( vectorEdades - mediaEdades )^2iquestPor queacute sucede esto

Solucioacuten en la paacutegina 48

Con estos caacutelculos hemos empezado a hacer Estadiacutestica con R Naturalmente nos queda muchiacutesimoque aprender sobre los vectores de R Por ejemplo como se accede a una componente individualdel vector para responder a preguntas como ldquoiquestCuaacutento vale el quinto elemento del vectorrdquo Maacutesen general aprenderemos a extraer aquellos elementos del vector que cumplan alguna condicioacutenrespondiendo a preguntas como ldquoiquestQueacute elementos del vector son mayores que 7rdquo

42 Y por fin hagamos Estadiacutestica DescriptivaEn esta seccioacuten vamos a trabajar con un vector de datos contenido en este fichero adjunto

Este vector contiene los datos de la variable var3 del fichero Tut01-PracticaConCalccsv queya hemos utilizado en el Tutorial-00 para aprender a hacer Estadiacutestica Descriptiva con Calc Enesta seccioacuten vamos a reproducir los resultados que obtuvimos alliacute pero esta vez usando R Parapreparar el terreno vamos a hacer limpieza

Ejercicio 10

1 Cierra Rstudio y vuelve a abrirlo para limpiar la memora del sistema El trabajo que hemoshecho hasta ahora se perderaacute (aunque los comandos siguen en el Historial de Comandos queya vimos)

2 Establece el Directorio de Trabajo (por ejemplo el Escritorio) y aseguacuterate de que Tut02-var3csvestaacute guardado en la subcarpeta datos de ese directorio

3 Carga de nuevo el contenido de ese fichero en un vector var3 de R

Solucioacuten en la paacutegina 48

Veraacutes en lo que sigue que siempre que calculamos un objeto le asignamos una variable Eso permiteahorrarse la repeticioacuten innecesaria de caacutelculos si maacutes adelante volvemos a necesitar ese objeto Yen algunos casos como veremos maacutes adelante al hacer esto podemos acceder a propiedades delobjeto calculado que R no muestra en su respuesta por defecto

21

4 138 134 134 135 135 133 136 136 132 134 134 133 133 133 132 136 134 135 132 135 136 135 132 136 134 135 133 134 134 134 1310 136 138 134 135 137 133 135 138 136 137 135 134 137 135 136 138 137 134 133 135 135 134 131 135 137 133 133 137 136 135 135 132 138 135 135 135 136 135 133 1311 136 1310 134 131 133 138 139 135 134 1310 134 134 137 135 134 133 132 135 132 136 135 134 133 139 136 135 134 135 132 132 138 134 133 136 138 134 134 134 138 134 132 135 1310 136 1312 135 139 135 138 138 135 132 135 1310 136 135 136 135 135 137 134 133 134 133 133 134 133 133 133 133 137 138 135 134 135 134 135 137 135 133 134 134 137 133 132 135 137 135 134 136 132 135 132 136 1310 134 132 139 134 136 136 132 137 134 138 135 135 134 134 137 134 136 136 135 134 133 135 133 133 136 132 133 134 138 138 137 137 136 135 1310 134 134 134 138 136 134 136 137 135 135 136 138 134 138 134 135 137 136 134 137 137 135 137 132 136 135 133 135 136 130 133 135 135 137 134 137 131 135 136 135 138 132 134 136 139 137 1310 134 135 136 132 135 135 135 1313 133 136 133 136 135 130 1310 134 136 136 134 131 133 135 137 136 133 135 133 134 132 132 138 138 134 136 135 135 134 133 139 134 139 136 1311 133 132 132 136 138 1310 133 137 133 134 135 139 133 135 133 134 138 139 132 138 133 133 137 138 136 133 135 134 132 1311 137 137 136 134 133 135 1310 135 134 135 133 135 136 135 139 135 134 135 135 134 133 137 134 1310 135 134 132 139 134 137 133 135 134 131 136 135 136 134 138 135 135 138 138 134 132 135 133 134 138 138 135 138 132 1311 135 134 134 136 139 1310 137 134 137 132 133 135 1310 135 135 133 135 136 134 134 136 135 137 136 136 134 133 134 135 132 134 136 139 133 135 133 136 133 133 135 134 134 134 137 135 139 1310 133 134 136 131 137 138 135 133 133 135 133 133 137 136 135 135 138 134 139 136 135 135 138 134 130 133 137 133 134 1311 132 137 133 136 135 133 134 133 133 132 138 133 134 134 134 134 138 138 137 136 132 132 137 135 133 135 138 135 134 135 134 135 134 1312 133 135 133 133 133 132 134 131 139 135 135 135 138 138 135 138 133 134 133 136 136 135 134 133 133 135 133 137 135 132 133 133 132 131 132 136 137 130 136 133 134 1310 132 136 137 134 133 132 138 133 135 133 135 136 132 134 134 133 135 135 135 134 134 136 133 132 138 1310 135 135 132 132 137 136 134 135 134 134 136 134 136 135 133 137 137 136 137 134 134 137 133 130 134 136 135 137 136 136 135 137 134 134 135 136 136 135 136 132 134 133 139 135 133 137 135 136 137 136 136 136 134 135 137 137 133 134 137 137 136 133 134 137 131 135 136 133 137 133 135 133 137 138 133 137 132 135 134 133 132 135 134 134 135 133 134 139 135 134 139 137 133 132 133 134 133 134 135 135 138 134 135 134 135 139 137 133 133 132 136 132 138 135 132 137 134 135 136 132 134 135 135 133 135 136 137 135 138 132 131 137 135 135 138 134 137 136 139 1310 137 134 131 136 132 136 137 133 135 137 135 132 135 135 133 133 137 134 133 133 131 138 139 132 134 138 135 136 138 137 1310 138 133 134 134 135 134 134 135 136 135 134 134 135 133 136 135 137 132 133 139 132 133 137 136 134 137 131 135 134 132 134 138 135 134 131 132 134 135 136 133 134 138 134 132 135 134 132 134 133 136 135 138 133 139 1310 134 133 133 137 137 136 137 133 133 133 135 139 136 136 137 136 135 132 132 139 136 132 139 132 137 135 133 138 137 135 134 136 131 133 135 133 134 137 135 134 132 136 136 136 137 133 132 135 134 135 134 137 134 133 133 134 132 134 135 134 134 136 134 135 138 133 135 135 138 133 135 134 135 135 138 1311 132 134 134 136 133 135 133 136 132 131 136 134 136 132 136 136 136 136 130 136 134 134 131 138 131 1310 135 139 136 132 136 138 135 138 134 132 134 133 136 137 133 133 133 133 137 136 135 133 139 133 132 135 136 136 134 132 132 135 137 136 136 136 138 137 137 135 135 131 136 133 136 135 133 134 130 133 135 136 137 138 136 134 135 132 137 132 137 132 133 134 135 138 134 136 133 135 135 139 134 134 136 134 134 134 135 134 133 135 135 138 133 136 136 134 135 134 134 138 136 133 137 132 134 137 136 135 133 134 133 135 134 134 136 134 133 137 133 135 135 136 135 138 134 136 132 137 136 138 134 136 136 137 136 136 135 136 1310 138 133 137 135 136 137 134 136 133 134 133 132 132 134 137 132 132 133 132 138 134 134 135 135 139 135 134 132 134 135 134 139 137 133 134 134 135 133 133 137 138 135 139 133 138 136 136 134 133 136 135 1314 137 133 137 135 136 134 134 136 133 135 134 135 136 136 135 133 135 131 135 137 135 136 133 137 135 134 133 134 134 134 134 134 136 132 134 136 136 137 139 134 138 133 133 132 135 131 134 133 137 133 133 134 139 138 134 134 137 137 135 136 134 139 137 138 134 133 134 134 135 137 134 135 138 133 132 134 1310 133 135 134 132 138 137 136 135 138 1314 139 135 135 131 134 135 134 135 135 135 133 136 135 135 132 136 139 133 133 136 134 132 132 137 136 131 137 135 135 134 1313 1310 132 134 134 133 138 135 134 133 136 136 136 1310 134 137 136 138 139 137 135 134 134 137 137 138 133 134 135 137 135 136 1310 136 136 138 133 136 133 134 135 135 134 136 133 136 136 137 134 135 1316 136 136 132 136 136 133 134 133 137 134 135 134 133 138 134 1310 136 136 136 137 134 136 137 132 138 136 131 132 134 135 130 134 135 135 137 130 136 135 131 136 137 133 137 135 139 138 135 139 133 137 139 133 136 137 136 138 134 1310 136 134 133 139 136 137 133 13713

Rango maacuteximo y miacutenimo

Para empezar vamos a aprender tres nuevas funciones de R que nos permiten calcular esos tresvalores

gt (minimo = min(var3) )[1] 0gt (maximo = max(var3) )[1] 16gt (rango = range(var3) )[1] 0 16

El funcionamiento de las dos primeras es evidente La funcioacuten range devuelve un vector formadopor el maacuteximo y el miacutenimo

Tablas de frecuencia Clases de objetos en R

La tabla de frecuencia absoluta de var3 se obtiene usando la funcioacuten table de esta forma tansencilla

gt ( tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

La primera fila contiene los elementos de var3 y en la segunda aparece la frecuencia de cada unode ellos Puedes comprobar que son los mismos resultados que obtuvimos con Calc en la paacutegina10 del Tutorial01 Aunque alliacute desde luego el proceso fue maacutes laborioso

A lo mejor te has dado cuenta de que el formato de la respuesta es diferente de los que hemosobtenido hasta ahora Para empezar la respuesta no empieza con el [1] al que ya nos vamosacostumbrando El motivo de esto es que el objeto que hemos obtenido como respuesta no es unvector sino una tabla Ya dijimos que R utiliza distintos tipos de objetos con fines distintosiquestCoacutemo podemos saber de queacute clase es un objeto Pues usando una funcioacuten de R oportunamentellamada class Si la usamos con el vector var3 y con su tabla de frecuencias obtenemos

gt class(var3)[1] numericgt class(tablaFrecAbs)[1] table

El vector var3 es de clase numeric porque es un vector de nuacutemeros Y la tabla de frecuencias esde clase table Veremos a lo largo del curso otros objetos de tipo tabular como las matrices (clasematrix) los conjuntos de datos (clase dataframe) y los arraysAunque las tablas son objetos distintos de los vectores tienen algunas propiedades en comuacuten yalgunas de las funciones que hemos usado con vectores tambieacuten se pueden usar con tablas

Ejercicio 11Aplica las funciones length sum min max y range a la tabla tablaFrecAbs Solucioacuten en la paacutegina48

Siguiendo con los parecidos entre tablas y vectores puedes multiplicar (o dividir) una tabla porun nuacutemero y la operacioacuten se haraacute elemento a elemento

gt 2 tablaFrecAbsvar30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1618 50 200 376 488 492 372 262 174 86 56 12 4 4 4 2

Como ves cada frecuencia se multiplica por 2 Esta propiedad de las tablas permite obtener deforma muy sencilla la tabla de frecuencias relativa de var3 Como primer paso vamos a guardarla longitud de var3 en la variable n

22

gt ( n = length( var3 ) )[1] 1300

Y ahora podemos dividir la tabla por n para conseguir la tabla de frecuencias relativas (hemosestrechado la Consola de Comandos para que el resultado cupiera en esta paacutegina)

gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 400069230769 00192307692 00769230769 01446153846 01876923077

5 6 7 8 901892307692 01430769231 01007692308 00669230769 00330769231

10 11 12 13 1400215384615 00046153846 00015384615 00015384615 00015384615

1600007692308

Ejercicio 12Ya sabemos cuanto debe sumar esta tabla de frecuencias relativas Comprueacutebalo Solucioacuten en lapaacutegina 48

Si lo que queremos es una tabla de frecuencias acumuladas debemos emplear la funcioacuten cumsum

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Ejercicio 13La uacuteltima tabla que falta es la de frecuencias relativas acumuladas pero ya tienes todos los ingre-dientes para obtenerla de dos maneras diferentes Hazlo y comprueba si dan el mismo resultadoSi no es asiacute iquesta queacute crees que se debe y cuaacutel es la mejor opcioacuten Asigna el resultado a la variabletablaFrecRelAcu Solucioacuten en la paacutegina 49

Graacuteficos de columnas y diagramas de caja (boxplot) Argumentos con nombre

Vamos a fabricar nuestros primeros graacuteficos con R En concreto vamos a dibujar un graacutefico debarras a partir de la tabla de frecuencias de var3 usando la funcioacuten barplot de R

gt barplot(tablaFrecAbs)

Al ejecutar este comando no debes ver ninguna salida en la Consola de Comandos En su lugaren el panel inferior derecho de RStudio concretamente en la ventana Plots apareceraacute el graacuteficodeseado El resultado puede variar dependiendo de la anchura de tu ventana de RStudio

23

Hemos destacado ademaacutes en la figura los dos botones Zoom y Export que te permiten respecti-vamente ver una versioacuten ampliada de la Figura (que se redimensiona dinaacutemicamente si cambiasla ventana) y guardar esa figura como un fichero de graacuteficos que puedes insertar en cualquierdocumento editar con un programa de manipulacioacuten de graacuteficos etceacuteteraLos graacuteficos de R se pueden controlar hasta en sus detalles maacutes miacutenimos Como aperitivo miacutenimovamos a antildeadir algo de color al graacutefico

gt barplot(tablaFrecAbs col = heatcolors(15))

El resultado es esta figura

Las posibilidades de control de los graacuteficos de R son como decimos inmensas y pueden llegar aser abrumadoras Hay libros de cientos de paacuteginas dedicados a este tema como el R GraphicsCookbook de W Chang (ver las referencias del curso) Nosotros a lo largo de los tutoriales delcurso vamos a aprender algo maacutes aunque a penas nos podremos limitar a rozar la superficie delo que se puede llegar a hacerEn la Seccioacuten 231 del libro hemos descrito los diagramas de cajas o boxplots (recuerda la Figura22 de la paacuteg 36 del libro) Y en el Tutorial-01 dijimos que con Calc no es faacutecil dibujar ese tipode diagramas En cambio con R no podriacutea ser maacutes faacutecil

gt boxplot(var3)

Y el resultado es esta figura

24

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

3 A continuacioacuten sumamos todas esas diferencias al cuadrado usando la funcioacuten sum

sum( ( vectorEdades - mediaEdades )^2)

De nuevo el pareacutentesis es fundamental para que el cuadrado del vector de diferencias secalcule antes que la suma En este paso el resultado ya no es un vector sino un nuacutemero

4 Por uacuteltimo dividimos esa suma por n el nuacutemero de elementos de vectorEdades que seobtiene con la funcioacuten length

sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades)

El resultado de estos pasos se puede condensar en un soacutelo comando de R en el que a la vezcalculamos la varianza y la asignamos a una variable

gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) length(vectorEdades) )[1] 19875

Ejercicio 9

1 Calcula la desviacioacuten tiacutepica (poblacional) de vectorEdades

2 Calcula la cuasivarianza y cuasidesviacioacuten tiacutepica (muestrales) de vectorEdades

3 iquestQueacute sucede si en el tercer paso ejecutas el siguiente comandosum( vectorEdades - mediaEdades )^2iquestPor queacute sucede esto

Solucioacuten en la paacutegina 48

Con estos caacutelculos hemos empezado a hacer Estadiacutestica con R Naturalmente nos queda muchiacutesimoque aprender sobre los vectores de R Por ejemplo como se accede a una componente individualdel vector para responder a preguntas como ldquoiquestCuaacutento vale el quinto elemento del vectorrdquo Maacutesen general aprenderemos a extraer aquellos elementos del vector que cumplan alguna condicioacutenrespondiendo a preguntas como ldquoiquestQueacute elementos del vector son mayores que 7rdquo

42 Y por fin hagamos Estadiacutestica DescriptivaEn esta seccioacuten vamos a trabajar con un vector de datos contenido en este fichero adjunto

Este vector contiene los datos de la variable var3 del fichero Tut01-PracticaConCalccsv queya hemos utilizado en el Tutorial-00 para aprender a hacer Estadiacutestica Descriptiva con Calc Enesta seccioacuten vamos a reproducir los resultados que obtuvimos alliacute pero esta vez usando R Parapreparar el terreno vamos a hacer limpieza

Ejercicio 10

1 Cierra Rstudio y vuelve a abrirlo para limpiar la memora del sistema El trabajo que hemoshecho hasta ahora se perderaacute (aunque los comandos siguen en el Historial de Comandos queya vimos)

2 Establece el Directorio de Trabajo (por ejemplo el Escritorio) y aseguacuterate de que Tut02-var3csvestaacute guardado en la subcarpeta datos de ese directorio

3 Carga de nuevo el contenido de ese fichero en un vector var3 de R

Solucioacuten en la paacutegina 48

Veraacutes en lo que sigue que siempre que calculamos un objeto le asignamos una variable Eso permiteahorrarse la repeticioacuten innecesaria de caacutelculos si maacutes adelante volvemos a necesitar ese objeto Yen algunos casos como veremos maacutes adelante al hacer esto podemos acceder a propiedades delobjeto calculado que R no muestra en su respuesta por defecto

21

4 138 134 134 135 135 133 136 136 132 134 134 133 133 133 132 136 134 135 132 135 136 135 132 136 134 135 133 134 134 134 1310 136 138 134 135 137 133 135 138 136 137 135 134 137 135 136 138 137 134 133 135 135 134 131 135 137 133 133 137 136 135 135 132 138 135 135 135 136 135 133 1311 136 1310 134 131 133 138 139 135 134 1310 134 134 137 135 134 133 132 135 132 136 135 134 133 139 136 135 134 135 132 132 138 134 133 136 138 134 134 134 138 134 132 135 1310 136 1312 135 139 135 138 138 135 132 135 1310 136 135 136 135 135 137 134 133 134 133 133 134 133 133 133 133 137 138 135 134 135 134 135 137 135 133 134 134 137 133 132 135 137 135 134 136 132 135 132 136 1310 134 132 139 134 136 136 132 137 134 138 135 135 134 134 137 134 136 136 135 134 133 135 133 133 136 132 133 134 138 138 137 137 136 135 1310 134 134 134 138 136 134 136 137 135 135 136 138 134 138 134 135 137 136 134 137 137 135 137 132 136 135 133 135 136 130 133 135 135 137 134 137 131 135 136 135 138 132 134 136 139 137 1310 134 135 136 132 135 135 135 1313 133 136 133 136 135 130 1310 134 136 136 134 131 133 135 137 136 133 135 133 134 132 132 138 138 134 136 135 135 134 133 139 134 139 136 1311 133 132 132 136 138 1310 133 137 133 134 135 139 133 135 133 134 138 139 132 138 133 133 137 138 136 133 135 134 132 1311 137 137 136 134 133 135 1310 135 134 135 133 135 136 135 139 135 134 135 135 134 133 137 134 1310 135 134 132 139 134 137 133 135 134 131 136 135 136 134 138 135 135 138 138 134 132 135 133 134 138 138 135 138 132 1311 135 134 134 136 139 1310 137 134 137 132 133 135 1310 135 135 133 135 136 134 134 136 135 137 136 136 134 133 134 135 132 134 136 139 133 135 133 136 133 133 135 134 134 134 137 135 139 1310 133 134 136 131 137 138 135 133 133 135 133 133 137 136 135 135 138 134 139 136 135 135 138 134 130 133 137 133 134 1311 132 137 133 136 135 133 134 133 133 132 138 133 134 134 134 134 138 138 137 136 132 132 137 135 133 135 138 135 134 135 134 135 134 1312 133 135 133 133 133 132 134 131 139 135 135 135 138 138 135 138 133 134 133 136 136 135 134 133 133 135 133 137 135 132 133 133 132 131 132 136 137 130 136 133 134 1310 132 136 137 134 133 132 138 133 135 133 135 136 132 134 134 133 135 135 135 134 134 136 133 132 138 1310 135 135 132 132 137 136 134 135 134 134 136 134 136 135 133 137 137 136 137 134 134 137 133 130 134 136 135 137 136 136 135 137 134 134 135 136 136 135 136 132 134 133 139 135 133 137 135 136 137 136 136 136 134 135 137 137 133 134 137 137 136 133 134 137 131 135 136 133 137 133 135 133 137 138 133 137 132 135 134 133 132 135 134 134 135 133 134 139 135 134 139 137 133 132 133 134 133 134 135 135 138 134 135 134 135 139 137 133 133 132 136 132 138 135 132 137 134 135 136 132 134 135 135 133 135 136 137 135 138 132 131 137 135 135 138 134 137 136 139 1310 137 134 131 136 132 136 137 133 135 137 135 132 135 135 133 133 137 134 133 133 131 138 139 132 134 138 135 136 138 137 1310 138 133 134 134 135 134 134 135 136 135 134 134 135 133 136 135 137 132 133 139 132 133 137 136 134 137 131 135 134 132 134 138 135 134 131 132 134 135 136 133 134 138 134 132 135 134 132 134 133 136 135 138 133 139 1310 134 133 133 137 137 136 137 133 133 133 135 139 136 136 137 136 135 132 132 139 136 132 139 132 137 135 133 138 137 135 134 136 131 133 135 133 134 137 135 134 132 136 136 136 137 133 132 135 134 135 134 137 134 133 133 134 132 134 135 134 134 136 134 135 138 133 135 135 138 133 135 134 135 135 138 1311 132 134 134 136 133 135 133 136 132 131 136 134 136 132 136 136 136 136 130 136 134 134 131 138 131 1310 135 139 136 132 136 138 135 138 134 132 134 133 136 137 133 133 133 133 137 136 135 133 139 133 132 135 136 136 134 132 132 135 137 136 136 136 138 137 137 135 135 131 136 133 136 135 133 134 130 133 135 136 137 138 136 134 135 132 137 132 137 132 133 134 135 138 134 136 133 135 135 139 134 134 136 134 134 134 135 134 133 135 135 138 133 136 136 134 135 134 134 138 136 133 137 132 134 137 136 135 133 134 133 135 134 134 136 134 133 137 133 135 135 136 135 138 134 136 132 137 136 138 134 136 136 137 136 136 135 136 1310 138 133 137 135 136 137 134 136 133 134 133 132 132 134 137 132 132 133 132 138 134 134 135 135 139 135 134 132 134 135 134 139 137 133 134 134 135 133 133 137 138 135 139 133 138 136 136 134 133 136 135 1314 137 133 137 135 136 134 134 136 133 135 134 135 136 136 135 133 135 131 135 137 135 136 133 137 135 134 133 134 134 134 134 134 136 132 134 136 136 137 139 134 138 133 133 132 135 131 134 133 137 133 133 134 139 138 134 134 137 137 135 136 134 139 137 138 134 133 134 134 135 137 134 135 138 133 132 134 1310 133 135 134 132 138 137 136 135 138 1314 139 135 135 131 134 135 134 135 135 135 133 136 135 135 132 136 139 133 133 136 134 132 132 137 136 131 137 135 135 134 1313 1310 132 134 134 133 138 135 134 133 136 136 136 1310 134 137 136 138 139 137 135 134 134 137 137 138 133 134 135 137 135 136 1310 136 136 138 133 136 133 134 135 135 134 136 133 136 136 137 134 135 1316 136 136 132 136 136 133 134 133 137 134 135 134 133 138 134 1310 136 136 136 137 134 136 137 132 138 136 131 132 134 135 130 134 135 135 137 130 136 135 131 136 137 133 137 135 139 138 135 139 133 137 139 133 136 137 136 138 134 1310 136 134 133 139 136 137 133 13713

Rango maacuteximo y miacutenimo

Para empezar vamos a aprender tres nuevas funciones de R que nos permiten calcular esos tresvalores

gt (minimo = min(var3) )[1] 0gt (maximo = max(var3) )[1] 16gt (rango = range(var3) )[1] 0 16

El funcionamiento de las dos primeras es evidente La funcioacuten range devuelve un vector formadopor el maacuteximo y el miacutenimo

Tablas de frecuencia Clases de objetos en R

La tabla de frecuencia absoluta de var3 se obtiene usando la funcioacuten table de esta forma tansencilla

gt ( tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

La primera fila contiene los elementos de var3 y en la segunda aparece la frecuencia de cada unode ellos Puedes comprobar que son los mismos resultados que obtuvimos con Calc en la paacutegina10 del Tutorial01 Aunque alliacute desde luego el proceso fue maacutes laborioso

A lo mejor te has dado cuenta de que el formato de la respuesta es diferente de los que hemosobtenido hasta ahora Para empezar la respuesta no empieza con el [1] al que ya nos vamosacostumbrando El motivo de esto es que el objeto que hemos obtenido como respuesta no es unvector sino una tabla Ya dijimos que R utiliza distintos tipos de objetos con fines distintosiquestCoacutemo podemos saber de queacute clase es un objeto Pues usando una funcioacuten de R oportunamentellamada class Si la usamos con el vector var3 y con su tabla de frecuencias obtenemos

gt class(var3)[1] numericgt class(tablaFrecAbs)[1] table

El vector var3 es de clase numeric porque es un vector de nuacutemeros Y la tabla de frecuencias esde clase table Veremos a lo largo del curso otros objetos de tipo tabular como las matrices (clasematrix) los conjuntos de datos (clase dataframe) y los arraysAunque las tablas son objetos distintos de los vectores tienen algunas propiedades en comuacuten yalgunas de las funciones que hemos usado con vectores tambieacuten se pueden usar con tablas

Ejercicio 11Aplica las funciones length sum min max y range a la tabla tablaFrecAbs Solucioacuten en la paacutegina48

Siguiendo con los parecidos entre tablas y vectores puedes multiplicar (o dividir) una tabla porun nuacutemero y la operacioacuten se haraacute elemento a elemento

gt 2 tablaFrecAbsvar30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1618 50 200 376 488 492 372 262 174 86 56 12 4 4 4 2

Como ves cada frecuencia se multiplica por 2 Esta propiedad de las tablas permite obtener deforma muy sencilla la tabla de frecuencias relativa de var3 Como primer paso vamos a guardarla longitud de var3 en la variable n

22

gt ( n = length( var3 ) )[1] 1300

Y ahora podemos dividir la tabla por n para conseguir la tabla de frecuencias relativas (hemosestrechado la Consola de Comandos para que el resultado cupiera en esta paacutegina)

gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 400069230769 00192307692 00769230769 01446153846 01876923077

5 6 7 8 901892307692 01430769231 01007692308 00669230769 00330769231

10 11 12 13 1400215384615 00046153846 00015384615 00015384615 00015384615

1600007692308

Ejercicio 12Ya sabemos cuanto debe sumar esta tabla de frecuencias relativas Comprueacutebalo Solucioacuten en lapaacutegina 48

Si lo que queremos es una tabla de frecuencias acumuladas debemos emplear la funcioacuten cumsum

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Ejercicio 13La uacuteltima tabla que falta es la de frecuencias relativas acumuladas pero ya tienes todos los ingre-dientes para obtenerla de dos maneras diferentes Hazlo y comprueba si dan el mismo resultadoSi no es asiacute iquesta queacute crees que se debe y cuaacutel es la mejor opcioacuten Asigna el resultado a la variabletablaFrecRelAcu Solucioacuten en la paacutegina 49

Graacuteficos de columnas y diagramas de caja (boxplot) Argumentos con nombre

Vamos a fabricar nuestros primeros graacuteficos con R En concreto vamos a dibujar un graacutefico debarras a partir de la tabla de frecuencias de var3 usando la funcioacuten barplot de R

gt barplot(tablaFrecAbs)

Al ejecutar este comando no debes ver ninguna salida en la Consola de Comandos En su lugaren el panel inferior derecho de RStudio concretamente en la ventana Plots apareceraacute el graacuteficodeseado El resultado puede variar dependiendo de la anchura de tu ventana de RStudio

23

Hemos destacado ademaacutes en la figura los dos botones Zoom y Export que te permiten respecti-vamente ver una versioacuten ampliada de la Figura (que se redimensiona dinaacutemicamente si cambiasla ventana) y guardar esa figura como un fichero de graacuteficos que puedes insertar en cualquierdocumento editar con un programa de manipulacioacuten de graacuteficos etceacuteteraLos graacuteficos de R se pueden controlar hasta en sus detalles maacutes miacutenimos Como aperitivo miacutenimovamos a antildeadir algo de color al graacutefico

gt barplot(tablaFrecAbs col = heatcolors(15))

El resultado es esta figura

Las posibilidades de control de los graacuteficos de R son como decimos inmensas y pueden llegar aser abrumadoras Hay libros de cientos de paacuteginas dedicados a este tema como el R GraphicsCookbook de W Chang (ver las referencias del curso) Nosotros a lo largo de los tutoriales delcurso vamos a aprender algo maacutes aunque a penas nos podremos limitar a rozar la superficie delo que se puede llegar a hacerEn la Seccioacuten 231 del libro hemos descrito los diagramas de cajas o boxplots (recuerda la Figura22 de la paacuteg 36 del libro) Y en el Tutorial-01 dijimos que con Calc no es faacutecil dibujar ese tipode diagramas En cambio con R no podriacutea ser maacutes faacutecil

gt boxplot(var3)

Y el resultado es esta figura

24

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

Rango maacuteximo y miacutenimo

Para empezar vamos a aprender tres nuevas funciones de R que nos permiten calcular esos tresvalores

gt (minimo = min(var3) )[1] 0gt (maximo = max(var3) )[1] 16gt (rango = range(var3) )[1] 0 16

El funcionamiento de las dos primeras es evidente La funcioacuten range devuelve un vector formadopor el maacuteximo y el miacutenimo

Tablas de frecuencia Clases de objetos en R

La tabla de frecuencia absoluta de var3 se obtiene usando la funcioacuten table de esta forma tansencilla

gt ( tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

La primera fila contiene los elementos de var3 y en la segunda aparece la frecuencia de cada unode ellos Puedes comprobar que son los mismos resultados que obtuvimos con Calc en la paacutegina10 del Tutorial01 Aunque alliacute desde luego el proceso fue maacutes laborioso

A lo mejor te has dado cuenta de que el formato de la respuesta es diferente de los que hemosobtenido hasta ahora Para empezar la respuesta no empieza con el [1] al que ya nos vamosacostumbrando El motivo de esto es que el objeto que hemos obtenido como respuesta no es unvector sino una tabla Ya dijimos que R utiliza distintos tipos de objetos con fines distintosiquestCoacutemo podemos saber de queacute clase es un objeto Pues usando una funcioacuten de R oportunamentellamada class Si la usamos con el vector var3 y con su tabla de frecuencias obtenemos

gt class(var3)[1] numericgt class(tablaFrecAbs)[1] table

El vector var3 es de clase numeric porque es un vector de nuacutemeros Y la tabla de frecuencias esde clase table Veremos a lo largo del curso otros objetos de tipo tabular como las matrices (clasematrix) los conjuntos de datos (clase dataframe) y los arraysAunque las tablas son objetos distintos de los vectores tienen algunas propiedades en comuacuten yalgunas de las funciones que hemos usado con vectores tambieacuten se pueden usar con tablas

Ejercicio 11Aplica las funciones length sum min max y range a la tabla tablaFrecAbs Solucioacuten en la paacutegina48

Siguiendo con los parecidos entre tablas y vectores puedes multiplicar (o dividir) una tabla porun nuacutemero y la operacioacuten se haraacute elemento a elemento

gt 2 tablaFrecAbsvar30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1618 50 200 376 488 492 372 262 174 86 56 12 4 4 4 2

Como ves cada frecuencia se multiplica por 2 Esta propiedad de las tablas permite obtener deforma muy sencilla la tabla de frecuencias relativa de var3 Como primer paso vamos a guardarla longitud de var3 en la variable n

22

gt ( n = length( var3 ) )[1] 1300

Y ahora podemos dividir la tabla por n para conseguir la tabla de frecuencias relativas (hemosestrechado la Consola de Comandos para que el resultado cupiera en esta paacutegina)

gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 400069230769 00192307692 00769230769 01446153846 01876923077

5 6 7 8 901892307692 01430769231 01007692308 00669230769 00330769231

10 11 12 13 1400215384615 00046153846 00015384615 00015384615 00015384615

1600007692308

Ejercicio 12Ya sabemos cuanto debe sumar esta tabla de frecuencias relativas Comprueacutebalo Solucioacuten en lapaacutegina 48

Si lo que queremos es una tabla de frecuencias acumuladas debemos emplear la funcioacuten cumsum

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Ejercicio 13La uacuteltima tabla que falta es la de frecuencias relativas acumuladas pero ya tienes todos los ingre-dientes para obtenerla de dos maneras diferentes Hazlo y comprueba si dan el mismo resultadoSi no es asiacute iquesta queacute crees que se debe y cuaacutel es la mejor opcioacuten Asigna el resultado a la variabletablaFrecRelAcu Solucioacuten en la paacutegina 49

Graacuteficos de columnas y diagramas de caja (boxplot) Argumentos con nombre

Vamos a fabricar nuestros primeros graacuteficos con R En concreto vamos a dibujar un graacutefico debarras a partir de la tabla de frecuencias de var3 usando la funcioacuten barplot de R

gt barplot(tablaFrecAbs)

Al ejecutar este comando no debes ver ninguna salida en la Consola de Comandos En su lugaren el panel inferior derecho de RStudio concretamente en la ventana Plots apareceraacute el graacuteficodeseado El resultado puede variar dependiendo de la anchura de tu ventana de RStudio

23

Hemos destacado ademaacutes en la figura los dos botones Zoom y Export que te permiten respecti-vamente ver una versioacuten ampliada de la Figura (que se redimensiona dinaacutemicamente si cambiasla ventana) y guardar esa figura como un fichero de graacuteficos que puedes insertar en cualquierdocumento editar con un programa de manipulacioacuten de graacuteficos etceacuteteraLos graacuteficos de R se pueden controlar hasta en sus detalles maacutes miacutenimos Como aperitivo miacutenimovamos a antildeadir algo de color al graacutefico

gt barplot(tablaFrecAbs col = heatcolors(15))

El resultado es esta figura

Las posibilidades de control de los graacuteficos de R son como decimos inmensas y pueden llegar aser abrumadoras Hay libros de cientos de paacuteginas dedicados a este tema como el R GraphicsCookbook de W Chang (ver las referencias del curso) Nosotros a lo largo de los tutoriales delcurso vamos a aprender algo maacutes aunque a penas nos podremos limitar a rozar la superficie delo que se puede llegar a hacerEn la Seccioacuten 231 del libro hemos descrito los diagramas de cajas o boxplots (recuerda la Figura22 de la paacuteg 36 del libro) Y en el Tutorial-01 dijimos que con Calc no es faacutecil dibujar ese tipode diagramas En cambio con R no podriacutea ser maacutes faacutecil

gt boxplot(var3)

Y el resultado es esta figura

24

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

gt ( n = length( var3 ) )[1] 1300

Y ahora podemos dividir la tabla por n para conseguir la tabla de frecuencias relativas (hemosestrechado la Consola de Comandos para que el resultado cupiera en esta paacutegina)

gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 400069230769 00192307692 00769230769 01446153846 01876923077

5 6 7 8 901892307692 01430769231 01007692308 00669230769 00330769231

10 11 12 13 1400215384615 00046153846 00015384615 00015384615 00015384615

1600007692308

Ejercicio 12Ya sabemos cuanto debe sumar esta tabla de frecuencias relativas Comprueacutebalo Solucioacuten en lapaacutegina 48

Si lo que queremos es una tabla de frecuencias acumuladas debemos emplear la funcioacuten cumsum

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Ejercicio 13La uacuteltima tabla que falta es la de frecuencias relativas acumuladas pero ya tienes todos los ingre-dientes para obtenerla de dos maneras diferentes Hazlo y comprueba si dan el mismo resultadoSi no es asiacute iquesta queacute crees que se debe y cuaacutel es la mejor opcioacuten Asigna el resultado a la variabletablaFrecRelAcu Solucioacuten en la paacutegina 49

Graacuteficos de columnas y diagramas de caja (boxplot) Argumentos con nombre

Vamos a fabricar nuestros primeros graacuteficos con R En concreto vamos a dibujar un graacutefico debarras a partir de la tabla de frecuencias de var3 usando la funcioacuten barplot de R

gt barplot(tablaFrecAbs)

Al ejecutar este comando no debes ver ninguna salida en la Consola de Comandos En su lugaren el panel inferior derecho de RStudio concretamente en la ventana Plots apareceraacute el graacuteficodeseado El resultado puede variar dependiendo de la anchura de tu ventana de RStudio

23

Hemos destacado ademaacutes en la figura los dos botones Zoom y Export que te permiten respecti-vamente ver una versioacuten ampliada de la Figura (que se redimensiona dinaacutemicamente si cambiasla ventana) y guardar esa figura como un fichero de graacuteficos que puedes insertar en cualquierdocumento editar con un programa de manipulacioacuten de graacuteficos etceacuteteraLos graacuteficos de R se pueden controlar hasta en sus detalles maacutes miacutenimos Como aperitivo miacutenimovamos a antildeadir algo de color al graacutefico

gt barplot(tablaFrecAbs col = heatcolors(15))

El resultado es esta figura

Las posibilidades de control de los graacuteficos de R son como decimos inmensas y pueden llegar aser abrumadoras Hay libros de cientos de paacuteginas dedicados a este tema como el R GraphicsCookbook de W Chang (ver las referencias del curso) Nosotros a lo largo de los tutoriales delcurso vamos a aprender algo maacutes aunque a penas nos podremos limitar a rozar la superficie delo que se puede llegar a hacerEn la Seccioacuten 231 del libro hemos descrito los diagramas de cajas o boxplots (recuerda la Figura22 de la paacuteg 36 del libro) Y en el Tutorial-01 dijimos que con Calc no es faacutecil dibujar ese tipode diagramas En cambio con R no podriacutea ser maacutes faacutecil

gt boxplot(var3)

Y el resultado es esta figura

24

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

Hemos destacado ademaacutes en la figura los dos botones Zoom y Export que te permiten respecti-vamente ver una versioacuten ampliada de la Figura (que se redimensiona dinaacutemicamente si cambiasla ventana) y guardar esa figura como un fichero de graacuteficos que puedes insertar en cualquierdocumento editar con un programa de manipulacioacuten de graacuteficos etceacuteteraLos graacuteficos de R se pueden controlar hasta en sus detalles maacutes miacutenimos Como aperitivo miacutenimovamos a antildeadir algo de color al graacutefico

gt barplot(tablaFrecAbs col = heatcolors(15))

El resultado es esta figura

Las posibilidades de control de los graacuteficos de R son como decimos inmensas y pueden llegar aser abrumadoras Hay libros de cientos de paacuteginas dedicados a este tema como el R GraphicsCookbook de W Chang (ver las referencias del curso) Nosotros a lo largo de los tutoriales delcurso vamos a aprender algo maacutes aunque a penas nos podremos limitar a rozar la superficie delo que se puede llegar a hacerEn la Seccioacuten 231 del libro hemos descrito los diagramas de cajas o boxplots (recuerda la Figura22 de la paacuteg 36 del libro) Y en el Tutorial-01 dijimos que con Calc no es faacutecil dibujar ese tipode diagramas En cambio con R no podriacutea ser maacutes faacutecil

gt boxplot(var3)

Y el resultado es esta figura

24

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

En realidad tenemos que confesar que el resultado es ligeramente distinto y que hemos manipuladoalgunos de los paraacutemetros graacuteficos de R para que las liacuteneas fueran maacutes gruesas y figura resultaramaacutes faacutecil de visualizar Ya aprenderemos esos trucos Por el momento nos limitamos a insistir enlo faacutecil que resulta obtener el diagrama en RSi deseas que la orientacioacuten del diagrama sea horizontal basta con ejecutar

boxplot(var3 horizontal=TRUE)

y tambieacuten puedes controlar si se incluyen o no los valores atiacutepicos (outliers) con el argumentooutline Para excluirlos ejecutariacuteamos

boxplot(var3 outline = FALSE)

Una advertencia en este como en otros casos aunque lo estamos presentando por separadosiempre puedes combinar a la vez varios argumentos opcionales Por ejemplo no hay problema enejecutar

boxplot(var3 horizontal = TRUE outline = FALSE)

El uacutenico problema que puedes tener es el orden en que colocas esos argumentos opcionales Porejemplo si ejecutas

boxplot(var3 TRUE FALSE)

entonces R tendraacute que decidir por su cuenta (aplicando las reglas que en su momento decidieronlos programadores) a cuaacutel de sus argumentos opcionales corresponde esos valores TRUE y FALSEiexclY esos argumentos opcionales son muchos asiacute que el resultado puede ser muy distinto de lo queesperaacutebamos

Ejercicio 14Ejecuta ese comando para ver el graacutefico resultante Solucioacuten en la paacutegina 49

Para evitar ese problema R utiliza los argumentos con nombre como en horizontal = TRUEAquiacute horizontal es el nombre del argumento y TRUE es el valor que le hemos asignado al llamara la funcioacuten boxplot Gracias a este mecanismo podemos conseguir que el orden de los argumentossea irrelevante

Ejercicio 15Ejecuta de nuevo el comando

boxplot(var3 horizontal = TRUE outline = FALSE)

Y ahora con los argumentos opcionales intercambiados de posicioacuten

boxplot(var3 outline = FALSE horizontal = TRUE)

Veraacutes que no hay ninguna diferencia Solucioacuten en la paacutegina 49

Para completar por el momento la discusioacuten sobre graacuteficos elementales queremos comentar quetambieacuten se pueden dibujar diagramas de sectores en R Pero vamos a ser consecuentes con nuestrarecomendacioacuten de no utilizar ese tipo de graacuteficos y no incluiremos instrucciones Siempre puedesbuscar en Internet si realmente quieres dibujarlos

Histogramas en R

En el Tutorial-01 dijimos que no es faacutecil usar Calc para dibujar histogramas y nos comprometimosa mostrar la forma de dibujar ese tipo de graacuteficos con R Todaviacutea no estamos en condiciones deaprovecharlos al maacuteximo porque no hemos visto las herramientas que R nos proporciona paraagrupar una variable en clases y para trabajar despueacutes con esas clases Veremos todo eso maacutesadelante pero para adelantar algo vamos a usar la variable var3 para comprobar lo faacutecil que esobtener su histograma usando el comando

hist(var3 col = heatcolors(15))

El argumento col = heatcolors(15) es opcional y soacutelo sirve para fijar la misma combinacioacutende colores que ya usamos en el diagrama de barras Como en otros casos hemos manipuladoligeramente el comando para que las liacuteneas sean maacutes gruesas y la visualizacioacuten sea maacutes faacutecil Tuacuteobtendraacutes un trazo maacutes tenue ya aprenderemos a hacer ese tipo de ajustes)

25

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

Como puedes ver en este caso tan sencillo la informacioacuten que transmiten el diagrama de barrasy el histograma es esencialmente la misma Fiacutejate en el detalle teacutecnico de que en el histogramano existe la separacioacuten entre las barras que siacute se daba en el otro diagrama Veremos maacutes adelanteejemplos en los que la diferencia ente ambos tipos de graacuteficos seraacute mucho maacutes marcada

Media aritmeacutetica

Al final de la Seccioacuten 41 hemos visto como calcular la media aritmeacutetica y la varianza del vectorvectorEdades ldquoa manordquo usando la aritmeacutetica vectorial Pero desde luego esas operaciones sontan baacutesicas que como sucediacutea en Calc es de esperar que R incluya funciones para calcularlas enun pasoAsiacute si queremos calcular la media aritmeacutetica de var3 basta con usar la funcioacuten mean

gt (media = mean(var3))[1] 5039231

Ejercicio 16

1 Aseguacuterate de tener disponible en R el vectorEdades y calcula su media usando la funcioacutenmean Compaacuterala con la que obtuvimos en la paacutegina 20

2 Y a la inversa calcula la media de var3 usando aritmeacutetica vectorial sin recurrir a meam

Solucioacuten en la paacutegina 50

Cuasivarianza y cuasidesviacioacuten tiacutepica Varianza y desviacioacuten tiacutepica

Con la varianza y la desviacioacuten tiacutepica no obstante tenemos una pequentildea dificultad Los creadoresde R disentildearon el programa para hacer Estadiacutestica no para ensentildearla Aunque las cosas hancambiado mucho desde entonces y ahora R se usa como herramienta de ensentildeanza en cientos decursos en todo el mundo no hay que olvidar que R es ante todo una herramienta profesional y eseespiacuteritu lo impregna todo En particular como veremos maacutes adelante en el curso en Estadiacutestica lavarianza y desviacioacuten tiacutepica poblacionales juegan un papel muy secundario comparado con el de la

26

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

cuasivarianza y cuasidesviacioacuten tiacutepica muestrales La razoacuten es que el trabajo se hace casi siemprecon muestras claro Las cantidades poblacionales son a menudo objetos teoacutericos esencialmenteinaccesiblesPor esas razones R no incluye funciones para calcular ni la varianza poblacional ni la desviacioacutentiacutepica poblacional Siacute se incluyen en cambio la funcioacuten var para calcular la cuasivarianza muestral

gt (varMuestral = var(var3))[1] 4715165

y la funcioacuten sd para calcular la cuasidesviacioacuten tiacutepica muestral (que es la raiacutez cuadrad de laanterior)

gt (desvTipMuestral = sd(var3))[1] 2171443

Ejercicio 17Comprueba que sd(var3) es la raiacutez cuadrada de var(var3) Solucioacuten en la paacutegina 50

iquestY si queremos calcular las cantidades poblacionales En tal caso basta con tener en cuenta lasdefiniciones y para la varianza poblacional hacemos

gt ( varPobl= ( (n-1) n ) varMuestral )[1] 4711538

y entonces para la desviacioacuten tiacutepica poblacional soacutelo hay que calcular la raiacutez cuadrada

gt ( desvTipPobl = sqrt( varPobl ) )[1] 2170608

Medidas de posicioacuten mediana cuartiles y percentiles Rango intercuartiacutelico

Para calcular la mediana tenemos la funcioacuten median

gt ( mediana = median(var3))[1] 5

El caacutelculo de los cuartiles (o percentiles) en R como en cualquier otro programa estadiacutestico requiereuna discusioacuten maacutes detallada Por un lado si lo uacutenico que se desea es obtener la informacioacuten pordefecto que proporciona R dejando que sea el programa el que decida la mejor forma de procederentonces las cosas son muy sencillas Basta con usar la funcioacuten summary asiacute

gt summary(var3)Min 1st Qu Median Mean 3rd Qu Max0000 4000 5000 5039 6000 16000

Como ves la respuesta incluye varias de las cantidades que ya habiacuteamos calculado previamentepero tambieacuten aparecen los cuartiles primero y tercero (indicados por 1st Qu y 3rd Qu respec-tivamente)Esta funcioacuten summary no soacutelo sirve para vectores sino que se puede aplicar a muchos otros objetosde R para obtener (lo que R considera) informacioacuten baacutesica sobre ellos

Ejercicio 18iquestQueacute tipo de objeto produce summary en su respuesta iquestEs una tabla un vector otra cosa Solucioacutenen la paacutegina 50

Ademaacutes de summary en R disponemos de la funcioacuten IQR para calcular el rango intercuartiacutelico deun vector

gt IQR(var3)[1] 2

Puedes comprobar que la respuesta es la diferencia entre los dos cuartiles que hemos obtenido consummary

Por otra parte en lugar de utilizar summary si soacutelo queremos uno de los cuantiles o si lo quequeremos son algunos percentiles podemos conseguir un control maacutes fino de la respuesta utilizandola funcioacuten quantile Si la aplicamos al vector sin maacutes se obtiene por defecto esta respuesta

27

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

gt quantile(var3)0 25 50 75 1000 4 5 6 16

Pero tambieacuten podemos usarla con un segundo argumento un vector en el que aparecen los por-centajes (expresados como tantos por uno) de los percentiles que queremos calcular Por ejemplopara pedirle a R que calcule (con el meacutetodo por defecto es decir el que maacutes le gusta a R) lospercentiles 5 15 y 75 de var3 ejecutamos este comando

gt quantile(var3 c(005015075))5 15 752 3 6

Aquiacute como queremos mantener la discusioacuten lo maacutes simple posible no vamos a entrar en maacutes detallesteacutecnicos sobre las decisiones que R toma para calcular estos nuacutemeros pero queremos prevenir allector de que las cosas se complican enseguida en R hay varias (concretamente nueve) formasdistintas de calcular los cuartiles

5 Ficheros de comandos R ComentariosAntes de seguir adelante tenemos que ocuparnos de un problema que casi con seguridad estaacuteempezando a preocuparte Si has hecho todo el trabajo de la seccioacuten anterior habraacute escrito muchoscomandos de R para estudiar el vector var3 Pero imagiacutenate que ahora queremos estudiar otrovector por ejemplo el vectorEdades de las primeras secciones de este tutorial iquestTenemos queempezar de nuevo tecleando todos esos comandos para este nuevo vector Ya sabes que esasinstrucciones estaacuten guardadas en el Historial de Comandos (iexclincluso las erroacuteneas) Una opcioacutenseriacutea irlas copiando una por una desde ese historial a la Consola de Comandos modificarlas yejecutarlas Pero no parece una gran idea en teacuterminos de productividadLa solucioacuten es bastante sencilla y RStudio nos ofrece todo lo que necesitamos Lo que vamos ahacer es guardar en un fichero de texto plano una lista de instrucciones de R Esos ficheros deinstrucciones tendraacuten la extensioacuten

R

Ya sabes que como vimos en el Tutorial-01 la extensioacuten sirve para identificar el tipo de ficheroy para decidir cuaacutel es el programa predeterminado con el que el sistema abre esos ficheros (porejemplo al hacer doble clic sobre uno de ellos) Antes de avanzar maacutes veamos un ejemplo Pe-ro primero una advertencia para evitar problemas iexclLee el siguiente fragmento entrelas liacuteneas horizontales antes de tratar de abrir el fichero de instrucciones

Cierra RStudio antes de empezar para hacer un poco de limpieza Hemos creado uno de esosficheros de instrucciones muy sencillo que puedes abrir con un editor de texto (como el Bloc deNotas de Windows)

El contenido al abrirlo con el editor es este

28

vector1 = c( -9 -14 5 -8 2 -17 17 4 -16 -14 )1313vector2 = c( 5 -18 4 4 6 -4 7 -18 20 -12 )1313vector3 = vector1 + vector21313( media = mean(vector3) )1313( rango = range(vector3) )1313

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

Si el ordenador en el que estaacutes trabajando tiene instalado RStudio como se vio en el Tutorial-00es muy posible que el programa predeterminado para abrir los ficheros como este sea el propioRStudio En cualquier caso para asegurarnos guarda este fichero en tu ordenador iexclRecuerda usarel botoacuten derecho para guardar Ademaacutes es importante que lo guardes en el Directorio de TrabajoAtencioacuten no se trata de guardarlo en la subcarpeta datos sino en el propio directorio de trabajoque contiene esa subcarpeta Una vez guardado usa lo que aprendimos en el Tutorial-00 paraasegurarte de que en efecto RStudio es el programa predeterminado de tu sistema para este tipode ficheros

Y ahora despueacutes de todas las maniobras anteriores vamos a abrir el fichero con RStudio Puedeshacer doble clic en el fichero o si prefieres un poco maacutes de control sobre el proceso puedes empezarabriendo RStudio En ese caso usa los menuacutes File rarr Open File y en la ventana que apareceselecciona el fichero Tut02-codigo01R y pulsa en Abrir

Al abrir el fichero se abriraacute una componente nueva de RStudio que hasta ahora no habiacuteamosutilizado Se trata de un nuevo panel de RStudio al que vamos a llamar el Editor de Coacutedigo (eningleacutes Source Editor) que se situacutea en la parte superior izquierda de la interfaz justo encima de laConsola de Comandos En ese panel aparece el contenido del fichero Tut02-codigo01Rcomo seve en la figura

Este Editor de Coacutedigo es ante todo y como indica su nombre un editor de texto Es por asiacutedecirlo como si RStudio llevaraacute incorporado su propio Bloc de Notas Pero es ademaacutes y comoiremos viendo a lo largo del curso un editor de texto especialmente disentildeado para el trabajo con RHabraacutes notado ya que por ejemplo se utilizan distintos colores para algunos elementos del ficherosAdemaacutes las liacuteneas aparecen numeradas a la izquierda Todos esos ingredientes y muchos otros queconoceremos maacutes adelante estaacuten ahiacute para hacer nuestro trabajo con R mucho maacutes productivoPara empezar vamos a descubrir la relacioacuten que existe entre el Editor de Coacutedigo y la Consola deComandos que hemos venido usando hasta ahora Haz clic con el botoacuten izquierdo del ratoacuten en laprimera liacutenea del fichero (la que empieza con vector1 = ) no importa en queacute punto de la liacuteneahagas clic Aseguacuterate de que el cursor estaacute situado en esa liacutenea y pulsa simultaacuteneamente las teclasCtrl y Entrar

29

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

Como indica la figura la liacutenea de comandos en la que estaacute situado el ratoacuten se transfiere a la Consolade Comandos y se ejecuta Se puede conseguir el mismo resultado si una vez situado el cursor enla liacutenea deseada usas el botoacuten Run situado sobre el Editor de Coacutedigo

Ejercicio 19Prueba a hacer lo mismo con el resto de las liacuteneas de coacutedigo del fichero ejecutaacutendolas una poruna

Si has hecho este ejercicio habraacutes visto que no hay diferencia entre ejecutar un comando desde laConsola o desde el Editor maacutes allaacute de las teclas que hay que utilizar en cada caso A cambio laejecucioacuten desde el Editor ofrece muchas ventajas Para empezar puedes ejecutar todo un grupo decomandos a la vez Para ver esto vamos a empezar haciendo limpieza Pulsa Ctrl + L (las dosteclas a la vez) para limpiar la Consola de Comandos Ahora con el ratoacuten o el teclado seleccionatodas las liacuteneas del Editor de Coacutedigo Por cierto para moverte del Editor de Coacutedigo a la Consolade Comandos y viceversa puedes usar los atajos de teclado Ctrl + 1 y Ctrl + 2

Aseguacuterate de que la situacioacuten resultado es como la de esta figura (tambieacuten puedes usar el atajo deteclado Ctrl + A para seleccionar todo el coacutedigo)

30

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

Y ahora pulsa Ctrl + Entrar (o usa el botoacuten Run) Veraacutes que todas esas liacuteneas se ejecutan pororden Por otra parte no hace falta que seleccionemos todo el coacutedigo Este mecanismo te permiteejecutar parcialmente el coacutedigo simplemente seleccionando un bloque de liacuteneas consecutivas quese ejecutaraacuten desde la primera a la uacuteltima

Ejercicio 20Prueba a ejecutar a la vez las liacuteneas 5 y 7 del fichero de coacutedigo (y soacutelo esas liacuteneas)

El Editor de Coacutedigo tambieacuten te permite modificar el fichero de instrucciones sobre el que estamostrabajando Vamos a practicar esto

Ejercicio 21

1 Cambia las liacuteneas 1 y 3 por estas dos

(vector1 = 150 )

(vector2 = sample(150) )

No te preocupes por el momento pronto veremos en detalle como se utiliza la funcioacuten sampleAquiacute se limita a ordenar al azar los nuacutemeros del 1 al 50

2 Antildeade en la liacutenea 11 del Editor de Coacutedigo el comando

(varMuestral = var(vector3) )

y ejecuacutetalo desde el Editor de Coacutedigo

3 Usa los menuacutes FilerarrSave o el atajo de teclado Ctrl + S para guardar el fichero modifi-cado Cierra RStudio y abre el fichero con un Editor de Texto Antildeade una liacutenea al final delfichero (liacutenea 13 por ejemplo) con el comando

boxplot(vector3)

Guarda el fichero Tut02-codigo01R modificado cierra el editor de texto y vuelve a abrir elfichero en RStudio Comprueba que aparecen todas las modificaciones que hemos ido haciendoy ejecuta todos los comandos al menos un par de veces

31

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

Las modificaciones que hemos hecho en este ejercicio no son importantes en siacute mismas El objetivodel ejercicio es demostrar que los ficheros de coacutedigo de R son simplemente ficheros de texto quese pueden manipular dentro del propio RStudio pero tambieacuten fuera de eacutel con un editor de textocualquiera (aunque como hemos dicho RStudio ofrece muchas herramientas para hacer nuestrotrabajo maacutes coacutemodo)

Eso mismo sucede en general con los ficheros de coacutedigo (a veces decimos coacutedigo fuente) de cualquierlenguaje de programacioacuten (en ingleacutes esos ficheros se denominan source code files) Y gracias a esoresulta posible guardar nuestro trabajo muy faacutecilmente de una vez para otra o intercambiar esosficheros con otras personas Si hemos hecho un anaacutelisis estadiacutestico especialmente interesante ycreemos que puede resultar uacutetil para otras personas que estudian problemas parecidos basta conhacerles llegar nuestro fichero de coacutedigo para que puedan repetir ese anaacutelisis con sus datosPor ejemplo el fichero adjunto

contiene (casi todos) los comandos que hemos visto en la Seccioacuten 4 para hacer Estadiacutestica Descrip-tiva del vector var3 En la Tabla 2 puedes ver el contenido del fichero que en el caso de ficherosde coacutedigo llamaremos a menudo el listado del fichero

setwd()

var3 = readtable(file=datosTut02 -var3csv header=TRUE)[1]

( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )

( tablaFrecAbs = table(var3) )

( n = length( var3 ) )

( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

barplot(tablaFrecAbs col = heatcolors (15))

boxplot(var3)

( media = mean(var3))

( varMuestral = var(var3))

( desvTipMuestral = sd(var3))

( varPobl= ( (n-1) n ) varMuestral )

( desvTipPobl = sqrt( varPobl ) )

( mediana = median(var3))

summary(var3)

( rangoIntCuart= IQR(var3))

( percentiles = quantile(var3 c(005 015 058 075)) )

Tabla 2 Comandos de estadiacutestica descriptiva en el fichero Tut02-codigo02R

Fiacutejate en que en la primera fila del fichero en la liacutenea en la que aparece la funcioacuten setwd hemosdejado vaciacuteo el espacio donde deberiacutea estar el nombre del directorio de trabajo (recuerda la dis-cusioacuten de la paacutegina 14 en la que aprendimos a fijar ese directorio) La razoacuten es faacutecil de entendersi le enviamos este fichero a otra persona mi directorio de trabajo no le serviraacute y lo primero quetendraacute que hacer es cambiar ese directorio de trabajo para que se corresponda con el directorio desu ordenador que vaya a jugar ese papel Por otra parte si se desea calcular otros percentiles hayque modificar el vector de la uacuteltima liacutenea del coacutedigo

Evidentemente cuando le enviamos el fichero a esa persona vamos a tener que explicarle estosdetalles si es que queremos que el fichero le sirva de algo A lo mejor te parece exagerado Ten

32

setwd()var3 = readtable(file=datosTut02-var3csv header=TRUE)[1]( minimo = min(var3) )( maximo = max(var3) )( rango = range(var3) )( tablaFrecAbs = table(var3) )( n = length( var3 ) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )barplot(tablaFrecAbs col = heatcolors(15))boxplot(var3)( media = mean(var3))( varMuestral = var(var3))( desvTipMuestral = sd(var3))( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )( mediana = median(var3))summary(var3)( rangoIntCuart= IQR(var3))( percentiles = quantile(var3 c(005 015 058 075)) )

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

en cuenta que este fichero al ser de los primeros que vemos es muy sencillo Pero a medida quevayamos avanzando en el curso los ficheros seraacuten cada vez maacutes complejos y necesitaraacuten cada vezmaacutes ldquoinstrucciones de manejordquo Te podemos asegurar que llegaraacute un momento no muy lejano enel que si escribes un fichero de coacutedigo R y dejas pasar 15 diacuteas sin usarlo cuando lo vuelvas a abrirpasados esos diacuteas entonces tuacute mismo por maacutes que seas el autor del fichero no recordaraacutes para queacuteserviacutea aquella variable o porque hiciste las cosas asiacute y no de otra manera etc Una de las verdadesmaacutes contrastadas por la experiencia sobre la programacioacuten es esta

El coacutedigo sin documentacioacuten es inuacutetil

Ya dijimos al hablar de Calc en el Tutorial-01 que habiacutea que acostumbrarse a identificar lasoperaciones con una descripcioacuten adecuada En R eso se convierte en una necesidad mucho mayorAsiacute que en el proacuteximo apartado vamos a empezar a aprender a documentar el coacutedigo en R

51 Comentarios en RDocumentar significa en el contexto de los ficheros de coacutedigo R antildeadir a esos ficheros informacioacutenque no estaacute pensada para dar instrucciones al ordenador sino que ha sido pensada para ayudarnosa entender lo que se estaacute haciendo en esa sesioacuten de trabajo Es decir esa informacioacuten no es parala maacutequina es para nosotros mismos o para otros usuarios (humanos) de ese fichero A lo largodel curso en los tutoriales nosotros te vamos a facilitar una serie de ficheros (los llamaremosldquoplantillasrdquo) que contienen coacutedigo preparado para llevar a cabo algunos de los meacutetodos que vamosa aprender en cada capiacutetulo del curso Cuando abras por primera vez uno de esos ficheros yespecialmente al tratarse de meacutetodos con los que auacuten no estaacutes familiarizado necesitaraacutes sin dudaunas ldquoinstrucciones de manejordquo para saber como utilizar el fichero Esas instrucciones podriacutean iren un fichero aparte claro Pero la experiencia ha demostrado que esa no es una buena manera deorganizar el trabajo Si el coacutedigo y la documentacioacuten van por separado es casi inevitable que alfinal tras algunos cambios ya no se correspondan y la documentacioacuten pase a ser contraproducenteAfortunadamente hay una manera sencilla de combinar coacutedigo y documentacioacuten Fiacutejate en lasegunda versioacuten del fichero de comandos de Estadiacutestica Descriptiva

que aparece en la Tabla 3 (paacuteg 34) Como puedes ver hemos antildeadido al fichero unas liacuteneas nuevasque empiezan todas con el siacutembolo Esas liacuteneas son comentarios Cuando R encuentra el siacutembolo en cualquier liacutenea de un fichero de coacutedigo deja de leer el resto de esa liacutenea Simplemente lo ignoray pasa a leer la siguiente liacutenea Eso nos permite introducir nuestros comentarios sin que interfierancon el trabajo de R Si guardas el fichero en el directorio de trabajo y lo abres con RStudio veraacutesque esas liacuteneas aparecen en otro color para distinguirlas de las liacuteneas normales de coacutedigo

En el ejemplo de la Tabla 3 hemos antildeadido muchos comentarios maacutes de uno por cada liacutenea de coacute-digo No siempre seraacute necesario ni uacutetil comentar todas y cada una de las liacuteneas iexcleso puede resultara veces contraproducente La combinacioacuten de unos nombres de variable bien elegidos y la propor-cioacuten justa de comentarios es la clave Pero maacutes vale pecar de exceso de comentarios que lamentardespueacutes su falta cuando al cabo de un tiempo no seamos capaces de entender el coacutedigo ni siquieranuestro propio coacutedigo iquestCuaacutel es esa proporcioacuten justa de comentarios No hay una respuesta uacutenicaComo siempre la sabiduriacutea te llegaraacute (o no) con el tiempo y la experiencia cuando hayas vistoel trabajo de los demaacutes y desarrolles tu propio estilo En cualquier caso como poco deberiacuteas in-cluir unas liacuteneas al principio del fichero explicando para queacute sirve ese fichero quieacuten lo ha escrito etc

La segunda ventaja de utilizar comentarios tal vez no resultaraacute tan evidente al principio de tutrabajo con R La posibilidad de tratar liacuteneas del fichero como comentarios y conseguir de esaforma que R las ignore por completo nos permite ldquoactivarrdquo o ldquodesactivarrdquo de una forma muysencilla partes enteras de un fichero de coacutedigo R antes de ejecutarlo Por ejemplo si cambiamosuna liacutenea de coacutedigo

a=a+1

por esta otra

a=a+1

33

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

wwwpostdata -statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados

ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd()

Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1]

Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) )

Determinamos la longitud del vector de datos( n = length( vectorDatos ) )

Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) )

Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors (15))

Y el diagrama de cajaboxplot(vectorDatos)

Calculo de la media aritmeacutetica ( media = mean(vectorDatos))

la cuasivarianza muestral ( varMuestral = var(vectorDatos))

y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos))

La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) )

Calculamos la mediana( mediana = median(vectorDatos))

La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos)

El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos))

Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector

Tabla 3 Antildeadiendo comentarios fichero Primera ldquoplantillardquode comandos R del curso

34

wwwpostdata-statisticscom POSTDATA Introduccioacuten a la Estadiacutestica Tutorial 02 Plantilla de comandos R para Estadiacutestica Descriptiva Una variable cuantitativa datos no agrupados ATENCION para empezar a trabajar es necesario establecer el directorio de trabajo en la siguiente liacutenea de coacutedigo y el nombre del fichero (maacutes opciones) en la liacutenea 18 De lo contrario este fichero no funcionaraacutesetwd() Leemos el fichero de datos y lo guardamos en la variable vectorDatos El fichero debe estar en la subcarpeta datos del directorio de trabajo Debes introducir el nombre del fichero Se supone que los datos estaacuten en la primera columna del fichero Si no es asiacute debes modificar la siguiente orden indicando la columna que contiene los datosvectorDatos = readtable(file=datos header=TRUE)[1] Calculamos maacuteximo minimo y rango( minimo = min(vectorDatos) )( maximo = max(vectorDatos) )( rango = range(vectorDatos) ) Determinamos la longitud del vector de datos( n = length( vectorDatos ) ) Hallamos las tablas de frecuencias (1) absoluta (2) relativa (3) acumulada (4) acumulada relativa( tablaFrecAbs = table(vectorDatos) )( tablaFrecRel = tablaFrecAbs n )( tablaFrecAcu = cumsum(tablaFrecAbs) )( tablaFrecRelAcu = cumsum(tablaFrecRel) ) Dibujamos un graacutefico de barras de las frecuenciasbarplot(tablaFrecAbs col = heatcolors(15)) Y el diagrama de cajaboxplot(vectorDatos) Calculo de la media aritmeacutetica( media = mean(vectorDatos)) la cuasivarianza muestral( varMuestral = var(vectorDatos)) y la cuasidesviacioacuten tiacutepica( desvTipMuestral = sd(vectorDatos)) La varianza y desviacioacuten tiacutepica poblacionales se obtienen asiacute( varPobl= ( (n-1) n ) varMuestral )( desvTipPobl = sqrt( varPobl ) ) Calculamos la mediana( mediana = median(vectorDatos)) La funcioacuten summmary muestra la media y varias medidas de posicioacuten (cuartiles)summary(vectorDatos) El rango intercuartiacutelico( rangoIntCuart= IQR(vectorDatos)) Y algunos percentiles 5 15 58 y 75 Si deseas otros percentiles modifica los valores del vector( percentiles = quantile(vectorDatos c(005 015 058 075)) ) Fin del fichero

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

no estaremos ldquoexplicandordquo nada sino que estamos cambiando el comportamiento de R y evitandoque esa liacutenea en particular se ejecute Y hacer ese cambio soacutelo nos cuesta el trabajo de introducirun siacutembolo Esto permite tener un uacutenico fichero de instrucciones R que se puede comportar dedistinta manera jugando con los siacutembolos de comentario Veremos ejemplos de esto maacutes adelantey comprobaremos lo praacutectico que puede llegar a serCuando hacemos esto es decir cuando antildeadimos al comienzo de una liacutenea de coacutedigo R decimosque hemos comentado esa liacutenea (y la descomentamos cuando quitamos el ) Esta operacioacuten esbastante frecuente asiacute que RStudio te ofrece una herramienta llamada CommentUncomment linesen el menuacute Code Si seleccionas una o varias liacuteneas de coacutedigo y usas esta opcioacuten veraacutes que RStudioantildeade al comienzo de todas las liacuteneas comentadas

No podemos exagerar la importancia de que te acostumbres desde el primer momento a incor-porar la documentacioacuten como una parte inseparable de tu trabajo con R Te lo recordaremos amenudo especialmente en los primeros tutoriales Aparte de esto la idea de combinar coacutedigo ydocumentacioacuten se puede llevar en R mucho maacutes lejos de lo que aquiacute hemos visto Aunque novamos a poder ocuparnos de ellas en este curso mediante herramientas como R Markdown Sweaveo Knitr entre otras es posible obtener documentos en los que el coacutedigo R se combina con unadocumentacioacuten mucho maacutes rica que en algunos casos puede incluir figuras foacutermulas matemaacuteticascomplejas etc

6 Maacutes operaciones con vectores en RLos vectores son un ingrediente esencial de nuestro trabajo con R En esta seccioacuten vamos a (empezara) aprender coacutemo fabricar vectores a la medida de nuestros deseos y a manipular esos vectorescon precisioacuten

61 Nuacutemeros aleatorios la funcioacuten sample de REn el Tutorial-01 vimos como generar nuacutemeros (pseudo)aleatorios con Calc Y en el Capiacutetulo 3de la teoriacutea del curso se usan esos nuacutemeros para hacer varios experimentos relacionados con lasprobabilidades en situaciones bastante elementales Para prepararnos vamos a aprender a hacerlo mismo con R Como veremos en este y en futuros tutoriales se haraacute evidente que R es un

35

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

especialista en la materia y usaacutendolo vamos a poder ir mucho maacutes allaacute de lo que resulta viablehacer con CalcEl primer paso para empezar a generar nuacutemeros aleatorios con R es utilizar la funcioacuten sampleEn su uso maacutes elemental esta funcioacuten toma un vector de datos (el que nosotros queramos) ypermite elegir al azar k elementos del vector con o sin reemplazamiento Y no se agotan ahiacute suscapacidades asiacute que vamos a ir viendo diversos ejemplosEmpezamos por lo maacutes simple lanzar un dado Para eso ejecutamos este coacutedigo

(dado=sample(16 size=1) )

Algunas cosas ya nos resultan conocidas Vamos a guardar el resultado en una variable que hemosllamado dado y hemos rodeado el comando con pareacutentesis para que R ademaacutes de hacer lasoperaciones que pedimos nos muestre el resultado Prueba a ejecutar este comando varias vecesseguidas para ver como en cada lanzamiento obtienes un resultado distinto Naturalmente estono sirve si lo que quieres es lanzar el dado muchas veces pongamos mil veces Puedes pensar quebastariacutea con escribir

(dado = sample(16 size=1000) )

Prueba a ejecutar este comando y veraacutes que R te obsequia con un bonito mensaje de error

El mensaje nos explica cual ha sido el error hemos tratado de extraer 1000 elementos de unvector que soacutelo tiene seis y eso no es posible si replace=FALSE es decir si el muestreo es sinreemplazamiento El remedio estaacute claro hacemos (recuerda que puedes usar el tabulador paraayudarte)

(dado = sample(16 size=1000 replace = TRUE) )

y ahora siacute veraacutes desfilar 1000 lanzamientos del dado por tu pantalla Fiacutejate en que la variabledado que es el resultado de sample es un vector

Ejercicio 22

1 Obteacuten la tabla de frecuencias y calcula la media aritmeacutetica y la cuasidesviacioacuten tiacutepica (mues-tral) de los valores que hay en el vector dado

2 iquestCoacutemo puedes comprobar que la variable dado es un vector

Solucioacuten en la paacutegina 51

iquestY si en lugar de lanzar un dado mil veces queremos sacar cinco cartas (sin reemplazamiento) deuna baraja de 48 cartas Podemos representar las cartas de la baraja con los nuacutemeros del 1 al 48yentonces basta con hacer

(carta = sample(148 size=5 replace=FALSE) )

Hasta ahora hemos visto ejemplos en los que extraiacuteamos valores aleatorios de rangos (o intervalos)como 16 y 148 Naturalmente los rangos no tienen porque empezar en 1 podemos aplicarsample a un rango como 161234 Otras veces en cambio nos sucederaacute que tenemos un vectorcomo este vector edades

edades = c(22 21 18 19 17 21 18 20 17 18 17 22 20 19 18 19 1822 20 19)

y lo que queremos es extraer algunos de estos valores al azar pongamos por ejemplo que queremosextraer 7 elementos Para hacer eso si queremos muestreo sin reemplazamiento basta con usar

(edadesAlAzar = sample(edades size=7 replace=FALSE) )

y si lo queremos con reemplazamiento pondremos replace=TRUE Fiacutejate en que en este caso elvector original ya contiene elementos repetidos Asiacute que independientemente de que el muestreosea con reemplazamiento o sin eacutel al usar sample podemos obtener valores repetidos Lo que samplesortea son las posiciones dentro del vector edades y no los valores que ocupan esas posicionesPara entender esto un poco mejor prueba a ejecutar este coacutedigo en el que usamos sample sobreun vector que tiene el nuacutemero 1 repetido 9 veces y un uacutenico 2

36

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

muchosUnos = c(1111111112)(muestra = sample(muchosUnos size=100 replace=TRUE) )

Antes de pasar a otras cosas un truco adicional con la funcioacuten sample Si aplicas sample a unvector sin ninguacuten argumento maacutes obtendraacutes todos los elementos del vector pero en un ordenaleatorio (en lenguaje maacutes teacutecnico una permutacioacuten aleatoria de los elementos del vector) Enseguida vamos a ver la funcioacuten sort que es en alguacuten sentido lo contrario de sample La funcioacutensort ordena y sample desordena Prueba por ejemplo a ejecutar varias veces

sample(120)

para ver el resultado

Funciones unique y sort

A la vista de los uacuteltimos ejemplos y ahora que estamos aprendiendo a fabricar un vector conmuchos elementos repetidos es conveniente subrayar que a veces necesitaremos saber cuaacuteles sonlos elementos distintos que contiene ese vector El recorrido (rango) del vector nos dice el maacuteximoy el miacutenimo pero desde luego no nos dice cuaacuteles de los valores intermedios aparecen de hechoen el vector Una manera de obtener esto es mediante la tabla de frecuencias pero en ese caso elresultado es una tabla no un vector y a veces es maacutes difiacutecil de manipular Afortunadamente enR tenemos soluciones para todo y es muy sencillo obtener la respuesta con la funcioacuten unique Porejemplo para el vector edades que hemos usado antes es

gt (edadesDistintas=unique(edades))[1] 22 21 18 19 17 20

Como ves R devuelve un vector con los valores distintos que hay en edades pero en el orden enque los va encontrando y no hace ninguacuten esfuerzo por ordenarlos (puede que nos interese conservarel orden asiacute que eso esta bien)ldquoiexclPero es que yo los quiero ordenadosrdquo iquestHemos dicho ya que en R hay soluciones para todo Usamosla funcioacuten sort

gt (edadesDistintasEnOrden=sort(unique(edades)))[1] 17 18 19 20 21 22

ldquoEs que las quiero ordenadas en orden decrecienterdquo

gt (edadesDistintasEnOrden=sort(unique(edades) decreasing = TRUE ))[1] 22 21 20 19 18 17

Una aclaracioacuten importante sobre sort La ordenacioacuten no afecta en absoluto al vector original Siquieres ordenar un vector por ejemplo llamado datos y guardar el vector ordenado con el mismonombre entonces puedes usar el comando

datos = sort(datos)

pero es importante entender que este es un viaje sin retorno el vector datos original sin orde-nar se habraacute perdido y soacutelo tendremos la versioacuten ordenada iexclCuidado con la posible peacuterdida deinformacioacuten relevanteLa funcioacuten sort sirve desde luego para ordenar valores numeacutericos Pero tambieacuten hace ordenacioacutenalfabeacutetica Vamos a aprovechar para presentarte un par de vectores especiales los vectores lettersy LETTERS que vienen predefinidos en R

gt letters[1] a b c d e f g h i j k l m n o p q r[19] s t u v w x y zgt LETTERS[1] A B C D E F G H I J K L M N O P Q R[19] S T U V W X Y Z

Como ves esos vectores contienen las letras del alfabeto (para el idioma ingleacutes) Asiacute que podemosfabricar un vector de letras al azar (iquestun generador de contrasentildeas) con este coacutedigo

37

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

gt ( Clave = sample(LETTERS size=15 replace=TRUE) )[1] U Z T H I J E X J Y P G V P P

Como ves es un generador de contrasentildeas muy rudimentario No te preocupes en breve podremoshacer uno tan sofisticado como sea preciso iquestCuaacutentas letras distintas aparecen en esa clave Conlas funciones unique y sort podemos conseguir la respuesta ordenada alfabeacuteticamente

gt sort(unique(Clave))[1] E G H I J P T U V X Y Z

Ejercicio 23Modifica el generador de claves para que utilice mayuacutesculas minuacutesculas y cifras Indicacioacuten re-cuerda que c es por concatenate Solucioacuten en la paacutegina 51

Nuacutemeros pseudoaleatorios pero ldquoreproduciblesrdquo la funcioacuten setseed

Al principio de esta Seccioacuten 61 hemos lanzado 1000 veces un dado con el comando

(dado = sample(16 size=1000 replace = TRUE) )

El inconveniente de trabajar con nuacutemeros aleatorios es que los resultados del lector seraacuten diferentesde los nuestros y de hecho seraacuten diferentes cada vez que ejecutes la funcioacuten sample Los nuacutemerosaleatorios se utilizan mucho por ejemplo para hacer simulaciones Y si queremos hacer una de esassimulaciones y compartirla con otras personas de manera que puedan verificar nuestros resultadosentonces necesitamos

Que los nuacutemeros sean aleatorios en el sentido de que nosotros no los hemos elegido sino queson el resultado de un sorteo

Pero que los resultados del sorteo queden registrados de alguna manera para que otrospuedan reproducirlos

Afortunadamente (en este caso) como ya dijimos los nuacutemeros que produce un ordenador no sonaleatorios sino pseudoaleatorios Y para lo que aquiacute nos ocupa eso es una ventaja Hay unafuncioacuten de R llamada setseed que permite decirle a R que queremos hacer exactamente estogenerar nuacutemeros aleatorios reproducibles Concretamente para ver funciona como esto prueba enprimer lugar a ejecutar varias veces el comando

sample(1100 size=15 replace=TRUE)

Cada vez obtendraacutes una lista de nuacutemeros diferente Prueba ahora a ejecutar estos dos comandos

setseed(2014)sample(1100 size=15 replace=TRUE)

La respuesta seraacute

gt setseed(2014)gt sample(1100 size=15 replace=TRUE)[1] 29 17 63 31 55 9 92 61 10 16 63 6 61 59 66

Y seraacute la misma en tu ordenador en el miacuteo o en el de cualquier otra persona que ejecute R Comoves la funcioacuten setseed utiliza un argumento al que llamamos la semilla (en ingleacutes seed) que eneste caso yo he fijado arbitrariamente en 2014 La idea es que si utilizas setseed con la mismasemilla que yo obtendraacutes los mismos nuacutemeros pseudoaleatorios que yo he obtenidoUna vez visto lo fundamental no queremos entretenernos mucho maacutes en esto Pero no podemosdejar de mencionar que el asunto de coacutemo se elige la semilla es delicado Podriacutea parecer que lomejor en una simulacioacuten es elegir la propia semilla ldquoal azarrdquo El problema es que de esa maneraen caso de que alguien sospeche que se han manipulado los datos puede pensar que hemos idoprobando varias de estas semillas ldquoal azarrdquo hasta obtener unos resultados especialmente buenos dela simulacioacuten Muchos autores recomiendan como alternativa fijar una poliacutetica con respecto a laeleccioacuten de la semilla y atenerse a ella en todas las simulaciones Por ejemplo puedes usar siemprecomo semilla el antildeo en que realizas la simulacioacuten como hemos hecho aquiacute

38

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

62 Vectores a medida con seq y repYa sabemos que en R podemos crear un vector con los nuacutemeros del 1 al 100 basta con usar 1100Pero habiacuteamos dejado pendiente el problema de conseguir una forma maacutes flexible de fabricar losvectores iquestY si queremos por ejemplo empezar en 1 y avanzar de 3 en 3 sin pasar de 100 Esdecir queremos fabricar los nuacutemeros

1 4 7 94 97 100

Esto se puede conseguir en R de muy faacutecilmente usando la funcioacuten seq (de sequence secuencia osucesioacuten en el sentido matemaacutetico del teacutermino) Hacemos

( deTresEnTres = seq(from =1 to=100 by=3) )

y obtenemos como respuesta

gt ( deTresEnTres = seq(from =1 to=100 by=3) )[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40[15] 43 46 49 52 55 58 61 64 67 70 73 76 79 82[29] 85 88 91 94 97 100

(Ya sabes que el formato de salida y los nuacutemeros entre corchetes dependen de la anchura de tupantalla) La funcioacuten seq permite fabricar vectores cuyos elementos se diferencian en una cantidadfija que puede ser cualquier nuacutemero entero fraccionario expresado con decimales etc

Recuerda que los argumentos de las funciones de R se pueden escribir con nombre como hemoshecho aquiacute (son from to by) Pero si sabes lo que haces tambieacuten puedes usar

( deTresEnTres = seq(1 100 3) )

En cualquier caso al principio conviene que seas prudente con esto (y recuerda que el tabuladores tu amigo en RStudio)

La funcioacuten seq es ademaacutes muy uacutetil para dividir un intervalo (a b) en n subintervalos iguales (estote vendraacute bien por ejemplo cuando quieres dividir los valores de una variable cuantitativa continuaen clases) Podriacuteamos hacer las cuentas ldquoa manordquo calculando la longitud de los subintervalos etcPero seq facilita mucho el trabajo remplazando la opcioacuten by con la opcioacuten lengthout quedebes interpretar como cuaacutentos valores quieres que contenga el vector de salida Por ejemplo siquiero dividir el intervalo (15 27) en 19 subintervalos iguales teniendo en cuenta que se incluyenlos extremos estaacute claro que necesito 19 + 1 = 20 puntos en el vector de salida En este tipode situaciones es tiacutepico usar el nombre nodos para los extremos de los subintervalos que vamos afabricar (no los confundas con las marcas de clase que son los puntos medios de esos subintervalos)Asiacute que hacemos

(nodos = seq(from=15 to=27 lengthout=20 ) )

La respuesta es justo lo que queriacuteamos

gt (nodos = seq(from=15 to=27 lengthout=20 ) )[1] 1500000 1563158 1626316 1689474 1752632 1815789 1878947 1942105[9] 2005263 2068421 2131579 2194737 2257895 2321053 2384211 2447368[17] 2510526 2573684 2636842 2700000

Hay otra funcioacuten la funcioacuten rep (de repeat repetir) estrechamente emparentada con seq cuyoprincipal uso es fabricar vectores siguiendo un patroacuten que nosotros definimos El nombre rep vienede repeat repetir Y eso ayuda a adivinar lo que sucede si escribimos este comando

valores = c(12345)rep(valores times=3)

El argumento times (en ingleacutes aquiacute con significado de ldquovecesrdquo) La salida correspondiente es comocabriacutea esperar el vector datos repetido tres veces

39

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

gt valores=c(12345)gt rep(valores times=3)[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

Por cierto ese argumento opcional times es uno de los raros casos que no se obtiene con el tabu-lador en RStudio

Quizaacute sea un poco menos faacutecil adivinar lo que sucede con este otro comando

valores = c(1 2 3 4 5)rep(valores times=c(2 9 1 4 3) )

Si lo ejecutamos la salida es

gt valores = c(1 2 3 4 5)gt rep(valores c(2 9 1 4 3) )[1] 1 1 2 2 2 2 2 2 2 2 2 3 4 4 4 4 5 5 5

Y ahora estaacute maacutes claro lo que sucede el segundo argumento le dice a R cuaacutentas veces debe repetircada uno de los correspondientes elementos del vector datos (el primer argumento) Aquiacute el vectorque usamos en times juega el papel de vector de frecuencias para los elementos del vector valoresPor eso este funcionamiento de rep es especialmente interesante cuando tenemos que empezara trabajar a partir de datos representados mediante tablas de frecuencias Para ver un ejemplosencillo vamos a suponer que tenemos dos vectores

valores = c(235813)frecuencias = c(5712214)

de manera que el primero contiene los valores (distintos) que aparecen en nuestros datos y elsegundo contiene las frecuencias de esos valores (por supuesto los dos vectores tendraacuten la mismalongitud) Entonces para recuperar el conjunto inicial de datos (sin agrupar) partiendo de estaldquotabla de frecuenciasrdquo podemos usar asiacute la funcioacuten rep

( datosSinAgrupar = rep(valores times=frecuencias) )

Y se obtiene este resultado

gt ( datosSinAgrupar = rep(valores frecuencias) )[1] 2 2 2 2 2 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5[25] 8 8 13 13 13 13 13 13 13 13 13 13 13 13 13 13

Ahora puedes utilizar las funciones habituales para hacer la Estadiacutestica Descriptiva del vectordatosSinAgrupar Esta forma de ldquodesempaquetarrdquo tablas de frecuencia nos seraacute uacutetil en ocasionesEn este uacuteltimo ejemplo hemos usado una ldquo lsquotabla de frecuenciasrdquo que en realidad no es una tabla sinodos vectores por separado uno con los valores y otro con las frecuencias Para ver con maacutes claridadel fichero csv contiene esta misma tabla de frecuencias Perosi pruebas a guardarlo en la subcarpeta datos para leerlo con la funcioacuten scan que vimos en elTutorial03 no te va a resultar faacutecil porque scan no estaacute pensada para eso (puedes abrirlo con uneditor de texto para examinarlo) En proacuteximos tutoriales veremos como trabajar con este tipo detablas en R y entre otras cosas aprenderemos a leerlas a partir de un fichero csv

63 Seleccionando elementos de vectoresLa notacioacuten de corchetes Funciones head y tail

Volvemos entonces a nuestros 1000 lanzamientos del dado pero ahora vamos a hacer

setseed(2014)dado = sample(16 size=1000 replace = TRUE)

40

valoresfrecuencias1325133713512138213131413

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

De esa forma el lector y nosotros trabajaremos sobre el mismo vector dado y podraacutes comparar tusresultados con los nuestros En el Ejercicio 22 (paacuteg 36) hemos invitado al lector a que hiciera latabla de frecuencias del vector dado resultante de ese experimento El resultado de aquel ejercicio(para el vector dado que hemos fabricado despueacutes de usar setseed) es

gt table(dado)dado1 2 3 4 5 6

145 154 167 192 167 175

Eso nos permite por ejemplo ver que el nuacutemero 5 ha aparecido 167 veces Pero no nos permitesaber cuaacutel fue el resultado de la tirada nuacutemero 23 Para averiguar esto en R escribimos

gt dado[23][1] 4

y vemos que en esa tirada se obtuvo un 4 De esa forma usando los corchetes podemos accederdirectamente a cualquier posicioacuten del vector Por ejemplo el primer y el uacuteltimo elemento del vectorson

dado[1]dado[length(dado)]

En este caso sabemos que el vector tiene 1000 elementos y para obtener el uacuteltimo elemento po-driacuteamos haber escrito

dado[1000]

pero la otra versioacuten (usando length) tiene la ventaja de que seguiraacute funcionando aunque el vectorcambie Si quieres ver unos cuantos valores del principio (respectivamente del final) del vectorpuedes usar head(dado) (respectivamente tail(dado)) Estas dos funciones por defecto te mos-traraacuten los uacuteltimos seis elementos del vector pero puedes usar el argumento opcional n para controlarcuaacutentos se muestran

Ejercicio 24Usa la funcioacuten tail para obtener el uacuteltimo elemento del vector dado Solucioacuten en la paacutegina 51

Aunque las funciones head y tail son uacutetiles la herramienta baacutesica para acceder a los elementosde un vector son los corchetes [ ] (en ingleacutes (square) brackets) Este recurso de los corchetes esmucho maacutes potente de lo que parece a primera vista Podemos seleccionar varios elementos a lavez indicando sus posiciones Para seleccionar los elementos de dado en las posiciones de la 12 a la27 hacemos

gt dado[1227][1] 1 4 4 4 3 5 1 6 2 6 5 4 5 4 6 3

y obtenemos un vector con los nuacutemeros que ocupan exactamente esas posiciones Y si las posicionesque queremos no son consecutivas basta con indicarlas mediante un vector (no olvides la c al crearel vector) Por ejemplo

gt dado[c(38214356)][1] 4 4 6 6 1

nos proporciona los elementos en esas posiciones del vector Cuando se combina esto con otrasideas que estamos viendo en este tutorial se pueden conseguir resultados muy uacutetiles Por ejemploiquestqueacute crees que sucede al hacer esto (Haz el experimento)

datos=100200datosdatos[seq(1length(datos)3)]

Seleccioacuten de elementos mediante condiciones Valores booleanos Funcioacuten which

Pero auacuten podemos ir maacutes lejos Podemos utilizarlo para seleccionar los elementos del vector quecumplen cierta condicioacuten Por ejemplo queremos seleccionar los resultados en el vector dado queson mayores que 3 En primer lugar igual que aprendimos (en el anterior tutorial) a sumar unacantidad a un vector o a elevar un vector al cuadrado etc podemos tambieacuten aplicar una condicioacutenloacutegica como una desigualdad a un vector (iexclno ejecutes el comando todaviacutea)

41

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

dado gt 3

Tienes que aprender a leer esta expresioacuten como si fuera una pregunta ldquoiquestEs el resultado de lanzarel dado mayor que 3rdquo La respuesta soacutelo puede ser ldquosiacuterdquo o ldquonordquo o dicho de otra manera ldquociertordquo oldquofalsordquo 1 En R (y en muchos lenguajes de programacioacuten) las respuestas a ese tipo de preguntas serepresentan con un tipo especial de variables las variables booleanas (por el matemaacutetico G Boole2)Una variable de tipo booleano por tanto soacutelo puede tomar dos valores que son TRUE (cierto) oFALSE (falso) Las variables de tipo booleano son esenciales en programacioacuten Un programa tieneque tomar muchas decisiones del estilo ldquosi la condicioacuten C es cierta haz la accioacuten A y si no haz laaccioacuten Brdquo Esas decisiones dependen del resultado de la ldquocondicioacuten Crdquo que siempre es una variablebooleana Veremos ejemplos usando R en futuros tutorialesiquestCuaacutel es el resultado de dado lt 3 Pues un vector de 1000 valores booleanos Para ver los 10primeros vamos a hacer

gt head( dado lt 3 n=10)[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE

Y para que puedas comprobar de donde proceden esos valores aquiacute tienes los 10 primeros elementosde dado

gt head( dado n=10)[1] 2 2 4 2 4 1 6 4 1 1

Cada elemento del vector booleano que se obtiene con dado lt 3 nos dice si la condicioacuten ldquoes mayorque 3rdquo es cierta o falsa en la correspondiente posicioacuten de dadoLas cosas empiezan a ponerse divertidas cuando combinamos esta idea con la seleccioacuten por corche-tes por ejemplo asiacute

mayoresQue3 = dado[ dado gt 3 ]

Entonces en el vector mayoresQue3 obtenemos un vector que contiene precisamente aquellos ele-mentos de dado que eran mayores que 3 (por lo tanto que valen 4 5 o 6)

gt mayoresQue3[1] 4 4 6 4 4 4 4 4 5 6 6 5 4 5 4 6 6 5 6 5 4 5 5 5 4 6 6 4 5 4 5 6 5 6 4[36] 4 6 5 4 6 5 5 4 4 5 5 5 5 6 6 4 6 4 4 5 4 5 6 4 6 5 5 5 6 4 4 4 4 4 6[71] 6 4 6 4 4 6 6 6 5 4 4 6 4 5 5 4 6 4 4 4 6 4 5 6 4 6 6 5 5 5 5 5 4 5 6[106] 5 4 6 5 5 5 6 4 6 4 6 6 4 4 4 5 4 5 6 4 4 5 6 6 5 4 5 6 5 4 5 4 6 4 5[141] 5 6 6 4 4 6 4 4 4 6 5 5 6 4 6 4 4 6 5 6 4 4 6 6 5 6 5 5 6 6 4 4 6 4 5[176] 6 4 5 6 6 4 6 4 5 4 5 4 6 4 5 5 4 5 5 4 6 6 6 5 6 4 4 4 4 4 4 5 5 6 6[211] 6 4 6 6 6 4 5 6 4 5 5 4 6 6 4 5 5 4 4 4 4 4 6 6 4 5 5 6 5 6 4 6 6 6 4[246] 6 6 5 5 5 6 6 5 5 4 4 5 4 4 6 6 6 5 6 4 6 6 6 4 6 6 5 4 5 5 6 6 6 5 4[281] 5 4 4 6 5 5 6 4 4 5 5 6 4 4 5 6 6 6 6 4 6 5 4 4 6 6 5 6 6 4 4 6 6 6 4[316] 6 5 4 6 5 5 4 6 5 5 6 6 4 6 4 6 5 6 5 4 5 4 4 6 6 6 6 4 4 4 5 4 6 6 6[351] 6 5 4 6 6 6 6 5 6 6 5 6 4 6 4 5 4 5 6 5 6 5 6 5 4 5 5 5 5 6 4 4 5 6 5[386] 5 5 4 4 5 4 4 6 4 6 4 5 5 4 5 5 5 4 6 5 4 4 6 6 6 4 5 5 5 6 5 4 6 4 4[421] 5 6 5 6 6 5 5 5 4 6 6 4 4 4 6 4 5 5 6 4 4 4 5 4 5 6 4 5 5 5 4 5 5 5 6[456] 5 6 6 5 4 6 6 4 6 5 5 5 6 6 5 4 4 4 5 4 5 5 6 5 4 6 4 4 6 5 5 5 4 4 6[491] 4 4 5 5 4 4 4 6 4 4 4 6 4 4 5 4 4 4 6 4 5 6 5 6 5 4 4 5 5 5 5 5 4 4 4[526] 6 4 4 5 4 6 4 5 4

Pero claro en este vector hemos perdido la informacioacuten sobre las posiciones originales que ocupabanesos valores en dado Si quieres obtener esa informacioacuten usa la funcioacuten which junto con la condicioacutendado gt 3

which( dado gt 3 )

Y obtendraacutes un vector de posiciones (soacutelo se muestra el principio usando head)

gt head( which( dado gt 3 ) n=20)[1] 3 5 7 8 11 13 14 15 17 19 21 22 23 24 25 26 30 31 35 36

1en realidad hay un tercer caso del que ya hablaremos cuando el elemento del vector estaacute ausente como losvalor NaN que ya hemos visto

2Maacutes informacioacuten en httpeswikipediaorgwikiGeorge_Boole

42

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

Para que quede claro si miras el vector dado en una de estas posiciones encontraraacutes un valormayor que 3 Y viceversa si la posicioacuten no aparece en esta lista entonces el correspondiente valorde dado seraacute 3 o menos

Ejercicio 25

1 Comprueba que en la posicioacuten nuacutemero 16 de dado (que no aparece arriba) hay un elementomenor o igual que 3

2 Construye un vector que contenga las posiciones de dado que contienen nuacutemeros mayores oiguales que 2

3 Un poco maacutes difiacutecil Construye un vector que contenga las posiciones de dado que contienennuacutemeros pares Pista iquestqueacute haciacutea el operador (ver el Ejercicio 1 paacuteg 4)

Solucioacuten en la paacutegina 51

Como puedes ver nuestra capacidad de fabricar vectores a medida muestrearlos (samplearlos) yseleccionar sus elementos es muy grande iexclY ni siquiera hemos hablado auacuten de la funcioacuten pasteque es probablemente una de las herramientas maacutes versaacutetiles para generar vectores en R Estafuncioacuten es extremadamente uacutetil en Disentildeo Experimental y hablaremos de ella en alguno de losproacuteximos tutoriales

Los valores booleanos como unos y ceros Operadores booleanos

Ya hemos dicho que los valores booleanos TRUE y FALSE son la base sobre la que se construye todala toma de decisiones en R y en general en cualquier programa de ordenador Las decisiones setoman comprobando si se cumple una cierta condicioacuten que a veces puede ser tan sencilla comolas que hemos visto

dado gt 3

En cuanto esa condicioacuten sea un poco maacutes complicada necesitaremos maacutes herramientas Por ejem-plo si queremos seleccionar los elementos del vector dado que son a la vez maacutes grandes que 3y menores que 6 entonces necesitamos aprender una forma de expresar la conjuncioacuten ldquoYrdquo en ellenguaje de R En ese lenguaje esto se expresa asiacute

(dado gt 3) amp (dado lt 6)

El operador amp es en R el Y booleano (en ingleacutes se escribe a menudo AND en mayuacutesculas) En otroslenguajes de programacioacuten se escribe de diferentes maneras Para ver como funciona el operadoramp vamos a ejecutar varios comandos

gt TRUE amp TRUE[1] TRUEgt TRUE amp FALSE[1] FALSEgt FALSE amp TRUE[1] FALSEgt FALSE amp FALSE[1] FALSE

Estos cuatro comandos cubren todas las situaciones posibles al usar amp Por ejemplo al evaluar unacondicioacuten como

(3 lt 5) amp (6 lt 4)

el primer pareacutentesis da como resultado TRUE y el segundo FALSE asiacute que (estamos en el segundocaso y) el operador amp produce FALSE

gt (3 lt 5) amp (6 lt 4)[1] FALSE

Como ves para que el resultado de amp sea TRUE es necesario que ambos operandos sean TRUE Otrooperador booleano de R estrechamente emparentado con amp es el operador | (una barra vertical)llamado O booleano (en ingleacutes se escribe a menudo OR Todo lo que se necesita saber de esteoperador se resume en estas cuatro situaciones posibles

43

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

gt TRUE | TRUE[1] TRUEgt TRUE | FALSE[1] TRUEgt FALSE | TRUE[1] TRUEgt FALSE | FALSE[1] FALSE

con la que no deberiacuteas tener problemas en hacer el siguiente

Ejercicio 26iquestCuaacutel es el resultado de la siguiente operacioacuten

(7 lt 5) | (2 lt 4)

Solucioacuten en la paacutegina 51

Como ves el comportamiento de | es simeacutetrico al de amp Para que el resultado de | sea FALSE esnecesario que ambos operandos sean FALSER utiliza un sistema de equivalencia entre los valores booleanos TRUE y FALSE por un lado y losnuacutemeros 1 y 0 por otro que resulta a menudo extremadamente uacutetil Si le pedimos a R que multi-plique TRUE por FALSE lo que haraacute seraacute cambiar TRUE por 1 FALSE por 0 multiplicar obteniendoun 0

gt TRUE FALSE[1] 0

Puedes hacer lo mismo para hacer cualquier operacioacuten con los valores loacutegicos Por ejemplo

gt TRUEFALSE[1] Infgt TRUE + TRUE[1] 2gt TRUE + FALSE[1] 1

Los dos uacuteltimos resultados permiten usar los valores booleanos para contar los elementos de unvector que verifican una condicioacuten En efecto hemos visto que con la condicioacuten

dado gt 3

se obtiene como respuesta un vector booleano de valores TRUE y FALSE que nos dicen para cadaelemento del vector dado si esa condicioacuten es cierta o no Para saber cuaacutentos elementos la cumplenes decir cuaacutentos valores TRUE hay en el vector booleano dado gt 3 basta con tener en cuenta quelos valores TRUE cuentan como 1 y los FALSE como 0 y sumar ese vector booleano

gt sum(dado gt3)[1] 534

Si tienes problemas para entender esto piensa que el resultado de dado gt 3 es un vector de unosy ceros y que lo que queremos es saber cuaacutentos unos contieneHemos visto que R convierte TRUE en 1 y FALSE en 0 Es bueno saber que R tambieacuten hace conver-siones en sentido contrario Si usas los operadores loacutegicos amp y | para operar con nuacutemeros entoncesel nuacutemero 0 se convierte en FALSE mientras que cualquier otro nuacutemero se convierte en TRUE Porejemplo

gt 3 amp 5[1] TRUEgt 3 amp 0[1] FALSEgt 0 | 2[1] TRUEgt 0 | 0[1] FALSEgt -23 amp 0[1] FALSE

El uacuteltimo ejemplo pretende ilustrar que las mismas reglas funcionan con nuacutemeros fraccionarios onegativos Recuerda cualquier cosa que no sea un 0 se convierte en TRUE

44

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

El operador ldquoigual ardquo

Hemos visto coacutemo seleccionar los elementos del vector dado que son mayores que 3 Pero iquesty sinecesitamos seleccionar aquellos que son exactamente iguales a 3 Tu primera reaccioacuten tal vez seaescribir

dado[dado=3]

pero eso no funcionaraacute como esperas porque en R el siacutembolo = indica como ya sabemos unaasignacioacuten de una variable a un valor El significado de = es maacutes bien usa esta etiqueta paraeste valor Y lo que ahora necesitamos es una forma de decidir si dos valores son iguales Eloperador adecuado en R se representa con dos siacutembolos igual concatenados

gt 3 == 5[1] FALSEgt 3 == 3[1] TRUE

y al igual que sucede con gt o con lt es un operador booleano que produce como resultado TRUEo FALSE (o NA si alguno de los argumentos es igual a NA)Volviendo a la pregunta inicial la forma de localizar los elementos de dado que son iguales a 3 es

dado[dado == 3]

Ejercicio 27Ejecuta estas instrucciones

setseed(2014)dado2 = sample(16 1500 replace = TRUE)

iquestCuaacutentos elementos del vector dado2 son iguales a 4 Responde sin usar table Solucioacuten en lapaacutegina 52

7 Formato del coacutedigo R en proacuteximos tutorialesEn este tutorial hemos tratado de presentar el coacutedigo en R de la forma que creemos resulta maacutesnatural para los usuarios que acaban de iniciarse en el manejo del sistema Esa presentacioacuten tienecomo decimos la ventaja de la naturalidad pero no es la maacutes coacutemoda para el trabajo que vamos ahacer en el resto del curso En los proacuteximos tutoriales vamos a utilizar un sistema diferente pensadopara hacer tu trabajo maacutes coacutemodo No te lo hemos presentado del principio porque creemos quesin conocer un poco el funcionamiento de R podriacutea crear confusioacuteniquestDe queacute se trata Vamos a usar como ejemplo una simulacioacuten del lanzamiento de un dado 1000veces en la que calcularemos ademaacutes la media el rango intercuartiacutelico y la cuasidesviacioacuten tiacutepicadel vector de resultados Hasta ahora para mostrarte el coacutedigo necesario y los resultados queproduce hemos usado un formato como este

gt setseed(2014)gt dado = sample(16 1000 replace=TRUE)gt mean(dado)[1] 3607gt IQR(dado)[1] 3gt sd(dado)[1] 1674322

Ese formato estaacute bien en tanto que reproduce de una forma fiel el ldquodiaacutelogordquo que mantenemos con RPero si quieres copiar ese coacutedigo desde este documento para pegarlo en RStudio por ejemplo y asiacutepoder ejecutarlo o modificarlo a tu gusto entonces aparecen algunos inconvenientes Para empezaral copiar las liacuteneas de comandos estaraacutes copiando tambieacuten el siacutembolo gt (el prompt de R) Y esosignifica que tienes que eliminar ese siacutembolo antes de ejecutar la liacutenea de coacutedigo Ademaacutes estaraacutescopiando tambieacuten las liacuteneas de resultados que no puedes ejecutar sin que se produzcan erroresEn resumen no es un formato coacutemodo y lo va a ser cada vez menos a medida que avancemos enel curso Para evitar esos problemas vamos a utilizar este otro formato

45

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

setseed(2014)dado = sample(16 1000 replace=TRUE)mean(dado)

[1] 3607

IQR(dado)

[1] 3

sd(dado)

[1] 1674322

Como ves aparte de los colores y el sombreado (que no son importantes) en este formato hadesaparecido el prompt gt de R Asiacute que puedes copiar las liacuteneas de coacutedigo completas en RStudio yejecutarlas directamente sin problemasAdemaacutes para facilitar la copia de bloques enteros de liacuteneasde coacutedigo las liacuteneas con respuestas de R (liacuteneas de salida) se muestran comentadas (precedidas por) De esa manera aunque las copies a RStudio no causaraacuten ninguacuten efecto sobre la ejecucioacuten delos comandos Este formato para el coacutedigo y las respuestas simplificaraacute mucho nuestro trabajo enel resto del curso Y maacutes adelante en un tutorial opcional explicaremos en detalle la herramientaque hemos usado porque su utilidad va mucho maacutes allaacute de un simple cambio de formato

8 Ejercicios adicionales y soluciones

Ejercicios adicionales28 En todos los ejemplos de aritmeacutetica vectorial que hemos visto los dos vectores implicados

eran de la misma longitud iquestQueacute sucede si no es asiacute Pues algo interesante y que en cualquiercaso conviene conocer para evitar errores Te invitamos a que lo descubras ejecutando esteejemplo

vector3=c(1234567891011121314151617181920)vector4=c(012)vector3+vector4

iquestQueacute ha hecho R Puedes entenderlo asiacute al principio empieza sumando normalmente posi-cioacuten a posicioacuten Pero tras sumar tres posiciones R descubre que vector4 se ha agotado Ylo que hace es simplemente volver al principio de vector4 y comenzar de nuevo a utilizarsus elementos desde el primero Asiacute pues en el resultado se suma el vector 012 con 123 yluego se vuelve a sumar 012 con 456 (para dar 468 de resultado) y asiacute consecutivamentevamos recorriendo la suma hasta que el vector maacutes largo vector3 se agota a su vezComo ejercicio para practicar esto dado el vector vector1 = 68213 suacutemale un vector2de longitud 5 de manera que todos los elementos de vector1 + vector2 sean muacuteltiplos de5

29 En el Tutorial-01 hemos visto coacutemo calcular la media varianza etc a partir de una tablade frecuencias de una variable cuantitativa discreta (recuerda para empezar la Seccioacuten 42paacuteg 25 de ese tutorial) Aquiacute no podemos todaviacutea trabajar con los mismos ficheros queusaacutebamos en aquel caso porque auacuten no hemos visto como leer desde R ficheros csv quecontienen tablas (con varias columnas) Pero podemos trabajar a partir de dos vectores unocon los valores y otro con las frecuencias como hemos hecho en la Seccioacuten 62 (paacuteg 39)

a) Usando los vectores que vimos en esa seccioacuten

valores = c(235813)frecuencias = c(5712214)

calcula la media aritmeacutetica la varianza y cuasivarianza y la mediana iexclNo uses todaviacuteala funcioacuten rep lo haraacutes en el tercer apartado

b) Calcula tambieacuten las tablas de frecuencias relativas acumuladas y relativas acumuladasc) Ahora usa la funcioacuten rep para fabricar un vector que contenga los mismos datos sin

agrupar por frecuencias Y repite los caacutelculos de los dos anteriores apartados para com-probar los resultados

46

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

Soluciones de algunos ejerciciosbull Ejercicio 2 paacuteg 9Al final las variables valen a = 15 b = 100 c = 1500

bull Ejercicio 3 paacuteg 13Hay 100 elementos en el vector

bull Ejercicio 4 paacuteg 14

gt errorDeLectura = readtable(file = datosEsteFicheroNoExistecsv)Error in file(file rt) no se puede abrir la conexioacutenIn addition Warning messageIn file(file r) no fue posible abrir el archivo datosEsteFicheroNoExistecsv No such file or directory

bull Ejercicio 6 paacuteg 18Para guardar el vector1 usamos

vector1 = c(8 5 19 9 17 2 28 18 3 4 19 1)

Para vector2 puedes usar el pegado especial de Calc como se sugiere en el enunciado Pero paraleer el fichero sin salir de R aseguacuterate primero de que el fichero Tut02-vector2csv estaacute en lasubcarpeta datos de tu directorio de trabajo y luego ejecuta

gt (vector2 = asvector(readtable(file=datosTut02-vector2csv sep=header = FALSE)))[1] 18 18 20 12 20 1 30 6 26 20 15 25

Maacutes adelante entenderaacutes mejor lo que hemos hecho aquiacute Esencialmente hemos pedido a R que lealos datos con lsquoreadtablelsquo y luego hemos usado la funcioacuten lsquotlsquo para trasponer la tabla resultante Eluacuteltimo detalle es que al hacer esto el resultado es una matriz no un vector y por eso hemos usadolsquoasvectorlsquo para convertir la matriz en un vector

bull Ejercicio 7 paacuteg 20

gt (cuadrados = (110)^2 )[1] 1 4 9 16 25 36 49 64 81 100gtgt (cuadrados2 = (211)^2 )[1] 4 9 16 25 36 49 64 81 100 121gtgt cuadrados2 - cuadrados[1] 3 5 7 9 11 13 15 17 19 21

La diferencia entre dos cuadrados consecutivos n2 y (n+ 1)2 es siempre el nuacutemero impar 2n+ 1

bull Ejercicio 8 paacuteg 20

gt sum((110)^2)[1] 385gt No confundir congt sum(110)^2[1] 3025

47

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

bull Ejercicio 9 paacuteg 21

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt ( n = length(vectorEdades) )[1] 100gt ( mediaEdades = sum(vectorEdades) n )[1] 675gt ( varEdades = sum( ( vectorEdades - mediaEdades )^2) n )[1] 19875gt ( desvTipicaEdades = sqrt(varEdades))[1] 1409787gt ( cuasiVarEdades = sum( ( vectorEdades - mediaEdades )^2) (n - 1) )[1] 2007576gt ( cuasiDesvTipicaEdades = sqrt(cuasiVarEdades))[1] 1416889gtgt sum( vectorEdades - mediaEdades )^2[1] 0

Este valor 0 se explica en la Ecuacioacuten 24 (paacuteg 35 del libro)

bull Ejercicio 10 paacuteg 21iexclDespueacutes de establecer el directorio de trabajo Si no no funcionaraacute

gt var3 = readtable(file=datosTut02-var3csv header = FALSE)[1]gt length(var3)[1] 1300

bull Ejercicio 11 paacuteg 22

gt (tablaFrecAbs = table(var3) )var30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 25 100 188 244 246 186 131 87 43 28 6 2 2 2 1

gt length(tablaFrecAbs)[1] 16gt sum(tablaFrecAbs)[1] 1300gt min(tablaFrecAbs)[1] 1gt max(tablaFrecAbs)[1] 246gt range(tablaFrecAbs)[1] 1 246

bull Ejercicio 12 paacuteg 23

gt ( n = length( var3 ) )[1] 1300gt ( tablaFrecRel = tablaFrecAbs n )var3

0 1 2 3 4 500069230769 00192307692 00769230769 01446153846 01876923077 01892307692

6 7 8 9 10 1101430769231 01007692308 00669230769 00330769231 00215384615 00046153846

12 13 14 1600015384615 00015384615 00015384615 00007692308gt sum(tablaFrecRel)[1] 1

48

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

bull Ejercicio 13 paacuteg 23

Para la tabla de frecuencias acumuladas

gt ( tablaFrecAcu = cumsum(tablaFrecAbs) )0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 169 34 134 322 566 812 998 1129 1216 1259 1287 1293 1295 1297 1299 1300

Las dos formas para la tabla de frecuencias relativas acumuladas son

gt ( tablaFrecRelAcu = cumsum(tablaFrecRel) )0 1 2 3 4 5 6

0006923077 0026153846 0103076923 0247692308 0435384615 0624615385 07676923087 8 9 10 11 12 13

0868461538 0935384615 0968461538 0990000000 0994615385 0996153846 099769230814 16

0999230769 1000000000gt ( tablaFrecRelAcu = (tablaFrecAcu n) )

0 1 2 3 4 5 60006923077 0026153846 0103076923 0247692308 0435384615 0624615385 0767692308

7 8 9 10 11 12 130868461538 0935384615 0968461538 0990000000 0994615385 0996153846 0997692308

14 160999230769 1000000000

y en este caso producen el mismo resultado En general es maacutes recomendable el segundo meacutetodo

bull Ejercicio 14 paacuteg 25

El graacutefico resultante seraacute parecido a este

bull Ejercicio 15 paacuteg 25

En ambos casos el graacutefico resultante seraacute parecido a este

49

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

bull Ejercicio 16 paacuteg 26Para la primera parte despueacutes de comprobar que el directorio de trabajo es correcto hacemos

gt vectorEdades = readtable(file=datosTut02-Edadescsv header = FALSE)[1]gt (mediaEdades = mean(vectorEdades))[1] 675

Para la segunda las dos posibles formas de calcular la media de var3 son estas

gt ( mediaVar3 = mean(var3))[1] 5039231gt ( mediaVar3 = sum(var3)length(var3))[1] 5039231

Y como era de esperar el resultado es el mismo

bull Ejercicio 17 paacuteg 27Calculamos los dos valores

gt ( varMuestral = var(var3))[1] 4715165gt ( desvTipMuestral = sd(var3))[1] 2171443

Y para la comprobacioacuten que pide el ejercicio hacemos

gt sqrt(varMuestral)[1] 2171443

bull Ejercicio 18 paacuteg 27Siempre podemos averiguar de que tipo de objeto se trata con la funcioacuten class de R

gt class(summary(var3))[1] summaryDefault table

En este caso R nos contesta que es un tipo especial de tabla asociado precisamente a la funcioacutensummary

50

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

bull Ejercicio 22 paacuteg 36

La tabla de frecuencia se obtiene con

gt table(dado)dado1 2 3 4 5 6

167 171 167 163 188 144

Al ser nuacutemeros aleatorios tus resultados seraacuten distintosPara comprobar que dado es un vector ejecutamos

gt class(dado)[1] integer

y R nos informa de que en efecto es un vector de nuacutemeros enteros (integer numbers en ingleacutes)

bull Ejercicio 23 paacuteg 38El generador de claves modificado es

gt ( Clave = sample(c(LETTERS letters 09) size=15 replace=TRUE) )[1] S F 3 U z i g L 4 3 M S s u y

Y como aperitivo de lo que ofrece la funcioacuten paste

gt paste(Clave collapse=)[1] SF3UzigL43MSsuy

bull Ejercicio 24 paacuteg 41El comando

gt tail(dado 1)[1] 1

muestra que el uacuteltimo elemento es un 1 Para ver los 10 uacuteltimos elementos

gt tail(dado 10)[1] 4 6 3 4 3 5 4 2 3 1

bull Ejercicio 25 paacuteg 43Apartado 1

gt dado[16][1] 3

Apartado 2 El operador adecuado es gt= y usamos head para ver el comienzo de la solucioacuten

gt masoIgualQue2 = dado[dadogt=2]gt head(masoIgualQue2)[1] 2 2 4 2 4 6

Apartado 3

gt pares = dado[dado2==0]gt head(pares)[1] 2 2 4 2 4 6

bull Ejercicio 26 paacuteg 44

gt (7 lt 5) | (2 lt 4)[1] TRUE

51

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones

bull Ejercicio 27 paacuteg 45

Recuerda que los valores booleanos se traducen en unos y ceros y escribe

gt sum(dado2 == 4)[1] 280

Fin del Tutorial-02 iexclGracias por la atencioacuten

52

  • Primer contacto con R y RStudio
  • Variables y vectores
  • Ficheros csv con R
  • Estadiacutestica descriptiva de una variable cuantitativa con datos no agrupados
  • Ficheros de comandos R Comentarios
  • Maacutes operaciones con vectores en R
  • Formato del coacutedigo R en proacuteximos tutoriales
  • Ejercicios adicionales y soluciones