Taller R UAH 2024

Profesor: Alonso Quezada

Introducción a R

Al igual que con cualquier pieza de software, R necesita ser instalado en un “ordenador”, R se distribuye gratuitamente en línea, y puedes descargarlo desde la página principal de R, que es:

http://cran.r-project.org/

Een la parte superior de la página bajo el título “Descargar e instalar R” verás enlaces separados para usuarios de Windows, Mac y Linux. Si sigues el enlace correspondiente, verás que las instrucciones en línea se explican por sí solas, pero te guiaré a través de la instalación de todos modos. En el momento de escribir estas líneas, la versión actual de R es la 4.3.2, pero suelen publicar actualizaciones cada seis meses, así que probablemente tendrás una versión más reciente.

Instalar R Studio

El término R no se refiere realmente a una aplicación específica de su ordenador. Se refiere más bien al lenguaje estadístico subyacente. Puede utilizar este lenguaje a través de muchas aplicaciones diferentes. Cuando se instala R inicialmente, viene con una aplicación que le permite hacer esto: es la aplicación R.exe en una máquina Windows, y la aplicación R.app en un Mac. Pero esa no es la única manera de hacerlo. Hay muchas aplicaciones diferentes que puedes utilizar y que te permitirán interactuar con R. Una de ellas se llama Rstudio, y es la que te voy a sugerir que utilices. Rstudio proporciona una interfaz limpia y profesional para R con la que me resulta mucho más agradable trabajar que con los programas predeterminados de Windows o Mac. Rstudio es software libre: puedes encontrar todos los detalles en su página web. Mientras tanto, puede descargarlo aquí:

https://posit.co/downloads/

Una vez finalizada la descarga, abra el instalador de la forma habitual para instalar Rstudio. Una vez finalizada la instalación, puede iniciar R abriendo Rstudio. No necesita abrir R.app o R.exe para acceder a R. Rstudio se encargará de ello.

Comenzando a usar R

Una de las cosas más sencillas que puede hacer con R es utilizarlo como una simple calculadora, por lo que es un buen punto de partida. Por ejemplo, intente escribir 10 + 20 y pulse Enter. Al hacerlo, habrá introducido un comando y R lo “ejecutará”. Lo que verás ahora en pantalla será esto:

10+20
[1] 30

No hay muchas sorpresas en este extracto. Pero hay algunas cosas de las que merece la pena hablar, incluso con un ejemplo tan sencillo. En primer lugar, es importante que entiendas cómo leer el extracto. En este ejemplo, lo que he escrito es la parte 10 + 20. No he escrito el símbolo >. Eso es sólo el indicador de comandos de R y no forma parte del comando real. Y tampoco escribí la parte [1] 30 . Eso es lo que R imprimió en respuesta a mi comando.

En segundo lugar, es importante entender cómo se formatea la salida. Obviamente, la respuesta correcta a la suma 10 + 20 es 30, y no es sorprendente que R haya impreso eso como parte de su respuesta. Pero también ha impreso esta parte [1], que probablemente no tenga mucho sentido para ti en este momento. Vas a ver eso mucho. Hablaré de lo que esto significa con un poco más de detalle más adelante, pero por ahora puedes pensar en [1] 30 como si R dijera “la respuesta a la primera pregunta que hiciste es 30”. Eso no es del todo la verdad, pero es lo suficientemente cerca por ahora. Y en cualquier caso no es realmente muy interesante en este momento: sólo le pedimos a R que calcule una cosa, por lo que, obviamente, sólo hay una respuesta impresa en la pantalla. Más adelante esto cambiará, y la parte [1] empezará a tener un poco más de sentido. Por ahora, sólo quiero que no te confundas ni te preocupes.

R entiende ciertas cosas

Una cosa más que debo señalar. Si pulsa Enter en una situación en la que es “obvio” para R que en realidad no ha terminado de escribir el comando, R es lo suficientemente inteligente como para seguir esperando. Por ejemplo, si escribe 10 + y luego pulsa Enter, incluso R es lo suficientemente inteligente como para darse cuenta de que probablemente quería escribir otro número. Así que esto es lo que sucede:

Error:incomplete expression: 10+

