El intérprete

Empecemos usando el intérprete para familiarizarnos con algunas operaciones aritméticas básicas. Todas funcionan del modo en el que uno esperaría.

1 + 1
sqrt(2)
exp(1)
2^3

Lo mismo ocurre con las comparaciones:

1 > 1
0 == log(1)
(1 + 1 == 2) | (1 + 1 == 3)
(1 + 1 == 2) & (1 + 1 == 3)

Podemos asignar valores a un nombre usando el operador de asignación <-. R también acepta = para hacer asignaciones, pero no siempre y además <- es mucho más popular. Por ejemplo, podemos asignar el valor 1 a la variable a, de tal forma que cada vez que llamemos a a obtendremos el valor al que la variable se refiere.

a <- 1
a

Tipos de datos

R ofrece varios tipos de datos. Los más relevantes son: numeric, integer, character, and logical.

1.0 # Numeric
1 # "Integer"
"ab" # Character
TRUE # logical

El # indica un comentario, que puede estar o no al principio de una línea.

R también ofrece constantes lógicas para los valores perdidos (NA), “Not a Number” (NaN) y valores para infinito positivo y negativo (Inf y -Inf):

NA
0/0
1/0

Puedes comprobar el tipo de un objeto usando las funciones is. (“is x an integer?”):

is.numeric(1.0)
is.integer(1)
is.character("ab")
is.logical(FALSE)

Un error común que todos comentemos en algún momento es comprobar que un objeto es NA mediante la comparación con ==.

NA == NA

Hay buenas razones para este tipo de comportamiento. Encuentro esta explicación muy acertada: StackOverflow:

Think of NA as meaning “I don’t know what’s there”. The correct answer to 3 > NA is obviously NA because we don’t know if the missing value is larger than 3 or not. Well, it’s the same for NA == NA. They are both missing values but the true values could be quite different, so the correct answer is “I don’t know.”

Tenemos funciones especiales para comprobar que un objeto es NA:

is.na(NA)

y lo mismo se puede decir de NaN.

is.numeric es una función, y todas las funciones en R funcional del mismo modo. Tienen asociado un nombre seguido de sus argumentos rodeados por paréntesis: any_function(x). A lo largo de las siguientes sesiones veremos y aprenderemos mucho más sobre las funciones en R.

Estructuras de datos

La estructuras más comunes (e intuitivas) son vector, matrix, data.frame y list. Veremos más sobre el data.frame en la siguiente sección.

Un vector contiene datos del mismo tipo (o NA). Los vectores se pueden crear mediante la función c, que puede leerse como “concatenar”.

c(1, 2)
c(1, 2, NA)
c(1, "a") # Atención a cómo el primer elemento cambia de tipo

Hay algunas funciones útiles que nos permiten crear vectores con una estructura particular. Por ejemplo, podemos crear una secuencia usando la función seq:

c(1, 2, 3, 4)
seq(1, 4)
1:4 # Un sinómimo de `seq`

¿Habéis comprobado cómo hemos usado una función con dos argumentos? Es quizás un buen momento para echar un vistazo a la documentación y ver más información sobre las función seq usando ?seq

La estructura matrix es, como esperaríamos, una matriz: una tabla rectangular de elementos del mismo tipo.

A <- matrix(c(1, 2, 3, 4), nrow=2, ncol=2)
A

Parad un momento para entender qué hemos hecho. Hemos tomado un objeto del tipo vector y hemos rellenado la matriz en un orden concreto pasando las dimensiones que queremos usar para transformar el vector. Quizás resulte poco intuitivo, pero si lo pensáis tiene sentido: una matrix de una sola dimensión no es un vector.

Las operaciones en matrices funcionan “más o menos” como uno esperaría:

B <- matrix(c(4, 3, 2, 1), nrow=2)
A * B
A %*% B

Comprobad que la primera operación ocurre a nivel de elementos, mientras que la segunda es la multiplicación matricial habitual. También tenemos operadores comunes para extraer la diagonar (que es un vector) o para calcular la inversa:

