Saltar al contenido principal
LibreTexts Español

4.6: Cosas útiles que debe saber sobre las variables

  • Page ID
    151477
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)\(\newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    En el Capítulo 3 hablé mucho sobre las variables, cómo se asignan y algunas de las cosas que puedes hacer con ellas, pero hay muchas complejidades adicionales. Eso no es una sorpresa claro. No obstante, algunos de esos temas son dignos de llamar su atención ahora. Entonces ese es el objetivo de esta sección; cubrir algunos temas extra. Como consecuencia, esta sección es básicamente un montón de cosas que quiero mencionar brevemente, pero que realmente no encajan en ningún otro lugar. En definitiva, voy a hablar de varios temas diferentes en esta sección, que sólo están vagamente conectados entre sí.

    Valores especiales

    Lo primero que quiero mencionar son algunos de los valores “especiales” que tal vez veas producir R. Lo más probable es que los veas en situaciones en las que esperabas un número, pero hay bastantes otras formas en las que puedes encontrarlos. Estos valores son Inf, NAn, NA y NULL. Estos valores pueden surgir en varios lugares diferentes, por lo que es importante entender lo que significan.

    • Infinito (Inf). El más fácil de los valores especiales de explicar es Inf, ya que corresponde a un valor que es infinitamente grande. También puedes tener -Inf. La forma más fácil de obtener Inf es dividir un número positivo por 0:
    1 / 0
    
    ## [1] Inf

    En la mayoría de las situaciones de análisis de datos del mundo real, si estás terminando con números infinitos en tus datos, entonces algo ha salido mal. Ojalá nunca los tengas que ver.

    • No un Número (NAn). El valor especial de NaN es la abreviatura de “no un número”, y es básicamente una palabra clave reservada que significa “no hay un número definido matemáticamente para esto”. Si puedes recordar tus matemáticas de secundaria, recuerda que es convencional decir que 0/0 no tiene una respuesta adecuada: los matemáticos dirían que 0/0 es indefinido. R dice que no es un número:
     0 / 0
    ## [1] NaN
    

    Sin embargo, todavía se trata como un valor “numérico”. Para simplificar en exceso, NaN corresponde a casos en los que hiciste una pregunta numérica adecuada que realmente no tiene una respuesta significativa.

    • No disponible (NA). NA indica que falta el valor que se “supone” va a almacenar aquí. Para entender lo que esto significa, ayuda a reconocer que el valor de NA es algo que es más probable que veas al analizar datos de experimentos del mundo real. A veces obtienes fallas en los equipos, o pierdes algunos de los datos, o lo que sea. El punto es que parte de la información que estabas “esperando” obtener de tu estudio simplemente falta. Obsérvese la diferencia entre NA y NAn. Para NaN, realmente sabemos lo que se supone que se debe almacenar; es solo que sucede que corresponde a algo así como 0/0 que no tiene ningún sentido en absoluto. En contraste, NA indica que en realidad no sabemos lo que se suponía que debía estar ahí. Falta la información.
    • Sin valor (NULL). El valor NULL lleva este concepto de “ausencia” aún más lejos. Básicamente afirma que la variable realmente no tiene valor alguno. Esto es bastante diferente tanto a NAn como a NA. Para NAn en realidad sabemos cuál es el valor, porque es algo demente como 0/0. Para NA, creemos que se supone que hay un valor “ahí fuera”, pero un perro se comió nuestra tarea y así no sabemos muy bien qué es. Pero para NULL creemos firmemente que no hay ningún valor en absoluto.

    Asignación de nombres a elementos vectoriales

    Una cosa que a veces es un poco insatisfactoria sobre la forma en que R imprime un vector es que los elementos salen sin etiquetar. Esto es a lo que me refiero. Supongamos que tengo datos que reportan las ganancias trimestrales de alguna compañía. Si solo creo un vector sin lujos, tengo que confiar en la memoria para saber qué elemento corresponde a qué evento. Es decir:

    profit <- c( 3.1, 0.1, -1.4, 1.1 )
    profit
    ## [1]  3.1  0.1 -1.4  1.1

    Probablemente puedas adivinar que el primer elemento corresponde al primer cuarto, el segundo elemento al segundo trimestre, y así sucesivamente, pero eso es sólo porque te he contado la historia de fondo y porque esto pasa a ser un ejemplo muy sencillo. En general, puede ser bastante difícil. Aquí es donde puede ser útil asignar nombres a cada uno de los elementos. Así es como lo haces:

    names(profit) <- c("Q1","Q2","Q3","Q4")
    profit
    ##   Q1   Q2   Q3   Q4 
    ##  3.1  0.1 -1.4  1.1

    Se trata de un comando de aspecto un poco extraño, sin duda, pero no es demasiado difícil de seguir. Todo lo que estamos haciendo es asignar un vector de etiquetas (cadenas de caracteres) a nombres (beneficio). Siempre se pueden eliminar los nombres de nuevo utilizando los comandos names (profit) <- NULL. También vale la pena señalar que no tienes que hacer esto como un proceso de dos etapas. Puedes obtener el mismo resultado con este comando:

    profit <- c( "Q1" = 3.1, "Q2" = 0.1, "Q3" = -1.4, "Q4" = 1.1 )
    profit
    ##   Q1   Q2   Q3   Q4 
    ##  3.1  0.1 -1.4  1.1

    Lo importante a notar es que (a) esto hace que las cosas sean mucho más fáciles de leer, pero (b) los nombres en la parte superior no son los datos “reales”. El valor de la ganancia [1] sigue siendo 3.1; todo lo que he hecho es agregar un nombre a la ganancia [1] también. Sin embargo, los nombres no son puramente cosméticos, ya que R permite extraer elementos particulares del vector haciendo referencia a sus nombres:

    profit["Q1"]
    ##  Q1 
    ## 3.1

    Y si alguna vez necesito sacar los nombres ellos mismos, entonces solo tecleo nombres (ganancia).

    Clases variables

    Como hemos visto, R permite almacenar diferentes tipos de datos. En particular, las variables que hemos definido hasta ahora han sido datos de caracteres (texto), datos numéricos o datos lógicos. 56 Es importante que recordemos qué tipo de información almacena cada variable (y aún más importante que R recuerde) ya que diferentes tipos de variables permiten hacerles cosas diferentes. Por ejemplo, si tus variables tienen información numérica en ellas, entonces está bien multiplicarlas juntas:

    x <- 5   # x is numeric
    y <- 4   # y is numeric
    x * y   
    ## [1] 20

    Pero si contienen datos de caracteres, la multiplicación no tiene ningún sentido, y R se quejará si intentas hacerlo:

    x <- "apples"   # x is character
    y <- "oranges"  # y is character
    x * y 
    ## Error in x * y: non-numeric argument to binary operator
    

    Incluso R es lo suficientemente inteligente como para saber que no se pueden multiplicar “manzanas” por “naranjas”. Esto lo sabe porque las comillas son indicadores de que la variable se supone que debe tratarse como texto, no como un número.

    Esto es bastante útil, pero fíjate que significa que R hace una gran distinción entre 5 y “5". Sin comillas, R trata al 5 como el número cinco, y te permitirá hacer cálculos con él. Con las comillas, R trata “5" como el carácter textual cinco, y no lo reconoce como un número más de lo que reconoce “p” o “cinco” como números. Como consecuencia, hay una gran diferencia entre escribir x <- 5 y escribir x <- “5". En el primero, estamos almacenando el número 5; en el segundo, estamos almacenando el carácter “5". Así, si tratamos de hacer multiplicación con las versiones de caracteres, R se pone stroppy:

    x <- "5"   # x is character
    y <- "4"   # y is character
    x * y     
    ## Error in x * y: non-numeric argument to binary operator

    Bien, supongamos que he olvidado qué tipo de datos almacené en la variable x (que sucede deprimentemente a menudo). R proporciona una función que nos permitirá averiguarlo. O, más precisamente, proporciona tres funciones: class (), mode () y typeof (). ¿Por qué diablos proporciona tres funciones, tal vez te lo estés preguntando? Básicamente, porque R realmente realiza un seguimiento de tres tipos diferentes de información sobre una variable:

    1. La clase de una variable es una clasificación de “alto nivel”, y captura distinciones psicológicamente (o estadísticamente) significativas. Por ejemplo “2011-09-12" y “mi cumpleaños” son ambas cadenas de texto, pero hay una diferencia importante entre las dos: una de ellas es una fecha. Entonces sería bueno si pudiéramos conseguir que R reconozca que “2011-09-12" es una fecha, y permitirnos hacer cosas como sumar o restar de ella. La clase de una variable es lo que R usa para hacer un seguimiento de cosas así. Debido a que la clase de una variable es crítica para determinar lo que R puede o no puede hacer con ella, la función class () es muy útil.
    2. El modo de una variable se refiere al formato de la información que almacena la variable. Te dice si R tiene datos de texto almacenados o datos numéricos, por ejemplo, lo cual es algo útil, pero solo hace estas distinciones “simples”. Puede ser útil conocerlo, pero no es lo principal que nos importa. Entonces no voy a usar mucho la función mode (). 57
    3. El tipo de una variable es una clasificación de muy bajo nivel. No lo usaremos en este libro, pero (para aquellos de ustedes que se preocupan por estos detalles) aquí es donde pueden ver la distinción entre datos enteros, numéricos de doble precisión, etc. A casi ninguno de ustedes realmente le importará esto, así que ni siquiera me voy a molestar en demostrar la función typeof ().

    Para propósitos, es la clase () de la variable que más nos importa. Más adelante, hablaré un poco sobre cómo se puede convencer a R de “coaccionar” a una variable para que cambie de una clase a otra (Sección 7.10). Esa es una habilidad útil para el análisis de datos del mundo real, pero no es algo que necesitemos en este momento. Mientras tanto, los siguientes ejemplos ilustran el uso de la función class ():

    x <- "hello world"     # x is text
    class(x) 
    ## [1] "character"
    x <- TRUE     # x is logical 
    class(x)
    
    ## [1] "logical"
    x <- 100     # x is a number
    class(x)
    
    ## [1] "numeric"

    Emocionante, ¿no?


    This page titled 4.6: Cosas útiles que debe saber sobre las variables is shared under a CC BY-SA 4.0 license and was authored, remixed, and/or curated by Danielle Navarro via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.