y hay un cursor parpadeando junto al signo más. Esto significa que R todavía está esperando a que termines. R piensa que todavía estas escribiendo un comando, por lo que no ha intentado ejecutarlo todavía. En otras palabras, este signo más es en realidad otro prompt de comando. Es diferente del habitual (es decir, el símbolo >) para recordarle que R va a “añadir” lo que escriba ahora a lo que escribió la última vez. Por ejemplo, si luego escribo 3 y pulso Enter, lo que obtengo es esto:

10+
  20
[1] 30

Tabla: Operaciones aritmeticas basicas en R

Almacenar un número como variable

Una de las cosas más importantes que se pueden hacer en R (o en cualquier lenguaje de programación) es almacenar información en variables. A nivel conceptual, puede pensar en una variable como una etiqueta para cierta información, o incluso para varias informaciones diferentes. Al realizar análisis estadísticos en R, todos tus datos (las variables que mediste en tu estudio) se almacenarán mejor como variables en R, pero como veremos más adelante, también acabarás creando variables para otras cosas. Sin embargo, antes de profundizar en todos los detalles desordenados de los conjuntos de datos y el análisis estadístico, echemos un vistazo a los fundamentos de cómo crear variables y trabajar con ellas.

Asignación de variables con <-

Como hasta ahora hemos trabajado con números, empecemos por crear variables para almacenar nuestros números.Y como a la mayoría de la gente le gustan los ejemplos concretos, inventemos uno. Supongamos que intento calcular cuánto dinero voy a ganar con la venta de un libro. En primer lugar, tengo que calcular cuántas copias voy a vender. Esto no es exactamente Harry Potter, así que supongamos que sólo voy a vender 350 libros, así que vamos a crear una variable llamada ventas. Lo que quiero hacer es asignar un valor a mi variable ventas, y ese valor debería ser 350. Lo hacemos usando la asignación de variables. Hacemos esto usando el operador de asignación, que es <-. Así es como lo hacemos:

sales <- 350

Cuando pulsas Enter, R no imprime ninguna salida. Sin embargo, entre bastidores R ha creado una variable llamada ventas y le ha dado un valor de 350. Puede comprobar que esto ha sucedido pidiéndole a R que imprima la variable en pantalla. Y la forma más sencilla de hacerlo es escribir el nombre de la variable y pulsar Enter.

sales
[1] 350

Hacer cálculos utilizando variables

Bien, volvamos a mi historia original. En mi afán por hacerme rico, he escrito este libro de texto. Para averiguar lo buena que es una estrategia, he empezado a crear algunas variables en R. Además de la variable de ventas, que cuenta el número de ejemplares que voy a vender, también puedo crear una variable llamada regalía (royalty), que indica cuánto dinero obtengo por ejemplar. Digamos que mis royalties son de unos 7 dólares por libro:

sales <- 350
royalty <- 7

Lo bueno de las variables (de hecho, el objetivo de tener variables) es que podemos hacer cualquier cosa con una variable y la información que almacena. Es decir, como R me permite multiplicar 350 por 7

350 * 7
[1] 2450

También me permite multiplicar sales por royalty

sales*royalty
[1] 2450

En lo que respecta a R, el comando sales * royalty es el mismo que el comando 350 * 7. Como es lógico, puedo asignar el resultado de este cálculo a una nueva variable, que llamaré revenue. Y cuando hacemos esto, la nueva variable revenue obtiene el valor 2450. Así que vamos a hacer eso, y luego hacer que R imprima el valor de los ingresos para que podamos verificar que ha hecho lo que le pedimos:

revenue <- sales * royalty
revenue
[1] 2450

Eso es bastante sencillo. Una cosa un poco más sutil que podemos hacer es reasignar el valor de mi variable, basándonos en su valor actual. Por ejemplo, supongamos que a una persona le gusta tanto el libro que me dona 550 dólares más. La forma más sencilla de capturar esto es mediante un comando como éste:

revenue <- revenue + 550

En este cálculo, R ha tomado el valor antiguo de los ingresos (es decir, 2.450) y le ha añadido 550, produciendo un valor de 3.000. Este nuevo valor se asigna a la variable de ingresos, sobrescribiendo su valor anterior.

Reglas y convenciones para nombrar variables

