Generar secuencias númericas puede parece trivial, sin embargo es una de las tareas que conforme hacemos arreglo de datos previo a un análisis, toma relevancia.

Se usa desde la creación de datasets de ejemplos hasta generar un ID para procesar un conjunto de datos.

El operador :

El operador binario : permite generar secuencias rápida y fácilmente cuando los elementos a los lados son números.

Nota: El comportamiento cambia cuando se involucran factores pues nos da las interacciones entre los factores.

Por ejemplo:

1:10
 [1]  1  2  3  4  5  6  7  8  9 10

También permite generar secuencias negativas:

-1:-10
 [1]  -1  -2  -3  -4  -5  -6  -7  -8  -9 -10

Puede ir a la inversa:

-10:-1
 [1] -10  -9  -8  -7  -6  -5  -4  -3  -2  -1

Admite constantes incluidas en R

pi:10
[1] 3.141593 4.141593 5.141593 6.141593 7.141593 8.141593 9.141593

Sin embargo este operador no permite generar secuencias que tengan un crecimiento/decremento diferente de 1.

Comando seq()

Este comando permite generar secuencias de números usando varios argumentos, los primeros son from, to y by.

seq(from = 1, to = 10)
 [1]  1  2  3  4  5  6  7  8  9 10

Como esta función acepta los argumentos posicionalmente, se pueden omitir las etiquetas

seq(1, 10)
 [1]  1  2  3  4  5  6  7  8  9 10

Para cambiar la magnitud del crecimiento/decremento usamos el argumento by:

seq(from = 1, to = 10, by = 3)
[1]  1  4  7 10

Puede generar secuencias de decimales:

seq(0.1, 3, 0.3)
 [1] 0.1 0.4 0.7 1.0 1.3 1.6 1.9 2.2 2.5 2.8

Usar constantes del lenguaje:

seq(pi, 3 * pi, pi)
[1] 3.141593 6.283185 9.424778

También se puede usar negativos:

seq(-1, -10, -4)
[1] -1 -5 -9

O secuencias con decremento:

seq(10, 1, -3)
[1] 10  7  4  1

Nota: Es importante recalcar que el argumento by cuando se usan negativos o secuencias en decremento, requiere un número negativo. Esto guarda su lógica en la magnitud del crecimiento/decremento.

Comandos similares

Ademas R cuenta con comandos similares que simplifican la generación de secuencias

  • seq_along() que permite generar secuencias con base a un vector
  • seq_len() permite generar una secuencia de una longitud específica

seq_len() se usa:

seq_len(10)
 [1]  1  2  3  4  5  6  7  8  9 10

Y seq_along() requiere de un vector por ejemplo usando las letras:

letters
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"

Podemos generar la secuencia para las mismas:

seq_along(letters)
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

Comando extra rep()

Este comando no genera secuencias por sí mismo, pero es de gran útilidad para crear secuencias complejas.

Por ejemplo como crear secuencias del 1 al 9 de 3 en 3 repetido 3 veces:

rep(seq(1, 9, 3), 3)
[1] 1 4 7 1 4 7 1 4 7

Sin embargo una secuencia que generamos recurrentemente es aquella que se genera repitiendo los números de la secuencia un n número de veces, por ejemplo:

rep(seq(1, 9, 3), each = 3)
[1] 1 1 1 4 4 4 7 7 7

Ejemplos

Por ejemplo podemos generar un vector de identificadores para medidas repetidas 3 veces para los sujetos 3, 6, 9 y 12 que pertenecen a los grupos A, B, C y D.

rep(paste0(letters[1:4], seq(3, 12, 3)), each = 3)
 [1] "a3"  "a3"  "a3"  "b6"  "b6"  "b6"  "c9"  "c9"  "c9"  "d12" "d12" "d12"

Nota: R tiene algunas constantes integradas como pi, letters o LETTERS que permiten usar estos elementos sin escribirlos. Ademas el comando paste0 permite pegar sin espacios, números o letras.

Podemos crear un data.frame para 100 números aleatorios, con un identificador que los agrupe de cinco en cinco:

