2. Tipos de datos (I)

2.1 Tipos de datos simples

2.1.1 Clase y tipo de un dato

class(45)
## [1] "numeric"
class(34.5)
## [1] "numeric"
class("R")
## [1] "character"
class(TRUE)
## [1] "logical"
class(Inf)
## [1] "numeric"
class(1+2i)
## [1] "complex"
class(NaN)
## [1] "numeric"
typeof(45)
## [1] "double"
typeof(34.5)
## [1] "double"
typeof("R")
## [1] "character"
typeof(TRUE)
## [1] "logical"
typeof(Inf)
## [1] "double"
typeof(1+2i)
## [1] "complex"
typeof(NaN)
## [1] "double"

2.1.2 Almacenamiento de valores en variables

a <- 45
a
## [1] 45
a = 3.1416 
a
## [1] 3.1416
"Hola" -> a 
a
## [1] "Hola"
ls()
## [1] "a"
rm(a)
ls()
## character(0)

2.2 Vectores

2.2.1 Creación de vectores

diasMes <- c(31,29,31,30,31,30,31,31,30,31,30,31)
dias <- c('Lun','Mar','Mi ́e','Jue','Vie','S ́ab','Dom') 
diasMes
##  [1] 31 29 31 30 31 30 31 31 30 31 30 31
dias
## [1] "Lun"  "Mar"  "Mi ́e" "Jue"  "Vie"  "S ́ab" "Dom"
quincena <- 16:30
quincena
##  [1] 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
semanas <- seq(1,365,7) 
semanas
##  [1]   1   8  15  22  29  36  43  50  57  64  71  78  85  92  99 106 113 120 127
## [20] 134 141 148 155 162 169 176 183 190 197 204 211 218 225 232 239 246 253 260
## [39] 267 274 281 288 295 302 309 316 323 330 337 344 351 358 365
rep(T,5)
## [1] TRUE TRUE TRUE TRUE TRUE
c(rep(T,5),rep(F,5))
##  [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE
rep(c(T,F), 5)
##  [1]  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE

2.2.2 Acceso a los elementos de un vector

length(dias)
## [1] 7
length(semanas)
## [1] 53
dias[2]        # Solo el segundo elemento
## [1] "Mar"
dias[-2] # Todos los elementos menos el segundo
## [1] "Lun"  "Mi ́e" "Jue"  "Vie"  "S ́ab" "Dom"
dias[c(3,7)] 
## [1] "Mi ́e" "Dom"

2.2.3 Generaci ́on de vectores aleatorios

set.seed(4242)
rnorm(100, mean=10, sd=3)
##   [1] 16.601503  7.782490 11.597301 12.759985 11.251900  7.049153  4.087217
##   [8] 12.464106  7.505729  9.416750  5.900797  6.930702 11.462176 13.634359
##  [15] 11.915339  8.320269 12.219524  4.553933 14.626155  9.829156 10.867099
##  [22]  7.073053  9.469537  9.398100  9.629391 12.712182  5.536700 16.427711
##  [29]  4.279690 12.181423  4.775551  6.310720 14.329029 11.314088  5.968193
##  [36] 13.372781  5.319390  5.886031 19.273538  7.377150  9.222643  8.400000
##  [43] 16.307809  8.762114  6.517521  7.350390 15.326032  9.000971 10.128321
##  [50] 10.220721 12.423237  9.295735  7.661076 10.664515 15.588475 15.646877
##  [57]  9.293694  9.181816 14.327371  9.470363  6.989486 11.248542 11.961460
##  [64] 12.153842  6.076185  9.772697 10.623449 10.217452 12.734511 15.803807
##  [71] 13.701893  7.093037 16.272279 11.458514  8.253390 10.349666 10.063023
##  [78]  9.581695 10.499814  9.124369  8.715328 11.906492  6.666753 15.347326
##  [85] 12.292075  6.786419 13.456128  5.749136 10.983657  2.637713  9.446325
##  [92]  9.363261  9.336171 15.940844  9.236966  6.066087 10.272637 12.942529
##  [99]  8.637694 12.164843
loto <- as.integer(runif(6, min=1, max=49)) 
loto
## [1] 15  9 22 43 16 15

2.2.4 Operar sobre vectores

vect1 <- rnorm(100000)
vect2 <- rnorm(100000)
vect3 <- c() # El vector de resultados est ́a inicialmente vaćıo
system.time(for(idx in 1:length(vect1))
  vect3[idx] <- vect1[idx] * vect1[idx] + vect2[idx])