En los ejemplos que hemos visto hasta ahora, los nombres de mis variables (sales e revenue) han sido simplemente palabras en inglés escritas con minúsculas. Sin embargo, R permite mucha más flexibilidad a la hora de nombrar las variables, como ilustra la siguiente lista de reglas: 

  • Los nombres de las variables sólo pueden utilizar los caracteres alfabéticos en mayúsculas A-Z, así como los caracteres en minúsculas a-z. También puede incluir los caracteres numéricos 0-9 en el nombre de la variable, así como el punto . o el guión bajo _. En otras palabras, puede utilizar SaL.e_s como nombre de variable (aunque no se me ocurre por qué querría hacerlo), pero no puede utilizar Sales? 

  • Los nombres de variables no pueden incluir espacios: por lo tanto, my sales no es un nombre válido, pero my.sales sí. 

  • Los nombres de variable distinguen entre mayúsculas y minúsculas: es decir, Ventas y ventas son nombres de variable diferentes.

  • Los nombres de las variables deben empezar por una letra o un punto. No puede utilizar algo como _ventas o 1ventas como nombre de variable. Puede utilizar .sales como nombre de variable si lo desea, pero no suele ser una buena idea. Por convención, las variables que empiezan por . se utilizan para fines especiales, por lo que debe evitar.

  • Los nombres de las variables no pueden ser una de las palabras clave reservadas. Se trata de nombres especiales que R necesita mantener “a salvo” de nosotros, los meros usuarios, por lo que no se pueden utilizar como nombres de variables. Las palabras clave son: if, else, repeat, while, function, for, in, next, break, TRUE, FALSE, NULL, Inf, NaN, NA, NA_integer_, NA_real_, NA_complex_ y, por último, NA_character_. No se sienta especialmente obligado a memorizarlas: si comete un error e intenta utilizar una de las palabras clave como nombre de variable, R se quejará de ello.

Recuerda usar nombres cortos y autoexplicativos. Utiliza uno de los estilos de denominación convencionales para los nombres de variables de varias palabras. Supongamos que quiero nombrar una variable que almacene “mi nuevo salario”. Obviamente, no puedo incluir espacios en el nombre de la variable. Hay tres convenciones diferentes que a veces se ve que emplean los usuarios de R. En primer lugar, puede separar las palabras utilizando puntos, lo que le daría mi.nuevo.salario como nombre de variable. Tambien se utiliza el guión bajo lo que le daría mi_nuevo_salarioPor último, puede usar mayúsculas al principio de cada palabra (excepto en la primera), lo que le daría miNuevoSalario como nombre de la variable.

Almacenar muchos números como un vector

En esta sección, vamos a ampliar la idea de como una variable puede almacenar un numero y ver cómo almacenar varios números dentro de una variable. En R el nombre para una variable que puede almacenar múltiples valores es vector. Así que vamos a crear uno.

Creación de un vector

Supongamos que la empresa de libros de texto (si realmente tuviera una, claro) me envía los datos de ventas mensualmente. Como mis clases empiezan a finales de febrero, es de esperar que la mayoría de las ventas se produzcan a principios de año. Supongamos que tengo 100 ventas en febrero, 200 ventas en marzo y 50 ventas en abril, y ninguna otra venta durante el resto del año.Lo que me gustaría hacer es tener una variable llamémosla sales.by.month, que almacene todos estos datos de ventas. El primer número almacenado debería ser 0 ya que no tuve ventas en enero, el segundo debería ser 100, y así sucesivamente. La forma más sencilla de hacer esto en R es utilizar la función combinar, c().

Para ello, lo único que tenemos que hacer es escribir todos los números que queramos almacenar en una lista separada por comas

sales.by.month <- c(0,100,200,50,0,0,0,0,0,0,0,0)
sales.by.month
 [1]   0 100 200  50   0   0   0   0   0   0   0   0

Para utilizar la terminología correcta, aquí tenemos una única variable llamada sales.by.month: esta variable es un vector que consta de 12 elementos.

Obtener información de los vectores

Para volver a la historia principal, consideremos el problema de cómo obtener información de un vector. Supongamos que sólo quiero obtener los datos de ventas de febrero. Febrero es el segundo mes del año, así que probemos esto:

sales.by.month[2]
[1] 100