# Generamos números aleatorios
numeros.aleatorios <- sample(100)
numeros.aleatorios
  [1]  81  22  23  88  45  41  34  35  69   5  58  50  43  94  27  37  48  60  16  36  77  44  12  42  68  38  49  83  89  63  90   7
 [33] 100  10  62  80   8  39  15  74  31  61  30  24   2  33  93  66  11  40  56  51  78  47   6   3  75  96  20  29  53  95  64  17
 [65]  92  65  54  99  21  82  46  98  19  52  76  97  32  26  28   9  55   4  84  59  14  79  73  70  67  86  18   1  72  87  71  85
 [97]  13  25  57  91

Y creamos el data.frame:

data.frame(id = rep(seq(1, 20), each = 5), aleatorios = numeros.aleatorios)
LS0tCnRpdGxlOiAiU2VjdWVuY2lhcyBOdW1lcmljYXMiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKICAgIHRoZW1lOiBzYW5kc3RvbmUKICAgIGluY2x1ZGU6CiAgICAgIGFmdGVyX2JvZHk6IGRpc3F1c19pbnNlcnQuaHRtbAogICAgY3NzOiBjdXN0b20uY3NzCi0tLQoKR2VuZXJhciBzZWN1ZW5jaWFzIG7Dum1lcmljYXMgcHVlZGUgcGFyZWNlIHRyaXZpYWwsIHNpbiBlbWJhcmdvIGVzIHVuYSBkZSBsYXMgdGFyZWFzIHF1ZSBjb25mb3JtZSBoYWNlbW9zIGFycmVnbG8gZGUgZGF0b3MKcHJldmlvIGEgdW4gYW7DoWxpc2lzLCB0b21hIHJlbGV2YW5jaWEuIAoKU2UgdXNhIGRlc2RlIGxhIGNyZWFjacOzbiBkZSBkYXRhc2V0cyBkZSBlamVtcGxvcyBoYXN0YSBnZW5lcmFyIHVuIGBJRGAgcGFyYSBwcm9jZXNhciB1biBjb25qdW50byBkZSBkYXRvcy4KCgojIyBFbCBvcGVyYWRvciBgOmAKCkVsIG9wZXJhZG9yIGJpbmFyaW8gYDpgIHBlcm1pdGUgZ2VuZXJhciBzZWN1ZW5jaWFzIHLDoXBpZGEgeSBmw6FjaWxtZW50ZSBjdWFuZG8gbG9zIGVsZW1lbnRvcyBhIGxvcyBsYWRvcyBzb24gbsO6bWVyb3MuIAoKPioqTm90YToqKgpFbCBjb21wb3J0YW1pZW50byBjYW1iaWEgY3VhbmRvIHNlIGludm9sdWNyYW4gZmFjdG9yZXMgcHVlcyBub3MgZGEgbGFzIGludGVyYWNjaW9uZXMgZW50cmUgbG9zIGZhY3RvcmVzLiAgCgpQb3IgZWplbXBsbzoKCmBgYHtyfQoxOjEwCmBgYAoKVGFtYmnDqW4gcGVybWl0ZSBnZW5lcmFyIHNlY3VlbmNpYXMgbmVnYXRpdmFzOgoKYGBge3J9Ci0xOi0xMApgYGAKClB1ZWRlIGlyIGEgbGEgaW52ZXJzYToKCmBgYHtyfQotMTA6LTEKYGBgCgpBZG1pdGUgY29uc3RhbnRlcyBpbmNsdWlkYXMgZW4gYFJgCgpgYGB7cn0KcGk6MTAKYGBgCgpTaW4gZW1iYXJnbyBlc3RlIG9wZXJhZG9yIG5vIHBlcm1pdGUgZ2VuZXJhciBzZWN1ZW5jaWFzIHF1ZSB0ZW5nYW4gdW4gKipjcmVjaW1pZW50by9kZWNyZW1lbnRvKiogZGlmZXJlbnRlIGRlIDEuCgojIyBDb21hbmRvIGBzZXEoKWAKCkVzdGUgY29tYW5kbyBwZXJtaXRlIGdlbmVyYXIgc2VjdWVuY2lhcyBkZSBuw7ptZXJvcyB1c2FuZG8gdmFyaW9zIGFyZ3VtZW50b3MsIGxvcyBwcmltZXJvcyBzb24gYGZyb21gLCBgdG9gIHkgYGJ5YC4gCgoKYGBge3J9CnNlcShmcm9tID0gMSwgdG8gPSAxMCkKYGBgCgpDb21vIGVzdGEgZnVuY2nDs24gYWNlcHRhIGxvcyBhcmd1bWVudG9zICoqcG9zaWNpb25hbG1lbnRlKiosIHNlIHB1ZWRlbiBvbWl0aXIgbGFzIGV0aXF1ZXRhcwoKYGBge3J9CnNlcSgxLCAxMCkKYGBgCgpQYXJhIGNhbWJpYXIgbGEgbWFnbml0dWQgZGVsICoqY3JlY2ltaWVudG8vZGVjcmVtZW50byoqIHVzYW1vcyBlbCBhcmd1bWVudG8gYGJ5YDoKCmBgYHtyfQpzZXEoZnJvbSA9IDEsIHRvID0gMTAsIGJ5ID0gMykKYGBgCgpQdWVkZSBnZW5lcmFyIHNlY3VlbmNpYXMgZGUgZGVjaW1hbGVzOgoKYGBge3J9CnNlcSgwLjEsIDMsIDAuMykKYGBgCgpVc2FyIGNvbnN0YW50ZXMgZGVsIGxlbmd1YWplOgoKYGBge3J9CnNlcShwaSwgMyAqIHBpLCBwaSkKYGBgCgoKVGFtYmnDqW4gc2UgcHVlZGUgdXNhciBuZWdhdGl2b3M6CgpgYGB7cn0Kc2VxKC0xLCAtMTAsIC00KQpgYGAKCk8gc2VjdWVuY2lhcyBjb24gZGVjcmVtZW50bzoKCmBgYHtyfQpzZXEoMTAsIDEsIC0zKQpgYGAKCj4qKk5vdGEqKjoKRXMgKippbXBvcnRhbnRlKiogcmVjYWxjYXIgcXVlIGVsIGFyZ3VtZW50byBgYnlgIGN1YW5kbyBzZSB1c2FuIG5lZ2F0aXZvcyBvIHNlY3VlbmNpYXMgZW4gZGVjcmVtZW50bywgcmVxdWllcmUgdW4gbsO6bWVybwpuZWdhdGl2by4gRXN0byBndWFyZGEgc3UgbMOzZ2ljYSBlbiBsYSBtYWduaXR1ZCBkZWwgKipjcmVjaW1pZW50by9kZWNyZW1lbnRvKiouCgojIyBDb21hbmRvcyBzaW1pbGFyZXMKCkFkZW1hcyAqKlIqKiBjdWVudGEgY29uIGNvbWFuZG9zIHNpbWlsYXJlcyBxdWUgc2ltcGxpZmljYW4gbGEgZ2VuZXJhY2nDs24gZGUgc2VjdWVuY2lhcwoKLSBgc2VxX2Fsb25nKClgIHF1ZSBwZXJtaXRlIGdlbmVyYXIgc2VjdWVuY2lhcyBjb24gYmFzZSBhIHVuIHZlY3RvcgotIGBzZXFfbGVuKClgIHBlcm1pdGUgZ2VuZXJhciB1bmEgc2VjdWVuY2lhIGRlIHVuYSBsb25naXR1ZCBlc3BlY8OtZmljYQoKYHNlcV9sZW4oKWAgc2UgdXNhOgoKYGBge3J9CnNlcV9sZW4oMTApCmBgYAoKWSBgc2VxX2Fsb25nKClgIHJlcXVpZXJlIGRlIHVuIHZlY3RvciBwb3IgZWplbXBsbyB1c2FuZG8gbGFzIGxldHJhczoKCmBgYHtyfQpsZXR0ZXJzCmBgYAoKUG9kZW1vcyBnZW5lcmFyIGxhIHNlY3VlbmNpYSBwYXJhIGxhcyBtaXNtYXM6CgpgYGB7cn0Kc2VxX2Fsb25nKGxldHRlcnMpCmBgYAoKIyMgQ29tYW5kbyBleHRyYSBgcmVwKClgCgpFc3RlIGNvbWFuZG8gbm8gZ2VuZXJhIHNlY3VlbmNpYXMgcG9yIHPDrSBtaXNtbywgcGVybyBlcyBkZSBncmFuIMO6dGlsaWRhZCBwYXJhIGNyZWFyIHNlY3VlbmNpYXMgY29tcGxlamFzLiAKClBvciBlamVtcGxvIGNvbW8gY3JlYXIgc2VjdWVuY2lhcyBkZWwgMSBhbCA5IGRlIDMgZW4gMyByZXBldGlkbyAzIHZlY2VzOgoKYGBge3J9CnJlcChzZXEoMSwgOSwgMyksIDMpCmBgYAoKU2luIGVtYmFyZ28gdW5hIHNlY3VlbmNpYSBxdWUgZ2VuZXJhbW9zIHJlY3VycmVudGVtZW50ZSBlcyBhcXVlbGxhIHF1ZSBzZSBnZW5lcmEgIHJlcGl0aWVuZG8gbG9zIG7Dum1lcm9zIGRlIApsYSBzZWN1ZW5jaWEgdW4gYG5gIG7Dum1lcm8gZGUgdmVjZXMsIHBvciBlamVtcGxvOgoKYGBge3J9CnJlcChzZXEoMSwgOSwgMyksIGVhY2ggPSAzKQpgYGAKCiMjIEVqZW1wbG9zCgpQb3IgZWplbXBsbyBwb2RlbW9zIGdlbmVyYXIgdW4gdmVjdG9yIGRlIGlkZW50aWZpY2Fkb3JlcyBwYXJhIG1lZGlkYXMgcmVwZXRpZGFzIDMgdmVjZXMgcGFyYSBsb3Mgc3VqZXRvcyAzLCA2LCA5IHkgMTIKcXVlIHBlcnRlbmVjZW4gYSBsb3MgZ3J1cG9zIEEsIEIsIEMgeSBELgoKYGBge3J9CnJlcChwYXN0ZTAobGV0dGVyc1sxOjRdLCBzZXEoMywgMTIsIDMpKSwgZWFjaCA9IDMpCmBgYAoKPioqTm90YSoqOgpSIHRpZW5lIGFsZ3VuYXMgY29uc3RhbnRlcyBpbnRlZ3JhZGFzIGNvbW8gYHBpYCwgYGxldHRlcnNgIG8gYExFVFRFUlNgIHF1ZSBwZXJtaXRlbiB1c2FyIGVzdG9zIGVsZW1lbnRvcyBzaW4gZXNjcmliaXJsb3MuCkFkZW1hcyBlbCBjb21hbmRvIHBhc3RlMCBwZXJtaXRlIF9wZWdhcl8gc2luIGVzcGFjaW9zLCBuw7ptZXJvcyBvIGxldHJhcy4KClBvZGVtb3MgY3JlYXIgdW4gYGRhdGEuZnJhbWVgIHBhcmEgMTAwIG7Dum1lcm9zIGFsZWF0b3Jpb3MsIGNvbiB1biBpZGVudGlmaWNhZG9yIHF1ZSBsb3MgYWdydXBlIGRlIGNpbmNvIGVuIGNpbmNvOgoKYGBge3J9CiMgR2VuZXJhbW9zIG7Dum1lcm9zIGFsZWF0b3Jpb3MKbnVtZXJvcy5hbGVhdG9yaW9zIDwtIHNhbXBsZSgxMDApCm51bWVyb3MuYWxlYXRvcmlvcwpgYGAKClkgY3JlYW1vcyBlbCBkYXRhLmZyYW1lOgoKYGBge3J9CmRhdGEuZnJhbWUoaWQgPSByZXAoc2VxKDEsIDIwKSwgZWFjaCA9IDUpLCBhbGVhdG9yaW9zID0gbnVtZXJvcy5hbGVhdG9yaW9zKQpgYGAK