t(A)
diag(A)
solve(A) # pero A^-1...

Una list es una colección ordenada de objetos, posiblemente de tipos diferentes.

list("first"=c(1, 2, 3), "second"=c("a", "b"), "third"=matrix(NA, ncol=2, nrow=2))

Las listas juegan un papel fundamental en R y las usaremos constantemente.

Índices

Los índices nos permiten acceder a los elementos de un vector o matrix a través de su posicíon en el objeto:

a <- c(1, 2, 3)
a[1]
a[1:2]
a[-3]
a[1] <- 0

Una matriz tiene dos dimensiones, así que necesitaremos dos elementos para indicar celdas en nuestra estructura, pero al margen de eso, los índices de una matriz se rigen a través de los mismos principios:

A <- matrix(c(1, 2, 3, 4), nrow=2)
A[1, 1]
A[1, ] # Un espacio vacio indica "todos los elementos de esta dimensión"
A[, 1]
A[2, 2] <- 0
A[2, ] <- 0 # Regla de reciclado

Una lista usa una notación similar, pero con dos corchetes en lugar de uno. Las listas tienen además otras formar de acceder a los elementos.

my_list <- list("a"=1, "b"=2, "c"=NA)
my_list[["a"]] # Nombre
my_list[[1]] # Posición
my_list$a <- c("Not 1 anymore")

Ved cómo hemos accedido a elementos tanto por nombre como por posición.

