2 Tipos de objetos
En R existen varios tipos de objectos que permiten que el usuario pueda almacenar la información para realizar procedimientos estadísticos y gráficos. Los principales objetos en R son vectores, matrices, arreglos, marcos de datos y listas. A continuación se presentan las características de estos objetos y la forma para crearlos.
2.1 Variables
Las variables sirven para almacenar un valor que luego vamos a utilizar en algún procedimiento.
Para hacer la asignación de un valor a alguna variable se utiliza el operador <-
entre el valor y el nombre de la variable. A continuación un ejemplo sencillo.
<- 5
x 2 * x + 3
## [1] 13
En el siguiente ejemplo se crea la variable pais
y se almacena el nombre Colombia, luego se averigua el número de caracteres de la variable pais
.
<- "Colombia"
pais nchar(pais)
## [1] 8
2.2 Vectores
Los vectores vectores son arreglos ordenados en los cuales se puede almacenar información de tipo numérico (variable cuantitativa), alfanumérico (variable cualitativa) o lógico (TRUE
o FALSE
), pero no mezclas de éstos. La función de R para crear un vector es c()
y que significa concatenar; dentro de los paréntesis de esta función se ubica la información a almacenar. Una vez construído el vector se acostumbra a etiquetarlo con un nombre corto y representativo de la información que almacena, la asignación se hace por medio del operador <-
entre el nombre y el vector.
A continuación se presenta un ejemplo de cómo crear tres vectores que contienen las respuestas de cinco personas a tres preguntas que se les realizaron.
<- c(15, 19, 13, NA, 20)
edad <- c(TRUE, TRUE, NA, FALSE, TRUE)
deporte <- c(NA, 'Superman', 'Batman', NA, 'Batman') comic_fav
El vector edad
es un vector cuantitativo y contiene las edades de las 5 personas. En la cuarta posición del vector se colocó el símbolo NA
que significa Not Available debido a que no se registró la edad para esa persona. Al hacer una asignación se acostumbra a dejar un espacio antes y después del operador <-
de asignación. El segundo vector es llamado deporte
y es un vector lógico que almacena las respuestas a la pregunta de si la persona practica deporte, nuevamente aquí hay un NA
para la tercera persona. El último vector comic_fav
contiene la información del cómic favorito de cada persona, como esta variable es cualitativa es necesario usar las comillas ' '
para encerrar las respuestas.
NA
para representar una información Not Available no se deben usar comillas.
'foo'
o comillas dobles "foo"
para ingresar valores de una variable cualitativa.
Si se desea ver lo que está almacenado en cada uno de estos vectores, se debe escribir en la consola de R el nombre de uno de los objetos y luego se presiona la tecla enter o intro, al realizar esto lo que se obtiene se muestra a continuación.
edad
## [1] 15 19 13 NA 20
deporte
## [1] TRUE TRUE NA FALSE TRUE
comic_fav
## [1] NA "Superman" "Batman" NA "Batman"
2.2.1 ¿Cómo extraer elementos de un vector?
Para extraer un elemento almacenado dentro un vector se usan los corchetes []
y dentro de ellos la posición o posiciones que interesan.
Ejemplo
Si queremos extraer la edad de la tercera persona escribimos el nombre del vector y luego [3]
para indicar la tercera posición de edad
, a continuación el código.
3] edad[
## [1] 13
Si queremos conocer el cómic favorito de la segunda y quinta persona, escribimos el nombre del vector y luego, dentro de los corchetes, escribimos otro vector con las posiciones 2 y 5 que nos interesan así [c(2, 5)]
, a continuación el código.
c(2, 5)] comic_fav[
## [1] "Superman" "Batman"
Si nos interesan las respuestas de la práctica de deporte, excepto la de la persona 3, usamos [-3]
luego del nombre del vector para obtener todo, excepto la tercera posición.
-3] deporte[
## [1] TRUE TRUE FALSE TRUE
mivector[2, 5, 7]
. Tiene que crear un vector con las posiciones y luego colocarlo dentro de los corchetes así: mivector[c(2, 5, 7)]
2.3 Matrices
Las matrices son arreglos rectangulares de filas y columnas con información numérica, alfanumérica o lógica. Para construir una matriz se usa la función matrix( )
. Por ejemplo, para crear una matriz de 4 filas y 5 columnas (de dimensión \(4 \times 5\)) con los primeros 20 números positivos se escribe el código siguiente en la consola.
<- matrix(data=1:20, nrow=4, ncol=5, byrow=FALSE) mimatriz
El argumento data
de la función sirve para indicar los datos que se van a almacenar en la matriz, los argumentos nrow
y ncol
sirven para definir la dimensión de la matriz y por último el argumento byrow
sirve para indicar si la información contenida en data
se debe ingresar por filas o no. Para observar lo que quedó almacenado en el objeto mimatriz
se escribe en la consola el nombre del objeto seguido de la tecla enter o intro.
mimatriz
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 5 9 13 17
## [2,] 2 6 10 14 18
## [3,] 3 7 11 15 19
## [4,] 4 8 12 16 20
2.3.1 ¿Cómo extraer elementos de una matriz?
Al igual que en el caso de los vectores, para extraer elementos almacenados dentro de una matriz se usan los corchetes [ , ]
y dentro, separado por una coma, el número de fila(s) y el número de columna(s) que nos interesan.
Ejemplo
Si queremos extraer el valor almacenado en la fila 3 y columna 4 usamos el siguiente código.
3, 4] mimatriz[
## [1] 15
Si queremos recuperar toda la fila 2 usamos el siguiente código.
2, ] # No se escribe nada luego de la coma mimatriz[
## [1] 2 6 10 14 18
Si queremos recuperar toda la columna 5 usamos el siguiente código.
5] # No se escribe nada antes de la coma mimatriz[,
## [1] 17 18 19 20
Si queremos recuperar la matriz original sin las columnas 2 y 4 usamos el siguiente código.
-c(2, 4)] # Las columnas como vector mimatriz[,
## [,1] [,2] [,3]
## [1,] 1 9 17
## [2,] 2 10 18
## [3,] 3 11 19
## [4,] 4 12 20
Si queremos recuperar la matriz original sin la fila 1 ni columna 3 usamos el siguiente código.
-1, -3] # Signo de menos para eliminar mimatriz[
## [,1] [,2] [,3] [,4]
## [1,] 2 6 14 18
## [2,] 3 7 15 19
## [3,] 4 8 16 20
2.4 Arreglos
Un arreglo es una matriz de varias dimensiones con información numérica, alfanumérica o lógica. Para construir una arreglo se usa la función array( )
. Por ejemplo, para crear un arreglo de \(3 \times 4 \times 2\) con las primeras 24 letras minúsculas del alfabeto se escribe el siguiente código.
<- array(data=letters[1:24], dim=c(3, 4, 2)) miarray
El argumento data
de la función sirve para indicar los datos que se van a almacenar en el arreglo y el argumento dim
sirve para indicar las dimensiones del arreglo. Para observar lo que quedó almacenado en el objeto miarray
se escribe en la consola lo siguiente.
miarray
## , , 1
##
## [,1] [,2] [,3] [,4]
## [1,] "a" "d" "g" "j"
## [2,] "b" "e" "h" "k"
## [3,] "c" "f" "i" "l"
##
## , , 2
##
## [,1] [,2] [,3] [,4]
## [1,] "m" "p" "s" "v"
## [2,] "n" "q" "t" "w"
## [3,] "o" "r" "u" "x"
2.4.1 ¿Cómo extraer elementos de un arreglo?
Para recuperar elementos almacenados en un arreglo se usan también corchetes, y dentro de los corchetes, las coordenadas del objeto de interés.
Ejemplo
Si queremos extraer la letra almacenada en la fila 1 y columna 3 de la segunda capa de miarray
usamos el siguiente código.
1, 3, 2] # El orden es importante miarray[
## [1] "s"
Si queremos extraer la segunda capa completa usamos el siguiente código.
2] # No se coloca nada en las primeras posiciones miarray[,,
## [,1] [,2] [,3] [,4]
## [1,] "m" "p" "s" "v"
## [2,] "n" "q" "t" "w"
## [3,] "o" "r" "u" "x"
Si queremos extraer la tercera columna de todas las capas usamos el siguiente código.
3,] # No se coloca nada en las primeras posiciones miarray[,
## [,1] [,2]
## [1,] "g" "s"
## [2,] "h" "t"
## [3,] "i" "u"
2.5 Marco de datos
El marco de datos marco de datos o data frame es uno de los objetos más utilizados porque permite agrupar vectores con información de diferente tipo (numérica, alfanumérica o lógica) en un mismo objeto, la única restricción es que los vectores deben tener la misma longitud. Para crear un marco de datos se usa la función data.frame( )
, como ejemplo vamos a crear un marco de datos con los vectores edad
, deporte
y comic_fav
definidos anteriormente.
<- data.frame(edad, deporte, comic_fav) mimarco
Una vez creado el objeto mimarco
podemos ver el objeto escribiendo su nombre en la consola, a continuación se muestra lo que se obtiene.
mimarco
## edad deporte comic_fav
## 1 15 TRUE <NA>
## 2 19 TRUE Superman
## 3 13 NA Batman
## 4 NA FALSE <NA>
## 5 20 TRUE Batman
De la salida anterior vemos que el marco de datos tiene 3 variables (columnas) cuyos nombres coinciden con los nombres de los vectores creados anteriormente, los números consecutivos al lado izquierdo son sólo de referencia y permiten identificar la información para cada persona en la base de datos.
2.5.1 ¿Cómo extraer elementos de un marco de datos?
Para recuperar las variables (columnas) almacenadas en un marco de datos se puede usar el operador $
, corchetes simples []
o corchetes dobles [[]]
. A continuación algunos ejemplos para entender las diferencias entre estas opciones.
Ejemplo
Si queremos extraer la variable deporte
del marco de datos mimarco
como un vector usamos el siguiente código.
$deporte # Se recomienda si el nombre es corto mimarco
## [1] TRUE TRUE NA FALSE TRUE
Otra forma de recuperar la variable deporte
como vector es indicando el número de la columna donde se encuentra la variable.
2] # Se recomienda si recordamos su ubicacion mimarco[,
## [1] TRUE TRUE NA FALSE TRUE
Otra forma de extraer la variable deporte
como vector es usando [[]]
y dentro el nombre de la variable.
"deporte"]] mimarco[[
## [1] TRUE TRUE NA FALSE TRUE
Si usamos mimarco["deporte"]
el resultado es la variable deporte
pero en forma de marco de datos, no en forma vectorial.
"deporte"] mimarco[
## deporte
## 1 TRUE
## 2 TRUE
## 3 NA
## 4 FALSE
## 5 TRUE
Si queremos extraer un marco de datos sólo con las variables deporte y edad podemos usar el siguiente código.
c("deporte", "edad")] mimarco[
## deporte edad
## 1 TRUE 15
## 2 TRUE 19
## 3 NA 13
## 4 FALSE NA
## 5 TRUE 20
Por otra, si queremos la edad
de las personas que están en las posiciones 2 hasta 4 usamos el siguiente código.
2:4, 1] mimarco[
## [1] 19 13 NA
2.5.2 ¿Cómo extraer subconjuntos de un marco de datos?
Para extraer partes de un marco de datos se puede utilizar la función subset(x, subset, select)
. El parámetro x
sirve para indicar el marco de datos original, el parámetro subset
sirve para colocar la condición y el parámetro select
sirve para quedarnos sólo con algunas de las variables del marco de datos. A continuación varios ejemplos de la función subset
para ver su utilidad.
Ejemplos
Si queremos el marco de datos mimarco
sólo con las personas que SI practican deporte usamos el siguiente código.
subset(mimarco, subset=deporte == TRUE)
## edad deporte comic_fav
## 1 15 TRUE <NA>
## 2 19 TRUE Superman
## 5 20 TRUE Batman
Si queremos el marco de datos mimarco
sólo con las personas mayores o iguales a 17 años usamos el siguiente código.
subset(mimarco, subset=edad >= 17)
## edad deporte comic_fav
## 2 19 TRUE Superman
## 5 20 TRUE Batman
Si queremos el submarco con deporte y comic de las personas menores de 20 años usamos el siguiente código.
subset(mimarco, subset=edad < 20, select=c('deporte', 'comic_fav'))
## deporte comic_fav
## 1 TRUE <NA>
## 2 TRUE Superman
## 3 NA Batman
Si queremos el marco de datos mimarco
sólo con las personas menores de 20 años y que SI practican deporte usamos el siguiente código.
subset(mimarco, subset=edad < 20 & deporte == TRUE)
## edad deporte comic_fav
## 1 15 TRUE <NA>
## 2 19 TRUE Superman
Ejemplo
Leer la base de datos medidas del cuerpo disponible en este enlace https://raw.githubusercontent.com/fhernanb/datos/master/medidas_cuerpo. Extraer de esta base de datos una sub-base o subconjunto que contenga sólo la edad, peso, altura y sexo de aquellos que miden más de 185 cm y pesan más de 80 kg.
<- 'https://raw.githubusercontent.com/fhernanb/datos/master/medidas_cuerpo'
url <- read.table(url, header=T)
dt1 dim(dt1) # Para conocer la dimensión de la base original
## [1] 36 6
<- subset(x=dt1, subset=altura > 185 & peso > 80,
dt2 select=c('sexo', 'edad', 'peso', 'altura'))
# Para mostrar la base de datos final dt2
## sexo edad peso altura
## 1 Hombre 43 87.3 188.0
## 6 Hombre 33 85.9 188.0
## 15 Hombre 30 98.2 190.5
Al almacenar la nueva base de datos en el objeto dt2
se puede manipular este nuevo objeto para realizar los análisis de interés.
2.6 Listas
Las listas son otro tipo de objeto muy usado para almacenar objetos de diferente tipo. La instrucción para crear una lista es list( )
. A continuación vamos a crear una lista que contiene tres objetos: un vector con 5 números aleatorios llamado mivector
, una matriz de dimensión \(6 \times 2\) con los primeros doce números enteros positivos llamada matriz2
y el tercer objeto será el marco de datos mimarco
creado en el apartado anterior. Las instrucciones para crear la lista requerida se muestran a continuación.
set.seed(12345)
<- runif(n=5)
mivector <- matrix(data=1:12, ncol=6)
matriz2 <- list(E1=mivector, E2=matriz2, E3=mimarco) milista
La función set.seed
de la línea número 1 sirve para fijar la semilla de tal manera que los números aleatorios generados en la segunda línea con la función runif
sean siempre los mismos. En la última línea del código anterior se construye la lista, dentro de la función list
se colocan los tres objetos mivector
, matriz2
y mimarco
. Es posible colocarle un nombre especial a cada uno de los elementos de la lista, en este ejemplo se colocaron los nombres E1
, E2
y E3
para cada uno de los tres elementos. Para observar lo que quedó almacenado en la lista se escribe milista
en la consola y el resultado se muestra a continuación.
milista
## $E1
## [1] 0.7209039 0.8757732 0.7609823 0.8861246 0.4564810
##
## $E2
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 3 5 7 9 11
## [2,] 2 4 6 8 10 12
##
## $E3
## edad deporte comic_fav
## 1 15 TRUE <NA>
## 2 19 TRUE Superman
## 3 13 NA Batman
## 4 NA FALSE <NA>
## 5 20 TRUE Batman
2.6.1 ¿Cómo extraer elementos de una lista?
Para recuperar los elementos almacenadas en una lista se usa el operador $
, corchetes dobles [[]]
o corchetes sencillos []
. A continuación unos ejemplos para entender cómo extraer elementos de una lista.
Ejemplos
Si queremos la matriz almacenada con el nombre de E2
dentro del objeto milista
se puede usar el siguiente código.
$E2 milista
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 3 5 7 9 11
## [2,] 2 4 6 8 10 12
Es posible indicar la posición del objeto en lugar del nombre, para eso se usan los corchetes dobles.
2]] milista[[
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 3 5 7 9 11
## [2,] 2 4 6 8 10 12
El resultado obtenido con milista$E2
y milista[[2]]
es exactamente el mismo. Vamos ahora a solicitar la posición 2 pero usando corchetes sencillos.
2] milista[
## $E2
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 3 5 7 9 11
## [2,] 2 4 6 8 10 12
La apariencia de este último resultado es similar, no igual, al encontrado al usar $
y [[]]
. Para ver la diferencia vamos a pedir la clase a la que pertenecen los tres últimos objetos usando la función class
. A continuación el código usado.
class(milista$E2)
## [1] "matrix" "array"
class(milista[[2]])
## [1] "matrix" "array"
class(milista[2])
## [1] "list"
De lo anterior se observa claramente que cuando usamos $
o [[]]
el resultado es el objeto almacenado, una matriz. Cuando usamos []
el resultado es una lista cuyo contenido es el objeto almacendado.
$
y [[]]
se obtienen los objetos ahí almacenados, al manipular listas con []
se obtiene una lista.
EJERCICIOS
Use funciones o procedimientos (varias líneas) de R para responder cada una de las siguientes preguntas.
Construya un vector con la primeras 20 letras MAYÚSCULAS usando la función LETTERS.
Construya una matriz de \(10 \times 10\) con los primeros 100 números positivos pares.
Construya una matriz identidad de dimension \(3 \times 3\). Recuerde que una matriz identidad tiene sólo unos en la diagonal principal y los demás elementos son cero.
Construya una lista con los anteriores tres objetos creados.
Construya un marco de datos o data frame con las respuestas de 3 personas a las preguntas: (a) ¿Cuál es su edad en años? (b) ¿Tipo de música que más le gusta? (c) ¿Tiene usted pareja sentimental estable?
¿Cuál es el error al correr el siguiente código? ¿A qué se debe?
<- c(15, 19, 13, NA, 20)
edad <- c(TRUE, TRUE, NA, FALSE, TRUE)
deporte <- c(NA, 'Superman', 'Batman', NA, 'Batman')
comic_fav matrix(edad, deporte, comic_fav)