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

La obtención de números aleatorios en R, o en otros ambientes, 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.

En nuestra página estamos enamorados de R. Por lo que no solo encontrarás artículos sobre números aleatorios aplicados a factores o listas, sino también sobre crear intervalos de predicción con ggplot2, intervalos de confianza, y un largo etcétera. Si quieres ver todo lo que publicamos sobre R, te invitamos a verlo…

Quiero leer...

¿Qué funciones hay?

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éis 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.

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

Función sample() de R para generar números enteros de modo aleatorio

Vamos a comenzar primero con los números enteros, esto es, números que no contienen 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
sample(1:10,4,replace=T) 
[1] 5 5 4 1

Es importante destacar que el hecho de que puedan repetirse números aleatorios (replace=T), no implica que siempre vayan a aparecer duplicados o repetidos.

Ejemplo 2. Obtener 10 números aleatorios sin repetición en el intervalo 50 - 100.
sample(50:100,10,replace=F) 
[1] 76 88 67 78 95 66 94 62 64 58

Función runif() de R para generar números racionales aleatoriamente

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 final: los resultados son todos diferentes

La ejecución de cada una de las funciones anteriores [sample() o runif()] de un modo repetitivo nos dará, obviamente, un conjunto de números aleatorios siempre diferentes. Vamos a verlo 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