Perfecto, son las ventas de febrero. Pero hay que tener en cuenta un detalle sutil: observe que R da como resultado [1] 100, no [2] 100. Esto se debe a que R está siendo extremadamente literal. Cuando tecleamos sales.by.month[2], le pedimos a R que encontrara exactamente una cosa, y esa cosa resulta ser el segundo elemento de nuestro vector sales.by.month. Por lo tanto, cuando sale [1] 100 lo que R está diciendo es que el primer número que acabamos de pedir es 100. Este comportamiento tiene más sentido cuando nos damos cuenta de que podemos utilizar este truco para crear nuevas variables. Por ejemplo, podría crear una variable february.sales así:

february.sales <- sales.by.month[2]
february.sales
[1] 100

Alterar los elementos de un vector

A veces querrás cambiar los valores almacenados en un vector. Imagínate mi sorpresa cuando la editorial me llama para decirme que los datos de ventas de mayo son erróneos. En realidad se vendieron 25 libros más en mayo, pero hubo un error o algo así y no me lo habían comunicado. ¿Cómo puedo modificar la variable sales.by.month? Una posibilidad sería volver a asignar todo el vector desde el principio, utilizando c(). Pero eso es teclear mucho. Además, es un poco despilfarrador: ¿por qué tiene que recuperar R las cifras de ventas de los 12 meses, cuando sólo el quinto está mal? Afortunadamente, podemos decirle a R que cambie sólo el quinto elemento, utilizando este truco:

sales.by.month[5] <- 25
sales.by.month
 [1]   0 100 200  50  25   0   0   0   0   0   0   0

Cosas útiles que hay que saber sobre los vectores

Antes de continuar, quiero mencionar un par de cosas más sobre los vectores. En primer lugar, a menudo querrás saber cuántos elementos tiene un vector (normalmente porque lo has olvidado), para lo cual puedes utilizar la función length(). Es muy sencillo:

length(x=sales.by.month)
[1] 12

En segundo lugar, a menudo se desea modificar todos los elementos de un vector a la vez. Por ejemplo, supongamos que quiero saber cuánto dinero gano cada mes. Dado que estoy ganando unos interesantes 7 dólares por libro, lo que quiero hacer es multiplicar por 7 cada elemento del vector sales.by.month R hace esto bastante fácil, como muestra el siguiente ejemplo:

sales.by.month*7
 [1]    0  700 1400  350  175    0    0    0    0    0    0    0

En otras palabras, cuando multiplicas un vector por un único número, todos los elementos del vector se multiplican, al igual que ocurre con la suma, la resta, la división y la obtención de potencias. Eso está muy bien. Por otro lado, supongamos que quiero saber cuánto dinero gano al día, en lugar de al mes. Como no todos los meses tienen el mismo número de días, tengo que hacer algo ligeramente distinto. En primer lugar, crearé dos nuevos vectores:

