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=