##    user  system elapsed 
##   0.047   0.012   0.060
system.time(vect4 <- vect1 * vect1 + vect2)
##    user  system elapsed 
##   0.000   0.000   0.001
stopifnot(vect3 == vect4) # Resultados deben ser id ́enticos

2.3 Matrices

mes <- matrix(1:35,ncol=7) # Dos formas de generar exactamente 
mes <- matrix(1:35,nrow=5) # la misma matriz
mes
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
## [1,]    1    6   11   16   21   26   31
## [2,]    2    7   12   17   22   27   32
## [3,]    3    8   13   18   23   28   33
## [4,]    4    9   14   19   24   29   34
## [5,]    5   10   15   20   25   30   35
mes <- matrix(1:35,nrow=5,ncol=7,byrow=T) 
mes
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
## [1,]    1    2    3    4    5    6    7
## [2,]    8    9   10   11   12   13   14
## [3,]   15   16   17   18   19   20   21
## [4,]   22   23   24   25   26   27   28
## [5,]   29   30   31   32   33   34   35
length(mes)
## [1] 35
nrow(mes)
## [1] 5
ncol(mes)
## [1] 7
dim(mes)
## [1] 5 7
is.matrix(vect4)
## [1] FALSE
dim(vect4)
## NULL
dim(vect4) <- c(1000, 100) 
is.matrix(vect4)
## [1] TRUE
dim(vect4)
## [1] 1000  100

2.3.2 Acceso a los elementos de una matriz

mes[2,5] # Quinto elemento de la segunda fila 
## [1] 12
mes[2,] # Segunda fila completa
## [1]  8  9 10 11 12 13 14
mes[,2]   # Segunda columna completa
## [1]  2  9 16 23 30

2.3.3 Columnas y filas con nombre

rownames(mes) <- c('Semana1','Semana2','Semana3','Semana4','Semana5')
colnames(mes) <- dias
mes
##         Lun Mar Mi ́e Jue Vie S ́ab Dom
## Semana1   1   2    3   4   5    6   7
## Semana2   8   9   10  11  12   13  14
## Semana3  15  16   17  18  19   20  21
## Semana4  22  23   24  25  26   27  28
## Semana5  29  30   31  32  33   34  35
attributes(mes)
## $dim
## [1] 5 7
## 
## $dimnames
## $dimnames[[1]]
## [1] "Semana1" "Semana2" "Semana3" "Semana4" "Semana5"
## 
## $dimnames[[2]]
## [1] "Lun"  "Mar"  "Mi ́e" "Jue"  "Vie"  "S ́ab" "Dom"
mes[,'Jue']
## Semana1 Semana2 Semana3 Semana4 Semana5 
##       4      11      18      25      32
mes['Semana4',]
##  Lun  Mar Mi ́e  Jue  Vie S ́ab  Dom 
##   22   23   24   25   26   27   28
mes['Semana2', 'Vie']
## [1] 12

2.4 Factors

mdias <- c(dias[as.integer(runif(1000,0,7)+1)])
mdias[1:10]
##  [1] "Jue"  "Mar"  "Mar"  "Jue"  "Jue"  "Mar"  "Mar"  "Lun"  "Jue"  "S ́ab"
object.size(mdias)
## 8440 bytes
fdias <- factor(mdias) 
fdias[1:10]
##  [1] Jue  Mar  Mar  Jue  Jue  Mar  Mar  Lun  Jue  S ́ab
## Levels: Dom Jue Lun Mar Mi ́e S ́ab Vie
object.size(fdias)
## 4888 bytes
nlevels(fdias)
## [1] 7
levels(fdias)
## [1] "Dom"  "Jue"  "Lun"  "Mar"  "Mi ́e" "S ́ab" "Vie"
levels(fdias)[1] <- 'Sun'
peso <- ordered(c('Ligero','Medio','Pesado')) 
tam <- peso[c(sample(peso,25,replace=T))]
tam
##  [1] Medio  Medio  Pesado Medio  Pesado Ligero Ligero Medio  Pesado Pesado
## [11] Pesado Ligero Pesado Pesado Medio  Ligero Ligero Medio  Medio  Medio 
## [21] Pesado Ligero Pesado Medio  Ligero
## Levels: Ligero < Medio < Pesado
tam[2] < tam[1]
## [1] FALSE
dias[3]
## [1] "Mi ́e"
fdias[3]
## [1] Mar
## Levels: Sun Jue Lun Mar Mi ́e S ́ab Vie
as.numeric(fdias[3])
## [1] 4
as.numeric(dias[3])
## Warning: NAs introduced by coercion
## [1] NA