32 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?

    Responder
    • 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à!

      Responder
  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.

    Responder
    • 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.

      Responder
  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.

    Responder
    • 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.

      Responder
      • Hola vivaelsoftwarelibre, yo también necesito más o menos lo que pidió Nathaly, y si no me equivoco, es que tenemos una base de datos por ejemplo con 5 variables y 900 observaciones de cada una de ellas, y necesitamos que aleatoriamente nos den por ejemplo 100 observaciones.
        con la sintaxis que has puesto, a mi por lo menos no me sale, ¿qué debo de hacer?
        Gracias
        Un saludo

        Responder
        • Hola Laury,
          Pues mi respuesta puede ser similar. En tu lugar, haría una sexta columna dando un número de 1 a 900, así cada observación va asociado a un número concreto y único. Después ejecutaría el comando sample(1:900,100,replace=F). De este modo le estoy diciendo que me dé 100 números aleatorios (sin repetición) entre el 1 y el 900. Y como cada observación ya tiene su número único, ya sabes cuáles son las 100 observaciones aleatorias de tu base de datos. ¡Espero que te sirva!

          Responder
  4. Hola necesito ayuda estoy atrancada con mi código,
    mi código va aplicado a un excel que he exportado a R studio, lo que quiero hacer es calcular un test a una serie de datos pero previamente a eso quiero que los datos estén desordenados. Necesito crear un vector vacío de salida y tambien un bucle que haga lo siguiente: mientras que en la lista original de puntos tenga un elemento, extraiga un numero aleatorio, lo borre de la lista original y lo inserte en la lista de salida para luego aplicar el test a esa lista. Estoy un poco pérdida la verdad porque soy novata en este programa si alguien me pudiese echar una mano se lo agradecería.

    Muchas gracias
    Un saludo

    Responder
  5. Muchas Gracias Tigre!!!
    Una pregunta:
    ¿Cual sería el comando para generar 40 números, que estén en un rango de 1 a 10 y que solo se repita 4 veces cada número?

    Responder
  6. Hola, excelente post.

    Tengo una duda, ¿es posible (y si es así, como?) obtener pares de números aleatorios de un rango de números dados?

    Saludos

    Responder
    • Yo diría que ejecutando sucesivamente el código en el que le dices que obtengas solo 2 números aleatorios cada vez. Otra opción sería utilizar las funciones apply para repetir procesos en modo loop.

      Responder
  7. Hola! Gran iniciativa la página!

    Quería saber si alguien sabe cómo generar un remuestreo de un número menor o igual de «X» cambios en un vector. Ejemplo, tengo un vector que se llama «Selva» (de 10 posiciones) siendo de unos y ceros que reflejan presencia ausencia de especies: (0, 1, 0, 0, 0, 0, 1, 1, 1, 0). Lo que quiero es que me cambie 3 valores (o menos) al azar y que guarde el vector entero (de 10 posiciones) con otro nombre, por ejemplo «Selva2». He probado con este código: Selva2 <- as.vector(sample(Selva, 3, replace=T)), pero lo que me genera es un vector de sólo tres cambios en los que me indica la posición en los que se han producido los cambios (también he probado sin "as.vector" y el resultado es el mismo).

    Selva2 queda tal que así:

    x3 x7 x8
    1 0 0

    y me gustaría que quedara tal que así:

    x1 x2 x3 x4 x5 x6 x7 x8 x9 x10
    0 1 1 0 0 0 0 0 1 0

    También me gustaría poder decirle que el número total de unos no sea mayor al de la muestra original, en este caso como máximo 4 unos.

    Gracias!!

    Responder
  8. Buenas,

    Estaría necesitando poder sortear las coordenadas de un vector con 2 elementos, respetando determinada lógica. Por ejemplo, si el primero de los valores del vector es igual a 1, entonces el 2do debe de ser mayor a 1.

    Responder
  9. Es posible que los datos que se generan aleatoriamente estén en una columna en vez de una fila y luego puedan usarse para hacer histogramas, calcular medias, etc?

    Responder
    • Hola José, lo que se obtiene es un vector. Si haces hist(sample(1:50,10,replace=F)) o mean(sample(1:50,10,replace=F)), puedes generar un histograma y calcular la media directamente. Si quieres convertirlo a un data frame puedes emplear as.data.frame(sample(1:50,10,replace=F)).

      Responder
  10. Fantástico, Gracias!. Si. Lo que quería era crear un data frame. Yendo un poco más allá, es posible usar esta función y crear un conjunto de datos entre dos valores y ademas decirle cual debe ser su media y desviación típica? o ya eso es mucho pedir. Porque con las funciones para generar datos aleatorios de una distribución, por ejemplo la normal puedes decirle con que media y desviación pero no puede poner limites al mínimo y máximo. Al menos con R-Commander, que es el que yo uso. Un ejemplo, quiero numeros aleatorios entre 1 y 50 que tengan una media de 18 con una disviación de 5.
    Un saludos

    Responder
  11. Hola, yo necesito hacer un ejercicio como por ejemplo : sacar 200 muestras aleatorias, cada una de tamaño 10, pero debe ser con la función rnorm, me podría colaborar… se lo agradezco….

    Responder
  12. hola vivaelsoftwarelibre!! gracias por su ayuda, tengo una pregunta: como puedo extender la dimensión de la función runif, si por defecto es 1000, ¿podría llevarla por ejemplo a 20000?

    Responder
  13. Gracias me fue de mucha ayuda, una consulta es posible que al ejecutar varias veces la función con los mismos atributos el conjunto de aleatorios generados sean iguales cada ves

    Responder
  14. ¿Con qué código puedo generar mil números aleatorios sin ocupar las funciones «sample» ni «runif»? y ¿Con qué prueba puedo comprobar que efectivamente los mil números obtenidos son aleatorios?

    Responder
  15. Buenas tardes, excelente video me ayudo mucho

    Quisiera hacer una consulta
    Tengo una base de datos con 4 columnas (A-D) y datos en porcentaje de presencia en cada uno, tengo 50 filas que cada una suma 100%, así:

    A B C D
    0 0 50 50
    10 0 60 30
    0 50 10 40

    Quiero generar 50 filas aleatorias que basen su calculo en las 50 que ya tengo y que también sumen 100% cada una

    Como podría lograr ello?, intente calculando la media y desviación estándar pero la generación no me da lo que requiero

    Agradecere su ayuda

    Saludos

    Responder
  16. Hola!
    Muy buena la ayuda… Sin embargo, me gustaría saber si me podrías explicar como hago el procedimiento para una distribución uniforme. Te lo agradecería 🙂

    Responder
  17. Hola bro.
    Muy buen post.
    Paso para preguntar si me puedes ayudar sobre como aplicar este proceso a una distribución uniforme. Te lo agradecería un montón.

    Responder

Deja un comentario