LS0tIAp0aXRsZTogIlByaW1lcm9zIHBhc29zIGVuIGBSYCIKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUIgJWQsICVZJylgIgpvdXRwdXQ6CiAgbWRfZG9jdW1lbnQKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRSwgY2FjaGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChldmFsID0gRkFMU0UpCmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcucGF0aCA9ICdhc3NldHMvJykKYGBgCgojIyMgRWwgaW50w6lycHJldGUKCkVtcGVjZW1vcyB1c2FuZG8gZWwgaW50w6lycHJldGUgcGFyYSBmYW1pbGlhcml6YXJub3MgY29uIGFsZ3VuYXMgb3BlcmFjaW9uZXMKYXJpdG3DqXRpY2FzIGLDoXNpY2FzLiAgVG9kYXMgZnVuY2lvbmFuIGRlbCBtb2RvIGVuIGVsIHF1ZSB1bm8gZXNwZXJhcsOtYS4gCgpgYGB7ciBldmFsPUZBTFNFfQoxICsgMQpzcXJ0KDIpCmV4cCgxKQoyXjMKYGBgCgpMbyBtaXNtbyBvY3VycmUgY29uIGxhcyBjb21wYXJhY2lvbmVzOgoKYGBge3IgZXZhbD1GQUxTRX0KMSA+IDEKMCA9PSBsb2coMSkKKDEgKyAxID09IDIpIHwgKDEgKyAxID09IDMpCigxICsgMSA9PSAyKSAmICgxICsgMSA9PSAzKQpgYGAKClBvZGVtb3MgYXNpZ25hciB2YWxvcmVzIGEgdW4gbm9tYnJlIHVzYW5kbyBlbCBfb3BlcmFkb3IgZGUgYXNpZ25hY2nDs25fIGA8LWAuIGBSYAp0YW1iacOpbiBhY2VwdGEgYD1gIHBhcmEgaGFjZXIgYXNpZ25hY2lvbmVzLCBwZXJvIG5vIHNpZW1wcmUgeSBhZGVtw6FzIGA8LWAgZXMKbXVjaG8gbcOhcyBwb3B1bGFyLiBQb3IgZWplbXBsbywgcG9kZW1vcyBhc2lnbmFyIGVsIHZhbG9yIGAxYCBhIGxhIHZhcmlhYmxlIGBhYCwKZGUgdGFsIGZvcm1hIHF1ZSBjYWRhIHZleiBxdWUgbGxhbWVtb3MgYSBgYWAgb2J0ZW5kcmVtb3MgZWwgdmFsb3IgYWwgcXVlIGxhCnZhcmlhYmxlIHNlIHJlZmllcmUuCgpgYGB7ciBldmFsPUZBTFNFfQphIDwtIDEKYQpgYGAKCiMjIFRpcG9zIGRlIGRhdG9zCgpgUmAgb2ZyZWNlIHZhcmlvcyB0aXBvcyBkZSBkYXRvcy4gTG9zIG3DoXMgcmVsZXZhbnRlcyBzb246IF9udW1lcmljXywKX2ludGVnZXJfLCBfY2hhcmFjdGVyXywgYW5kIF9sb2dpY2FsXy4KCmBgYHtyIGV2YWw9RkFMU0V9CjEuMCAjIE51bWVyaWMKMSAjICJJbnRlZ2VyIgoiYWIiICMgQ2hhcmFjdGVyClRSVUUgIyBsb2dpY2FsCmBgYAoKRWwgYCNgIGluZGljYSB1biBjb21lbnRhcmlvLCBxdWUgcHVlZGUgZXN0YXIgbyBubyBhbCBwcmluY2lwaW8gZGUgdW5hIGzDrW5lYS4KCmBSYCB0YW1iacOpbiBvZnJlY2UgY29uc3RhbnRlcyBsw7NnaWNhcyBwYXJhIGxvcyB2YWxvcmVzIHBlcmRpZG9zIChgTkFgKSwgIk5vdCBhCk51bWJlciIgKGBOYU5gKSB5IHZhbG9yZXMgcGFyYSBpbmZpbml0byBwb3NpdGl2byB5IG5lZ2F0aXZvIChgSW5mYCB5IGAtSW5mYCk6CgpgYGB7ciBldmFsPUZBTFNFfQpOQQowLzAKMS8wCmBgYAoKUHVlZGVzIGNvbXByb2JhciBlbCB0aXBvIGRlIHVuIG9iamV0byB1c2FuZG8gbGFzIGZ1bmNpb25lcyBgaXMuYCAoXyJpcyBgeGAgYW4gaW50ZWdlcj8iXyk6CmBgYHtyIGV2YWw9RkFMU0V9CmlzLm51bWVyaWMoMS4wKQppcy5pbnRlZ2VyKDEpCmlzLmNoYXJhY3RlcigiYWIiKQppcy5sb2dpY2FsKEZBTFNFKQpgYGAKClVuIGVycm9yIGNvbcO6biBxdWUgdG9kb3MgY29tZW50ZW1vcyBlbiBhbGfDum4gbW9tZW50byBlcyBjb21wcm9iYXIgcXVlIHVuIG9iamV0bwplcyBgTkFgIG1lZGlhbnRlIGxhIGNvbXBhcmFjacOzbiBjb24gYD09YC4KYGBge3J9Ck5BID09IE5BCmBgYAoKSGF5IGJ1ZW5hcyByYXpvbmVzIHBhcmEgZXN0ZSB0aXBvIGRlIGNvbXBvcnRhbWllbnRvLiBFbmN1ZW50cm8gZXN0YSBleHBsaWNhY2nDs24KbXV5IGFjZXJ0YWRhOgpbU3RhY2tPdmVyZmxvd10oaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNTEwMDk3NC9uYS1tYXRjaGVzLW5hLWJ1dC1pcy1ub3QtZXF1YWwtdG8tbmEtd2h5KToKCgo+IFRoaW5rIG9mIE5BIGFzIG1lYW5pbmcgIkkgZG9uJ3Qga25vdyB3aGF0J3MgdGhlcmUiLiBUaGUgY29ycmVjdCBhbnN3ZXIgdG8gMyA+Cj4gTkEgaXMgb2J2aW91c2x5IE5BIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGUgbWlzc2luZyB2YWx1ZSBpcyBsYXJnZXIgdGhhbiAzCj4gb3Igbm90LiBXZWxsLCBpdCdzIHRoZSBzYW1lIGZvciBOQSA9PSBOQS4gVGhleSBhcmUgYm90aCBtaXNzaW5nIHZhbHVlcyBidXQgdGhlCj4gdHJ1ZSB2YWx1ZXMgY291bGQgYmUgcXVpdGUgZGlmZmVyZW50LCBzbyB0aGUgY29ycmVjdCBhbnN3ZXIgaXMgIkkgZG9uJ3Qga25vdy4iCgpUZW5lbW9zIGZ1bmNpb25lcyBlc3BlY2lhbGVzIHBhcmEgY29tcHJvYmFyIHF1ZSB1biBvYmpldG8gZXMgYE5BYDoKCmBgYHtyfQppcy5uYShOQSkKYGBgCnkgbG8gbWlzbW8gc2UgcHVlZGUgZGVjaXIgZGUgYE5hTmAuCgpgaXMubnVtZXJpY2AgZXMgdW5hIF9mdW5jacOzbixfIHkgdG9kYXMgbGFzIGZ1bmNpb25lcyBlbiBgUmAgZnVuY2lvbmFsIGRlbCBtaXNtbwptb2RvLiBUaWVuZW4gYXNvY2lhZG8gdW4gbm9tYnJlIHNlZ3VpZG8gZGUgc3VzIGFyZ3VtZW50b3Mgcm9kZWFkb3MgcG9yIHBhcsOpbnRlc2lzOgpgYW55X2Z1bmN0aW9uKHgpYC4gQSBsbyBsYXJnbyBkZSBsYXMgc2lndWllbnRlcyBzZXNpb25lcyB2ZXJlbW9zIHkgYXByZW5kZXJlbW9zCm11Y2hvIG3DoXMgc29icmUgbGFzIGZ1bmNpb25lcyBlbiBgUmAuCgojIyMgRXN0cnVjdHVyYXMgZGUgZGF0b3MKCkxhIGVzdHJ1Y3R1cmFzIG3DoXMgY29tdW5lcyAoZSBpbnR1aXRpdmFzKSBzb24gIGB2ZWN0b3JgLCBgbWF0cml4YCwKYGRhdGEuZnJhbWVgIHkgYGxpc3RgLiBWZXJlbW9zIG3DoXMgc29icmUgZWwgYGRhdGEuZnJhbWVgIGVuIGxhIHNpZ3VpZW50ZQpzZWNjacOzbi4gCgpVbiBgdmVjdG9yYCBjb250aWVuZSBkYXRvcyBfZGVsIG1pc21vIHRpcG9fIChvIGBOQWApLiBMb3MgdmVjdG9yZXMgc2UgcHVlZGVuCmNyZWFyIG1lZGlhbnRlIGxhIGZ1bmNpw7NuIGBjYCwgcXVlIHB1ZWRlIGxlZXJzZSBjb21vICJjb25jYXRlbmFyIi4KCmBgYHtyIGV2YWw9RkFMU0V9CmMoMSwgMikKYygxLCAyLCBOQSkKYygxLCAiYSIpICMgQXRlbmNpw7NuIGEgY8OzbW8gZWwgcHJpbWVyIGVsZW1lbnRvIGNhbWJpYSBkZSB0aXBvCmBgYAoKSGF5IGFsZ3VuYXMgZnVuY2lvbmVzIMO6dGlsZXMgcXVlIG5vcyBwZXJtaXRlbiBjcmVhciB2ZWN0b3JlcyBjb24gdW5hIGVzdHJ1Y3R1cmEKcGFydGljdWxhci4gUG9yIGVqZW1wbG8sIHBvZGVtb3MgY3JlYXIgdW5hIHNlY3VlbmNpYSB1c2FuZG8gbGEgZnVuY2nDs24gYHNlcWA6CgpgYGB7ciBldmFsPUZBTFNFfQpjKDEsIDIsIDMsIDQpCnNlcSgxLCA0KQoxOjQgIyBVbiBzaW7Ds21pbW8gZGUgYHNlcWAKYGBgCgrCv0hhYsOpaXMgY29tcHJvYmFkbyBjw7NtbyBoZW1vcyB1c2FkbyB1bmEgZnVuY2nDs24gY29uIGRvcyBhcmd1bWVudG9zPyBFcyBxdWl6w6FzIHVuCmJ1ZW4gbW9tZW50byBwYXJhIGVjaGFyIHVuIHZpc3Rhem8gYSBsYSBkb2N1bWVudGFjacOzbiB5IHZlciBtw6FzIGluZm9ybWFjacOzbgpzb2JyZSBsYXMgZnVuY2nDs24gYHNlcWAgdXNhbmRvIGA/c2VxYAoKTGEgZXN0cnVjdHVyYSBgbWF0cml4YCBlcywgY29tbyBlc3BlcmFyw61hbW9zLCB1bmEgbWF0cml6OiB1bmEgdGFibGEgcmVjdGFuZ3VsYXIKZGUgZWxlbWVudG9zIGRlbCBtaXNtbyB0aXBvLiAKCmBgYHtyfQpBIDwtIG1hdHJpeChjKDEsIDIsIDMsIDQpLCBucm93PTIsIG5jb2w9MikKQQpgYGAKClBhcmFkIHVuIG1vbWVudG8gcGFyYSBlbnRlbmRlciBxdcOpIGhlbW9zIGhlY2hvLiBIZW1vcyB0b21hZG8gdW4gb2JqZXRvIGRlbCB0aXBvCmB2ZWN0b3JgIHkgaGVtb3MgcmVsbGVuYWRvIGxhIG1hdHJpeiBlbiB1biBvcmRlbiBjb25jcmV0byBwYXNhbmRvIGxhcwpkaW1lbnNpb25lcyBxdWUgcXVlcmVtb3MgdXNhciBwYXJhIHRyYW5zZm9ybWFyIGVsIHZlY3Rvci4gUXVpesOhcyByZXN1bHRlIHBvY28KaW50dWl0aXZvLCBwZXJvIHNpIGxvIHBlbnPDoWlzIHRpZW5lIHNlbnRpZG86IHVuYSBgbWF0cml4YCBkZSB1bmEgc29sYSBkaW1lbnNpw7NuCm5vIGVzIHVuIGB2ZWN0b3JgLgoKTGFzIG9wZXJhY2lvbmVzIGVuIG1hdHJpY2VzIGZ1bmNpb25hbiAibcOhcyBvIG1lbm9zIiBjb21vIHVubyBlc3BlcmFyw61hOgoKYGBge3J9CkIgPC0gbWF0cml4KGMoNCwgMywgMiwgMSksIG5yb3c9MikKQSAqIEIKQSAlKiUgQgpgYGAKCkNvbXByb2JhZCBxdWUgbGEgcHJpbWVyYSBvcGVyYWNpw7NuIG9jdXJyZSBhIG5pdmVsIGRlIGVsZW1lbnRvcywgbWllbnRyYXMgcXVlIGxhCnNlZ3VuZGEgZXMgbGEgbXVsdGlwbGljYWNpw7NuIG1hdHJpY2lhbCBoYWJpdHVhbC4gVGFtYmnDqW4gdGVuZW1vcyBvcGVyYWRvcmVzCmNvbXVuZXMgcGFyYSBleHRyYWVyIGxhIGRpYWdvbmFyIChxdWUgZXMgdW4gYHZlY3RvcmApIG8gcGFyYSBjYWxjdWxhciBsYSBpbnZlcnNhOgoJCmBgYHtyIGV2YWw9RkFMU0V9CnQoQSkKZGlhZyhBKQpzb2x2ZShBKSAjIHBlcm8gQV4tMS4uLgpgYGAKClVuYSBgbGlzdGAgZXMgdW5hIGNvbGVjY2nDs24gb3JkZW5hZGEgZGUgb2JqZXRvcywgcG9zaWJsZW1lbnRlIGRlIHRpcG9zIGRpZmVyZW50ZXMuCgpgYGB7ciBldmFsPUZBTFNFfQpsaXN0KCJmaXJzdCI9YygxLCAyLCAzKSwgInNlY29uZCI9YygiYSIsICJiIiksICJ0aGlyZCI9bWF0cml4KE5BLCBuY29sPTIsIG5yb3c9MikpCmBgYAoKTGFzIGxpc3RhcyBqdWVnYW4gdW4gcGFwZWwgZnVuZGFtZW50YWwgZW4gYFJgIHkgbGFzIHVzYXJlbW9zIGNvbnN0YW50ZW1lbnRlLgoKIyMjIMONbmRpY2VzCgpMb3Mgw61uZGljZXMgbm9zIHBlcm1pdGVuIGFjY2VkZXIgYSBsb3MgZWxlbWVudG9zIGRlIHVuIGB2ZWN0b3JgIG8gYG1hdHJpeGAgYQp0cmF2w6lzIGRlIHN1IHBvc2ljw61vbiBlbiBlbCBvYmpldG86CgpgYGB7ciBldmFsPUZBTFNFfQphIDwtIGMoMSwgMiwgMykKYVsxXQphWzE6Ml0KYVstM10KYVsxXSA8LSAwCmBgYAoKVW5hIG1hdHJpeiB0aWVuZSBkb3MgZGltZW5zaW9uZXMsIGFzw60gcXVlIG5lY2VzaXRhcmVtb3MgZG9zIGVsZW1lbnRvcyBwYXJhCmluZGljYXIgY2VsZGFzIGVuIG51ZXN0cmEgZXN0cnVjdHVyYSwgcGVybyBhbCBtYXJnZW4gZGUgZXNvLCBsb3Mgw61uZGljZXMgZGUgdW5hCm1hdHJpeiBzZSByaWdlbiBhIHRyYXbDqXMgZGUgbG9zIG1pc21vcyBwcmluY2lwaW9zOgpgYGB7ciBldmFsPUZBTFNFfQpBIDwtIG1hdHJpeChjKDEsIDIsIDMsIDQpLCBucm93PTIpCkFbMSwgMV0KQVsxLCBdICMgVW4gZXNwYWNpbyB2YWNpbyBpbmRpY2EgInRvZG9zIGxvcyBlbGVtZW50b3MgZGUgZXN0YSBkaW1lbnNpw7NuIgpBWywgMV0KQVsyLCAyXSA8LSAwCkFbMiwgXSA8LSAwICMgUmVnbGEgZGUgcmVjaWNsYWRvCmBgYAoKVW5hIGxpc3RhIHVzYSB1bmEgbm90YWNpw7NuIHNpbWlsYXIsIHBlcm8gY29uIGRvcyBjb3JjaGV0ZXMgZW4gbHVnYXIgZGUgdW5vLiBMYXMKbGlzdGFzIHRpZW5lbiBhZGVtw6FzIG90cmFzIGZvcm1hciBkZSBhY2NlZGVyIGEgbG9zIGVsZW1lbnRvcy4KCmBgYHtyIGV2YWw9RkFMU0V9Cm15X2xpc3QgPC0gbGlzdCgiYSI9MSwgImIiPTIsICJjIj1OQSkKbXlfbGlzdFtbImEiXV0gIyBOb21icmUKbXlfbGlzdFtbMV1dICMgUG9zaWNpw7NuCm15X2xpc3QkYSA8LSBjKCJOb3QgMSBhbnltb3JlIikKYGBgCgpWZWQgY8OzbW8gaGVtb3MgYWNjZWRpZG8gYSBlbGVtZW50b3MgdGFudG8gcG9yIG5vbWJyZSBjb21vIHBvciBwb3NpY2nDs24uCgo=