En este tema se estudia el concepto de variable. Las variables hacen referencia a datos. Una variable permite asociar un valor u objeto a un identificador. En este libro, utilizaremos el ambiente de software R para todo nuestro análisis. Aprenderán R y las técnicas de análisis de datos simultáneamente. Una ventaja de los lenguajes de programación es poder definir variables y escribir expresiones con estas, como se hace en las matemáticas, para obtener una solución numérica. Usamos el término objeto para describir cosas que están almacenadas en R.
Definición y Asignación de Variables
Para crear una variable en R hay que asignarle un valor mediante una operación llamada asignación. Aquí la variable tiene el nombre x, el operador de asignación está compuesto por los caracteres < y - escritos juntos (<-). Por último, la expresión es el valor 7. A partir de ahora, la variable x tiene asociado el valor 7 y podemos usar la variable para consultar su valor. Como escribir los caracteres < y - resulta tedioso, RStudio tiene un atajo (una combinación de teclas) para teclearlo más rápidamente. Como puede observase, cuando se usa el operador -> la expresión aparece a la izquierda del operador y la variable a la derecha.
Nombres de Variables
El nombre de una variable es un identificador. Deben comenzar por una letra o punto. Las palabras reservadas de R, como if o for no pueden usarse como identificadores. Ejemplos de identificadores válidos son: total, Suma, .bien, valor_total, nombre5. R es sensible a las mayúsculas. Esto significa que los identificadores Nombre, nombre o NOMBRE son distintos. Algunas reglas básicas en R son que los nombres de variables tienen que comenzar con una letra, no pueden contener espacios y no deben ser variables predefinidas en R. Una buena convención a seguir es usar palabras significativas que describan lo que están almacenado, usar solo minúsculas y usar guiones bajos como sustituto de espacios.
Tipado Dinámico y Tipos de Datos
R es un lenguaje con tipado dinámico. Esto significa que una variable puede contener valores de distinto tipo a lo largo del tiempo. Las variables en R pueden ser de diferentes tipos. Por ejemplo, necesitamos distinguir números de cadenas de caracteres y tablas de listas sencillas de números. Aunque no es especialmente relevante profundizar en ello de momento, fíjate que ambas órdenes combinadas nos dicen que las variables son de tipo numérico pero concretamente de tipo double: dichas variables son entendidas internamente como números con decimales (aunque no los veamos), lo que en matemáticas se llaman números reales (por curiosidad: el término double viene de lenguajes de programación antiguos como C, que significa «doble precisión», para indicarle que reserve 8 bytes - 64 bits - de memoria). Por defecto, a los números se les asigna una clase numérica incluso cuando son enteros redondos. Por ejemplo, class(1) devuelve numérico. Pueden convertirlo en un entero de clase con la función as.integer() o agregando un L así: 1L.
Vectores
En R, los objetos más básicos disponibles para almacenar datos son vectores. El objeto murders$population no es un número sino varios. Llamamos vectores a este tipo de objeto. Un solo número es técnicamente un vector de longitud 1, pero en general usamos el término vectores para referirnos a objetos con varias entradas. Podemos crear vectores usando la función c, que significa concatenar. A veces es útil nombrar las entradas de un vector. Usamos los corchetes para tener acceso a elementos específicos de un vector. Si los elementos tienen nombres, también podemos acceder a las entradas utilizando estos nombres. Para almacenar una cadena de caracteres, los vectores también pueden ser de la clase carácter. Otro tipo importante de vectores son los vectores lógicos.
Lea también: IVA 21% Excel
Coerción de Tipos
En general, la conversión forzada (coercion en inglés) es un intento de R de ser flexible con los tipos de datos. Cuando una entrada no coincide con lo esperado, algunas de las funciones predefinidas de R tratan de adivinar lo que uno intentaba antes de devolver un mensaje de error. Dijimos que los vectores deben ser todos del mismo tipo. ¡Pero no nos da un error, ni siquiera una advertencia! ¿Qué pasó? R forzó una conversión de los datos a caracteres. Como pusimos una cadena de caracteres en el vector, R adivinó que nuestra intención era que el 1 y el 3 fueran las cadenas de caracteres "1" y “3”. R también ofrece funciones para cambiar de un tipo a otro. Cuando una función intenta forzar una conversión de un tipo a otro y encuentra un caso imposible, generalmente nos da una advertencia y convierte la entrada en un valor especial llamado NA que significa no disponible (Not Available en inglés).
Estructuras de Datos Complejas
La forma más común de almacenar un set de datos en R es usando un data frame. Conceptualmente, podemos pensar en un data frame como una tabla con filas que representan observaciones y con columnas que representan las diferentes variables recopiladas para cada observación. El término “dataframe” es difícil de traducir al castellano. Podría traducirse como Hoja de datos o Marco de datos. Los dataframes son una clase de objetos especial en R. La estructura de un data.frame es muy similar a la de una matriz. La diferencia es que una matriz sólo admite valores numéricos, mientras que en un dataframe podemos incluir también datos alfanuméricos. En este ejemplo hemos creado un data.frame llamado misDatos que contiene a las tres variables edad, tiempo y sexo. La función str() nos muestra la estructura de este objeto, confirmándonos que es un data.frame de tres variables con 10 observaciones cada una. Nos informa además de que las dos primeras variables son numéricas y la tercera, el sexo, es un factor con dos valores, “H” y “M”.
Los factores son útiles para almacenar datos categóricos. En el fondo, R almacena estos levels como números enteros y mantiene un mapa para llevar un registro de las etiquetas. En R, por defecto, los niveles se ordenan alfabéticamente. Sin embargo, a menudo queremos que los niveles sigan un orden diferente. Pueden especificar un orden a través del argumento levels cuando crean el factor con la función factor. La función reorder nos permite cambiar el orden de los niveles de un factor según un resumen calculado en un vector numérico. Si hay valores asociados con cada level, podemos usar reorder y especificar un resumen de datos para determinar el orden. Advertencia: Los factores pueden causar confusión ya que a veces se comportan como caracteres y otras veces no.
Las matrices son otro tipo de objeto común en R. Las matrices son similares a los data frames en que son bidimensionales: tienen filas y columnas. Sin embargo, al igual que los vectores numéricos, de caracteres y lógicos, las entradas en las matrices deben ser del mismo tipo. Podemos definir una matriz usando la función matrix. Pueden acceder a entradas específicas en una matriz usando corchetes ([]). Pueden acceder a más de una columna o más de una fila si lo desean.
La lista representa el siguiente nivel de complejidad en las estructuras de datos que R es capaz de manejar. Podemos entender una lista como un contenedor de objetos que pueden ser de cualquier clase: números, vectores, matrices, funciones, data.frames, incluso otras listas. Para acceder a los objetos que forman parte de una lista, basta con añadir su nombre a continuación del de la lista, separados por el símbolo $, o bien con el índice de posición dentro de la lista con doble corchete ([[]]). R utiliza las listas, sobre todo, como salida de los distintos procedimientos estadísticos.
Lea también: Guía IVA reducido
Operaciones y Expresiones
Las expresiones sirven para expresar dichos cálculos. Las vamos a usar continuamente, pues el objeto de usar un ordenador suele ser realizar cálculos. Las expresiones aritméticas expresan cálculos numéricos. Como hemos visto, pueden usarse en asignaciones. El resultado de evaluar la expresión es lo que se asigna a la variable. Las expresiones de ejemplo previas incluyen un único operador. Sin embargo, una expresión puede incluir más de un operador. Las reglas de precedencia indican el orden en que se aplican los operadores. La asociatividad de un operador se usa cuando aparece más de una vez seguida un operador, y sirve para determinar si el operador se aplica de izquierda a derecha o de derecha a izquierda. Todos los operadores de la lista son binarios, es decir, tiene dos operandos, salvo los operadores + y -. Estos tienen una versión binaria (para sumar y restar) y una versión unaria (para indicar el signo).
En programación se usa con gran asiduidad las operaciones lógicas, también conocidas como booleanas. Una operación lógica es aquella que produce un valor de verdadero o falso. Una variable como casado o americano, que almacena un valor lógico, es llamada variable lógica o booleana. Se puede abreviar los valores TRUE y FALSE con T y F respectivamente, pero resulta más legible usar los primeros. Los operadores relacionales son binarios y sirven para comparar dos valores. Los operadores lógicos permiten generar expresiones lógicas compuestas a partir de expresiones lógicas simples. Es un operador binario. Produce el valor verdadero si ambos operandos (que son de tipo lógico) son verdaderos, en otro caso produce el valor falso. El operador es &&. Es un operador binario. Produce un valor verdadero si al menos uno de los operandos es verdadero, en otro caso (ambos operandos son falsos) produce el valor falso. El operador es ||. Es un operador unario, es decir, tiene un único operando. Invierte el valor de su operando. Es decir, si el operando vale TRUE produce FALSE, y si el operando vale FALSE produce TRUE.
Las funciones se denotan por function_name(). Una función es invocada facilitándole unos argumentos. En función de los argumentos realiza sus cálculos y devuelve un resultado. R tiene varias formas de especificar los argumentos de una función al ser invocada. Este tipo de invocación es posicional: cada argumento se corresponde con el parámetro que ocupa la misma posición en la cabecera de la función. El valor por defecto de un parámetro significa que si no se especifica ese argumento en la invocación a la función el parámetro tomará dicho valor por defecto. Un valor por defecto se elige de forma que sea el valor más común posible. Afortunadamente, R no obliga a invocar a las funciones con parámetros posicionales. Se puede mezclar invocación posicional con invocación por nombre. Si no usan un nombre de argumento, R supone que están ingresando argumentos en el orden en que se muestran en la página de ayuda o por args. Las cadenas de texto son un tipo especial de dato, con los que obviamente no podremos hacer operaciones aritméticas, pero si podemos hacer operaciones propias de cadenas de texto como puede ser la función paste(). Cuando hemos ejecutado paste() y paste0() estamos ejecutando lo que se conoce como una función: una palabra reservada que representa un conjunto de órdenes encapsuladas, y que se ejecuta a partir de unos argumentos de entrada. La propiedad clave es que la función debe ser vectorizada: debe tomar un vector de valores como input, y devolver un vector con el mismo número de valores como output.
Gestión del Entorno de Trabajo
En la pestaña Environment, del panel superior derecho de RStudio, aparecen por defecto los objetos creados en el Entorno Global o espacio de trabajo, que incluyen las variables que se han creado en la sesión de trabajo. Si intentan obtener el valor de una variable que no está en su espacio de trabajo, recibirán un mensaje de error. Para borrar variables del espacio de trabajo se puede usar la función rm. Si queremos borrar todos los objetos que hemos definido podemos usar la escoba que aparece en la pestaña Environment del panel superior derecho de RStudio. Los valores permanecen en el espacio de trabajo hasta que finalicen sus sesiones o las borren con la función rm. Para guardar un espacio de trabajo, recomendamos el sufijo rda o RData. La función save guarda una serie de variables en un archivo en memoria secundaria (cuyo contenido no se borra al apagar el ordenador). Se listan los nombres de las variables que queremos guardar y el nombre del archivo donde se guardarán los datos. Se suele usar la extensión RData para estos archivos. save.image usa por defecto el nombre de archivo .RData. Cuando leemos datos de un archivo con load se pueden cargar varias variables. Si sólo queremos guardar un objeto en un archivo, se puede usar la función saveRDS.
Lea también: ¿Cómo localizar tus XML del SAT?
