Números aleatorios en R utilizando las funciones sample y runif

La obtención de números aleatorios es en muchas ocasiones un requerimiento esencial en investigación científica. Proceder de este modo puede reducir cualquier sesgo generado por nuestra persona a la hora de seleccionar una muestra, con la consecuente eliminación de sospechas a la hora de seleccionar una muestra u otra.

¿Que no sabéis de lo que hablo? Imaginaros por un momento que tenemos que seleccionar 10 ejemplares para evaluar una hipótesis. ¿Cómo pueden estar seguros los revisores del artículo científico y/o los lectores del mismo que la selección ha sido hecha en base a argumentos empíricos y no a argucias destinadas a seleccionar aquellos individuos que justifiquen nuestra hipótesis? Pues bien, una posible solución es obtener números aleatorios. Y en R es muy sencillo obtener números aleatorios.

Es necesario que os mencione, antes de entrar en faena programando R, que existen dos funciones concretas para generar números aleatorios en R. Si queremos obtener aleatoriamente números enteros, tendremos que usar la función sample. Por el contrario, si lo que deseamos son números racionales (es decir, que tengan decimales), tendremos que ejecutar la función runif. Pero no os preocupés porque vamos a verlos en detenimiento a continuación.

Más importante si cabe es que la ejecución de las dos funciones que aprenderemos en esta entrada darán un conjunto de números aleatorios que estarán uniformemente distribuidos en el intervalo que hayamos marcado. Esta es una característica fundamental que tenemos que considerar, ya que si quisiéramos generar números aleatorios que se adaptaran a un tipo concreto de distribución, como podría ser la distribución normal, ya no estarían distribuidos de un modo equitativo en el intervalo especificado.

Función sample de R para generar números aleatorios enteros

Vamos a comenzar primero con los números enteros, esto es, números que no continenen decimales. Con una simple función de R vamos a ver cómo obtener sus números aleatorios. Esta función se llama sample, y se encuentra localizada dentro del paquete base de R. Pero vamos a verlo con un ejemplo primero, para explicar a continuación qué significa y cómo podemos modificarlo para adaptarlo a nuestros intereses:

sample(1:30,10,replace=F)
[1] 5 3 19 10 28 4 11 23 16 22

Desgranemos los atributos del comando sample:

  • 1:30 = significa que el intervalo de datos va a estar comprendido entre ambos números (1 y 30 inclusive).
  • 10 = significa el número de números aleatorios que quieres salgan del intervalo anterior.
  • replace=F/T = si quieres que puedan repetirse los números aleatorios (es decir, obtener por ejemplo dos números 3), dejamos el valor T (true). Si no queremos repetición, ponemos el valor F (false).
Ejemplo 1. Obtener 4 números aleatorios con repetición en el intervalo 1 - 10
Ejemplo 2. Obtener 10 números aleatorios sin repetición en el intervalo 50 - 100.

 

Función runif de R para generar números aleatorios racionales

Como hemos visto, la función anterior sample no permite obtener números decimales. ¿Qué pasa si queremos obtener también números con decimales? Pues como ya sabéis, esto se puede conseguir con la función runif de R. Esta función está incluida dentro del paquete de R llamado stats. Vamos a verlo igualmente en acción con un ejemplo para estudiarlo en profundidad después:

 runif(5, min=3, max=4)
[1] 3.537344 3.629892 3.362016 3.860888 3.930647 

Igual que con la función sample, la función runif se compone de tres atributos:

  • 5 = es el número de números decimales que queremos generar aleatoriamente. En este caso queremos que nos devuelva 5 números aleatoriamente seleccionados.
  • min=3 y max=4 representan el intervalo de donde se van a extraer los números aleatorios en R. En nuestro ejemplo, nuestros números aleatorios estarán comprendidos entre el 3 y el 4. Es importante mencionar que no es obligatorio poner min= y max= en nuestra función. Si los omitiéramos como se ve a continuación seguirían extrayéndose los números aleatorios del intervalo marcado.
 runif(5, 3, 4)

Lo importante es mantener el orden de los atributos, siendo el primer valor el número de números aleatorios que queremos, el segundo el valor mínimo del intervalo, y el tercero el valor máximo del mismo.

Un comentario sobre los números aleatorios obtenidos al ejecutar las funciones en R

La ejecución de cada una de las funciones anteriores (sample o runif) de modo continuo, sucesivo y repetitivo nos dará, obviamente, un conjunto de números aleatorios siempre diferentes. Veámoslo ejecutando 6 veces de la función sample con los mismos atributos:

sample(1:50,10,replace=F)
[1] 12 39 4 29 5 3 14 1 25 40
sample(1:50,10,replace=F)
[1] 6 32 28 27 47 40 22 17 36 14
sample(1:50,10,replace=F)
[1] 14 23 47 13 44 45 36 11 49 34
sample(1:50,10,replace=F)
[1] 19 7 39 41 18 5 42 2 45 34
sample(1:50,10,replace=F)
[1] 8 35 6 34 12 25 47 24 28 39
sample(1:50,10,replace=F)
[1] 24 27 31 13 48 12 26 42 2 21

10 comentarios en “Números aleatorios en R utilizando las funciones sample y runif

  1. Hola Buenas,

    ¿Se puede usar esta función y además añadir que tenga una media y desviación estandar concretas?
    O existe alguna otra función para generar datos aleatorios con una media y desviación estandar concretas, pero que solo utilize los números que tu le pases?

    • Hola Mario, por supuesto que se puede. Supónte que quieres 20 datos que tengan una media de 10 y desviación estándar de 3, y que siga una distribución normal. Simplemente ejecuta rnorm(mean=10, sd=3, n=20). Et voilà!

  2. Hola buenas,

    Pero no quiero que siga ninguna distribución, sino que simplemente sean aleatorios. Es decir algo como sample(1:4,100,replace=T) y además añadir a esta función que sea (mean=3, sd=2).

    Es que con la función rnorm no le puedo indicar que sólo me utilice valores comprendidos entre 1 y 4, o por lo menos yo no sé especificarlo.

    • Hola Mario. Hasta lo que yo sé, debes especificar una media y desviación estándar para un tipo de distribución concreto. Teniendo en cuenta que en la distribución normal, media, mediana y moda coinciden, lo que tú propones en tu ejemplo no se ajustaría a priori a esta distribución. Deberías buscar cuál es tu modelo y obtener los datos aleatorios ajustados a esa media y desviación.

  3. Pregunta, que comando debo usar si necesito hacer un muestreo aleatorio de numeros pero tengo diferentes variables? es que tenemos una base muestral muy grande (948 datos) y la idea es sacar 100 datos aleatorios de nuestras 4 variables, como hago para que no se mezclen? tenemos mamiferos, localidad, peso y longitud.

    • Hola Nathaly. No entiendo muy bien tu pregunta, pero me puedo hacer una idea de lo que quieres preguntarme (corrígeme si me equivoco). Tienes 4 variables, que se han medido sobre 948 individuos. Y quieres seleccionar 100 individuos aleatoriamente de esos 948. Si es así lo que quieres, y que no tengan repetición, deberías hacer lo siguiente: 1) crear una nueva variable con los números correlativos de 1 a 948, que actuará como ID de cada individuo, 2) luego ejecutas el siguiente comando: sample(1:948,10,replace=F). Y listo.

Deja un comentario

*