Objetos
Números y vectores
Matrices
Arrays o arreglos
Data frame o marco de datos
Listas
R trabaja con objetos que tienen un nombre y un contenido, sin embargo, también tienen atributos que especifican el tipo de datos presentados por el objeto.
Todo objeto tiene dos atributos: el tipo y la longitud
El tipo se refiere a la clase básica de los elementos del objeto: numérico, caracter, complejo o lógico.
La longitud es simplemente el número de elementos en el objeto
x<-1
class(x)
## [1] "numeric"
mode(x)
## [1] "numeric"
length(x)
## [1] 1
A<-"facultad"
valor<-TRUE
l<-1i
mode(A); mode(valor); mode(l)
## [1] "character"
## [1] "logical"
## [1] "complex"
class(A); class(valor); class(l)
## [1] "character"
## [1] "logical"
## [1] "complex"
Cuando los datos no están disponibles, se presentan como NA (Not available)
## objeto Tipos Varios_objetos
## 1 vector num, char, comp, log FALSE
## 2 factor num o char FALSE
## 3 arrays num, char, comp, log FALSE
## 4 matriz num, char, comp, log FALSE
## 5 data.frame num, char, comp, log TRUE
## 6 ts num, char, comp, log TRUE
## 7 lista num, char, comp, log TRUE
Los objetos pertenecen a una clase, lo cual es fundamental en R que utiliza el paradigma de programación orientada a objetos.
La clase es una propiedad asignada a un objeto.
La estrucutura de datos mas simple es el vector, que es una colección ordenada de números.
La asignación de elementos a una variable requiere una concatenación de elementos, que pueden ser otros vectores.
x<-c(1,2,3,4,5)
x
## [1] 1 2 3 4 5
y<-c(4,x,8)
y
## [1] 4 1 2 3 4 5 8
Es posible realizar operaciones aritméticas con nuestros vectores, cuando estos son numéricos. Los operadores mas comunes son:
La operación se realiza sobre el objeto
z<-5:15
sum(z)
## [1] 110
mean(z)
## [1] 10
max(z) ; min(z)
## [1] 15
## [1] 5
Para construir un vector que contenga una secuencia numérica es posible usar dos procedimientos:
*R es un lenguaje posicional, por lo que no siempre hay que hacer explícito el argumento de la función.
s<-2*1:15
s
## [1] 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30
seq(from=2,to=30,by=2)
## [1] 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30
seq(2,30,2)
## [1] 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30
La función rep() es útil para repetir datos
Los argumentos de esta función son:
rep(x=1:4, times=c(2,2,2,2))
## [1] 1 1 2 2 3 3 4 4
rep(x=1:4, times=c(2,1,2,1))
## [1] 1 1 2 3 3 4
rep(x=1:4, each=2)
## [1] 1 1 2 2 3 3 4 4
Los vectores lógicos están compuestos por datos booleanos True and False.
x<-c(1,4:8,10:5,7)
x
## [1] 1 4 5 6 7 8 10 9 8 7 6 5 7
x>5
## [1] FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE
## [13] TRUE
x==5
## [1] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
## [13] FALSE
Los operadores lógicos se presentan en la siguiente tabla:
## Simbolo Expresa
## [1,] "<" "menor"
## [2,] "<=" "menor o igual"
## [3,] ">" "mayor"
## [4,] "==" "igual"
## [5,] "!=" "diferente"
## [6,] "&" "intersección"
## [7,] "|" "unión"
## [8,] "!" "negación"
Como se indicó mas arriba, cuando falta un elemento se denomina presenta con NA. La función is.na() crea un vector lógico de tamaño x cuyo elementos serán True si el dato está perdido y FALSE en caso contrario. El comando complete.cases() opera de forma análoga.
*Puedo transfomar un vector lógico en un vector numérico
z<-c(1:4,NA,6:3,NA)
z
## [1] 1 2 3 4 NA 6 5 4 3 NA
x<-is.na(z)
x
## [1] FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE TRUE
complete.cases(z)
## [1] TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE FALSE
También poedo coercionar un vector lógico para que se vuelva numérico
x
## [1] FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE TRUE
as.numeric(x)
## [1] 0 0 0 0 1 0 0 0 0 1
Puedo armar cadenas de caracteres con el comando paste. Puede usarse para concatenar vectores
nombres<-c("Andrés","Pedro","Ana")
apellido<-c("López","Ortega","Perez")
paste(nombres,apellido)
## [1] "Andrés López" "Pedro Ortega" "Ana Perez"
paste(nombres,1:3,sep = ":")
## [1] "Andrés:1" "Pedro:2" "Ana:3"
Para extraer un elemento almacenado dentro un vector se usan los corchetes []
edad <- c(15, 19, 13, NA, 20,NA)
edad[3] # filtrar elemento 3
## [1] 13
edad[c(2, 5)] # filtrar elementos 2 y 5
## [1] 19 20
edad[-3] # filtrar todo, menos el elemento 3
## [1] 15 19 NA 20 NA
edad[-c(2, 5)] # filtrar todo, menos los elementos 2 y 5
## [1] 15 13 NA NA
edad[!is.na(edad)] #filtra todo sin datos NA
## [1] 15 19 13 20
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( ).
mimatriz <- matrix(data=1:20, nrow=4, ncol=5, byrow=FALSE)
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
Filtros en matrices
mimatriz[3, 4] # Filtros de elementos
## [1] 15
mimatriz[, 5] # Filtro de columna
## [1] 17 18 19 20
mimatriz[, -c(2, 4)] # Filtro quitando columnas 2 y 4
## [,1] [,2] [,3]
## [1,] 1 9 17
## [2,] 2 10 18
## [3,] 3 11 19
## [4,] 4 12 20
Las funciones cbind() y rbind() permiten cosntruir matrices a partir de vectores
rbind() une vectores por filas (row)
idalumno<-1:6
calificacion<-c(90,92,89,69,70,90)
matriz1<-rbind(idalumno,calificacion)
Por su parte, cbind une vectores por columnas (col)
alumno7<-c(7,80,6)
alumno8<-c(8,90,6)
matriz2<-cbind(alumno7,alumno8)
matriz2
## alumno7 alumno8
## [1,] 7 8
## [2,] 80 90
## [3,] 6 6
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( ).
miarray <- array(data=letters[1:16], dim=c(2, 4, 2))
miarray
## , , 1
##
## [,1] [,2] [,3] [,4]
## [1,] "a" "c" "e" "g"
## [2,] "b" "d" "f" "h"
##
## , , 2
##
## [,1] [,2] [,3] [,4]
## [1,] "i" "k" "m" "o"
## [2,] "j" "l" "n" "p"
Convirtamos un vector en un array con la función dim()
calif<-rnorm(24,90,5) # Vector aleatorio
calif
## [1] 91.38687 92.39696 86.60451 89.36359 86.37195 91.36911 100.08788
## [8] 93.11993 97.98271 85.51254 90.34297 91.61320 90.48587 82.89165
## [15] 87.73135 89.54534 88.27671 97.96818 86.23784 90.45381 83.62365
## [22] 88.12265 91.58578 84.28599
dim(calif) # No tiene dimensiones
## NULL
dim(calif)<-c(6,4) #Le doy dimensiones
calif
## [,1] [,2] [,3] [,4]
## [1,] 91.38687 100.08788 90.48587 86.23784
## [2,] 92.39696 93.11993 82.89165 90.45381
## [3,] 86.60451 97.98271 87.73135 83.62365
## [4,] 89.36359 85.51254 89.54534 88.12265
## [5,] 86.37195 90.34297 88.27671 91.58578
## [6,] 91.36911 91.61320 97.96818 84.28599
edad <- c(15, 19, 13, NA, 20) deporte <- c(TRUE, TRUE, NA, FALSE, TRUE) comic_fav <- c(NA, ‘Superman’, ‘Batman’, NA, ‘Batman’) matrix(edad, deporte, comic_fav)
Los Data frame son 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( )
edad <- c(15, 19, 13, NA, 20)
deporte <- c(TRUE, TRUE, NA, FALSE, TRUE)
comic_fav <- c(NA, 'Superman', 'Batman', NA, 'Batman')
mimarco <- data.frame(edad, deporte, comic_fav)
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
miDf01 <- data.frame(
numbers = c(1, 2, 3, 4),
logicals = c(TRUE, TRUE, FALSE, TRUE),
characters = c("a", "b", "c", "d")
)
print(miDf01)
## numbers logicals characters
## 1 1 TRUE a
## 2 2 TRUE b
## 3 3 FALSE c
## 4 4 TRUE d
Para filtrar en marcos de datos se puede usar el operador $ (filtra un vector), corchetes simples [] (como df) o corchetes dobles [[]]
mimarco$deporte #se filtra la variable deporte
## [1] TRUE TRUE NA FALSE TRUE
mimarco[, 2]
## [1] TRUE TRUE NA FALSE TRUE
mimarco[["deporte"]]
## [1] TRUE TRUE NA FALSE TRUE
Para extraer un data frame con algunas variables
mimarco[c("deporte", "edad")]
## deporte edad
## 1 TRUE 15
## 2 TRUE 19
## 3 NA 13
## 4 FALSE NA
## 5 TRUE 20
Para extraer partes de un marco de datos se puede utilizar la función subset(x, subset, select)
subset(mimarco, subset=deporte == TRUE) # Quienes practican deporte
## edad deporte comic_fav
## 1 15 TRUE <NA>
## 2 19 TRUE Superman
## 5 20 TRUE Batman
subset(mimarco, subset=edad >= 17) #Mayores de 17 años
## edad deporte comic_fav
## 2 19 TRUE Superman
## 5 20 TRUE Batman
subset(mimarco, subset=edad < 20, select=c('deporte', 'comic_fav')) #deporte y comic de los menores de 20 años
## deporte comic_fav
## 1 TRUE <NA>
## 2 TRUE Superman
## 3 NA Batman
Las listas son otro tipo de objeto muy usado para almacenar objetos de diferente tipo.
La instrucción para crear una lista es list( ).
mivector <- runif(n=5)
matriz2 <- matrix(data=1:10, ncol=5)
milista <- list(E1=mivector, E2=matriz2, E3=mimarco)
milista
## $E1
## [1] 0.5424767 0.6806203 0.2351745 0.3509040 0.7102877
##
## $E2
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 3 5 7 9
## [2,] 2 4 6 8 10
##
## $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
milista <- list(E1=mivector, E2=matriz2, E3=mimarco)
milista[[3]][,2]
## [1] TRUE TRUE NA FALSE TRUE
milista$E3[3]
## comic_fav
## 1 <NA>
## 2 Superman
## 3 Batman
## 4 <NA>
## 5 Batman