days.per.month <- c(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
profit <- sales.by.month*7

Obviamente, la variable profit es la misma que creamos anteriormente, y la variable days.per.month es bastante sencilla. Lo que quiero hacer es dividir cada elemento de profit por el elemento correspondiente de days.per.month. De nuevo, R lo hace bastante fácil:

profit/days.per.month
 [1]  0.000000 25.000000 45.161290 11.666667  5.645161  0.000000  0.000000
 [8]  0.000000  0.000000  0.000000  0.000000  0.000000

Observe que el segundo elemento de la salida es 25, porque R ha dividido el segundo elemento de profit (es decir, 700) por el segundo elemento de days.per.month(es decir, 28). Del mismo modo, el tercer elemento de la salida es igual a 1400 dividido por 31, y así sucesivamente. Más adelante hablaremos de los cálculos con vectores.

round(profit/days.per.month, digits = 0)
 [1]  0 25 45 12  6  0  0  0  0  0  0  0

La función round() nos permite redondear los decimales de una operación aritmetica, señalando cuantos digitos queremos que calcule despues de la coma. En este caso, decidimos redondear sin ningun digito despues de la coma, para tener un número entero.

Almacenamiento de datos de texto

La mayoría de las veces, los datos son de naturaleza numérica, pero no siempre. A veces es necesario describir los datos con texto, no con números. Para ello, debemos considerar la situación en la que nuestras variables almacenan texto. Para crear una variable que almacene la palabra “hola”, podemos escribir esto:

saludo <- "hola"
saludo
[1] "hola"

Al interpretar esto, es importante reconocer que las comillas no forman parte de la cadena en sí. Son sólo algo que usamos para asegurarnos de que R sabe que debe tratar los caracteres que encierran las comillas como una pieza de datos de texto, conocida como cadena de caracteres (string).

months <- c("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")

months[4]
[1] "April"

Almacenar datos “verdaderos o falsos” (true or false)

Es hora de pasar a un tercer tipo de datos. Un concepto clave en el que se basa gran parte de R es la idea de valor lógico. Un valor lógico es una afirmación sobre si algo es verdadero o falso. Esto se implementa en R de una manera bastante sencilla. Existen dos valores lógicos, TRUE y FALSE. A pesar de la simplicidad, los valores lógicos son cosas muy útiles. Veamos cómo funcionan.

Evaluar las verdades matemáticas

En el clásico libro de George Orwell 1984, uno de los eslóganes utilizados por el Partido Totalitario era “dos más dos es igual a cinco”, con la idea de que la dominación política de la libertad humana se completa cuando es posible subvertir incluso las verdades más básicas. Es una idea aterradora, sobre todo cuando el protagonista, Winston Smith, se derrumba bajo la tortura y acepta la proposición. “El hombre es infinitamente maleable”, dice el libro. Estoy bastante seguro de que esto no es cierto para los seres humanos, pero estoy completamente seguro que no es cierto para R. R no es maleable. Tiene opiones firmes para los tipicos que son y no son verdaderos, al menos matematicamente. Si le pregunto que calcula 2+2 siempre me dará la misma respuesta.

2+2
[1] 4

Por supuesto, hasta ahora R sólo está haciendo los cálculos. No le he pedido que afirme explícitamente que 2 + 2 = 4 es una afirmación verdadera. Si quiero que R haga un juicio explícito, puedo usar un comando como este:

2+2==4
[1] TRUE

Lo que he hecho aquí es utilizar el operador de igualdad, ==, para forzar a R a hacer un juicio TRUE or FALSE. Bien, veamos qué piensa R del eslogan del Partido:

2+2 == 5
[1] FALSE

De todos modos, vale la pena ver lo que ocurre si intento forzar a R a creer que dos más dos es cinco haciendo una sentencia de asignación como 2+ 2 = 5 o 2 + 2 <- 5. Cuando hago esto, ocurre lo siguiente: R no cree que dos más dos es cinco. Cuando hago esto, esto es lo que pasa:

2+2=5
Error in 2 + 2 = 5: target of assignment expands to non-language object

A R no le gusta mucho esto. Reconoce que 2 + 2 no es una variable (eso es lo que dice la parte “non-language object”), y no te deja intentar reasignarla.

Operaciones lógicas

Ya hemos visto cómo funcionan las operaciones lógicas, pero hasta ahora sólo hemos visto el ejemplo más sencillo posible. Probablemente no te sorprenderá descubrir que podemos combinar operaciones lógicas con otras operaciones y funciones de una forma más complicada, como ésta:

3*3 + 4*4 == 5*5
[1] TRUE
sqrt(25) == 5
[1] TRUE

Tabla: Operadores logicos

Aún no hemos terminado. ¡Hay tres operaciones lógicas más que merece la pena conocer, enumeradas. Se trata de los operadores not !, el operador and & y el operador or |. Al igual que los otros operadores lógicos, su comportamiento es más o menos el que cabría esperar dado su nombre. Por ejemplo, si te pido que evalúes la afirmación de que 2 + 2 = 4 or 2 + 2 = 5, dirás que es cierta. Como se trata de una afirmación “o bien”, lo único que necesitamos es que una de las dos partes sea cierta. Eso es lo que hace el operador |:

(2+2 == 4) | (2+2 == 5)
[1] TRUE

Por otro lado, si te pido que evalúes la afirmación de que tanto 2 + 2 = 4 and 2 + 2 = 5 dirías que es falsa. Como se trata de una afirmación and, necesitamos que ambas partes sean verdaderas. Y eso es lo que hace el operador &:

(2+2 == 4) & (2+2 == 5)
[1] FALSE

Por último, está el operador not, que es sencillo, pero molesto de describir en inglés. Si te pido que evalúes mi afirmación de que “no es cierto que 2 + 2 = 5”, entonces dirás que mi afirmación es cierta; porque mi afirmación es que “2 + 2 = 5 es falso”. Y estoy en lo correcto. Si escribimos esto como un comando R obtenemos esto:

!(2+2 == 5)
[1] TRUE

Por supuesto, en nuestro ejemplo de 2 + 2 = 5, no necesitábamos utilizar not ! e igual a == como dos operadores separados. Podríamos haber usado simplemente el operador != de la siguiente manera:

2+2!=5
[1] TRUE

Vectores lógicos

Lo siguiente que hay que mencionar es que se pueden almacenar vectores de valores lógicos exactamente igual que se pueden almacenar vectores de números y vectores de datos de texto. De nuevo, podemos almacenarlos directamente mediante la función c(), de la siguiente manera:

x <- c(TRUE, TRUE, FALSE)
x
[1]  TRUE  TRUE FALSE

o puedes producir un vector de lógicas aplicando un operador lógico a un vector. Puede que esto no tenga mucho sentido para ti, así que vamos a explicarlo despacio. En primer lugar, supongamos que tenemos un vector de números (es decir, un vector no lógico). Por ejemplo, podríamos utilizar el vector sales.by.month. Supongamos que quiero que R me diga, para cada mes del año, si realmente vendí un libro en ese mes. Puedo hacerlo escribiendo esto:

sales.by.month > 0
 [1] FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

Ese resultado tambien podría almacenarlo en un vector

any.sales.month <- sales.by.month > 0

En otras palabras, any.sales.month es un vector lógico cuyos elementos son TRUE sólo si el elemento correspondiente de sales.by.month es mayor que cero. Por ejemplo, como vendí cero libros en enero, el primer elemento es FALSE.

Indexación de vectores

Una última cosa que añadir antes de terminar este capítulo. Hasta ahora, cada vez que he tenido que obtener información de un vector, todo lo que he hecho ha sido escribir algo como months[4]; y cuando hago esto R imprime el cuarto elemento del vector months. En esta sección, te mostraré dos trucos adicionales para obtener información del vector.

Extraer varios elementos

Una cosa muy útil que podemos hacer es extraer más de un elemento a la vez. En el ejemplo anterior, sólo hemos utilizado un número (ej: 2) para indicar qué elemento queríamos. Como alternativa, podemos utilizar un vector. Supongamos que quiero los datos de febrero, marzo y abril. Lo que podría hacer es utilizar el vector c(2,3,4) para indicar qué elementos quiero que R extraiga. Es decir, escribiría esto:

sales.by.month[c(2,3,4)]
[1] 100 200  50

Observe que el orden importa aquí. Si pidiera los datos en el orden inverso (es decir, primero abril, luego marzo y luego febrero) utilizando el vector c(4,3,2), R mostraría los datos en el orden inverso:

sales.by.month[c(4,3,2)]
[1]  50 200 100

Una segunda cosa que hay que tener en cuenta es que R proporciona atajos prácticos para situaciones muy comunes. Por ejemplo, supongamos que quiero extraer todo desde el segundo mes hasta el octavo. Una forma de hacerlo es hacer lo mismo que hice antes y utilizar el vector c(2,3,4,5,6,7,8) para indicar los elementos que quiero. Esto funciona muy bien. Pero, es más eficiente utilizar 2:8.

sales.by.month[c(2:8)]
[1] 100 200  50  25   0   0   0

Tips

Atajos de teclado:

  • Insertar operador de asignación: Windows: Alt - / Mac: Option-

  • Ejecutar linea de comando: Windows Ctrl + Enter / Mac: Cmd+Enter

  • En consola ver los comando ejecutados: Cmd/Ctrl + ↑

  • Para marcar texto largo como comentario: Ctrl+Shift+C (Windows) / Cmd + Shift + C (Mac)

  • Pipe operator: %>% se usa Ctrl + Shift + M (Windows) / Cmd + Shift + M (Mac)

  • En la consola puedes comenzar a escribir una función como round() y presionar Tab para que R te ayude a completar el comando.