You are on page 1of 36

Introducción a R.

Estadística descriptiva y minería de datos


Hans Fonfach

06-12-2018

Se piden humildes disculpas por cualquier acento u otro error ortográfico que pueda
encontrarse.

Introducción a R
R es un sistema para analisis estadísticos y gráficos creado por Ross Ihaka y Robert
Gentleman. R nació como una reimplementación de software libre del lenguaje S,
adicionado con soporte para alcance estático. Se trata de uno de los lenguajes de
programación más utilizados en investigación por la comunidad estadística; siendo además
muy popular en el campo de la minería de datos, la investigación biomédica, la
bioinformática y las matemáticas financieras. A esto contribuye la posibilidad de cargar
diferentes bibliotecas o paquetes con funcionalidades de cálculo y graficación.

Manejo de Objetos con R


Ayuda en Línea. no olvidar.
Utilice los siguientes comandos para optar por la ayuda en línea. ? , help()
#estos son comandos de ayuda
help(str)

## starting httpd help server ... done

?table
??data

Creación, listados y remoción de objetos en memoria


Para crear una variable, solo descríbala y asignele un valor utilizando “<-” o “->”. si la
variable ya existe esta se sobreescribe.Use números, “caracteres” o valores lógicos TRUE o
FALSE.
#Creando variables int, string y boolean
numero<-10
100->numero2
a=100
palabra<-"una palabra"
switch<-TRUE

Para listar una variable utilice el nombre de la variable, la función ls() nos muestra todas
las variables en memoria. Con la función ls.str() podemos ver el detalle en memoria
numero

## [1] 10

numero2

## [1] 100

palabra

## [1] "una palabra"

palabra<- "esta es otra palabra"


palabra

## [1] "esta es otra palabra"

palabra<- 5
palabra

## [1] 5

ls()

## [1] "a" "numero" "numero2" "palabra" "switch"

ls.str()

## a : num 100
## numero : num 10
## numero2 : num 100
## palabra : num 5
## switch : logi TRUE

Para borrar una variable utilice la función rm().


rm(a)
rm(numero2)
rm(switch)
rm(numero)
rm(palabra)
Manejando Datos con R
Objetos
Todo objeto tiene dos atributos intrínsecos: tipo y longitud. El tipo se refiere a la clase
básica de los elementos en el objeto; existen cuatro tipos principales: numerico, caracter,
complejo, y logico (FALSE [Falso] or TRUE [Verdadero]). Existen otros tipos, pero no
representan datos como tal (por ejemplo funciones o expresiones). La longitud es
simplemente el número de elementos en el objeto. Utilice los comandos mode() o class () y
length() para revisar estos elementos.
#Creamos las variables
x<-10; y<-"TIC2";z<-FALSE
#Vemos a que tipo pertenece cada variable
class(x);class(y);class(z)

## [1] "numeric"

## [1] "character"

## [1] "logical"

#vemos el tamaño de la variable y


length(y)

## [1] 1

#Asignamos una variable con múmeros del 1 al 500 y luego la mostramos


xs<-1:500
xs

## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
## [18] 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
## [35] 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
## [52] 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
## [69] 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
## [86] 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
## [103] 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
## [120] 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
## [137] 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
## [154] 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
## [171] 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
## [188] 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
## [205] 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221
## [222] 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238
## [239] 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
## [256] 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272
## [273] 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289
## [290] 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306
## [307] 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323
## [324] 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340
## [341] 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357
## [358] 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374
## [375] 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391
## [392] 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408
## [409] 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425
## [426] 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442
## [443] 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459
## [460] 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476
## [477] 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493
## [494] 494 495 496 497 498 499 500

#Mostramos el tamaño de la variable xs


length(xs)

## [1] 500

#multiplicamos cada valor de la variable por 2


xs<-xs*2
xs

## [1] 2 4 6 8 10 12 14 16 18 20 22 24 26
28
## [15] 30 32 34 36 38 40 42 44 46 48 50 52 54
56
## [29] 58 60 62 64 66 68 70 72 74 76 78 80 82
84
## [43] 86 88 90 92 94 96 98 100 102 104 106 108 110
112
## [57] 114 116 118 120 122 124 126 128 130 132 134 136 138
140
## [71] 142 144 146 148 150 152 154 156 158 160 162 164 166
168
## [85] 170 172 174 176 178 180 182 184 186 188 190 192 194
196
## [99] 198 200 202 204 206 208 210 212 214 216 218 220 222
224
## [113] 226 228 230 232 234 236 238 240 242 244 246 248 250
252
## [127] 254 256 258 260 262 264 266 268 270 272 274 276 278
280
## [141] 282 284 286 288 290 292 294 296 298 300 302 304 306
308
## [155] 310 312 314 316 318 320 322 324 326 328 330 332 334
336
## [169] 338 340 342 344 346 348 350 352 354 356 358 360 362
364
## [183] 366 368 370 372 374 376 378 380 382 384 386 388 390
392
## [197] 394 396 398 400 402 404 406 408 410 412 414 416 418
420
## [211] 422 424 426 428 430 432 434 436 438 440 442 444 446
448
## [225] 450 452 454 456 458 460 462 464 466 468 470 472 474
476
## [239] 478 480 482 484 486 488 490 492 494 496 498 500 502
504
## [253] 506 508 510 512 514 516 518 520 522 524 526 528 530
532
## [267] 534 536 538 540 542 544 546 548 550 552 554 556 558
560
## [281] 562 564 566 568 570 572 574 576 578 580 582 584 586
588
## [295] 590 592 594 596 598 600 602 604 606 608 610 612 614
616
## [309] 618 620 622 624 626 628 630 632 634 636 638 640 642
644
## [323] 646 648 650 652 654 656 658 660 662 664 666 668 670
672
## [337] 674 676 678 680 682 684 686 688 690 692 694 696 698
700
## [351] 702 704 706 708 710 712 714 716 718 720 722 724 726
728
## [365] 730 732 734 736 738 740 742 744 746 748 750 752 754
756
## [379] 758 760 762 764 766 768 770 772 774 776 778 780 782
784
## [393] 786 788 790 792 794 796 798 800 802 804 806 808 810
812
## [407] 814 816 818 820 822 824 826 828 830 832 834 836 838
840
## [421] 842 844 846 848 850 852 854 856 858 860 862 864 866
868
## [435] 870 872 874 876 878 880 882 884 886 888 890 892 894
896
## [449] 898 900 902 904 906 908 910 912 914 916 918 920 922
924
## [463] 926 928 930 932 934 936 938 940 942 944 946 948 950
952
## [477] 954 956 958 960 962 964 966 968 970 972 974 976 978
980
## [491] 982 984 986 988 990 992 994 996 998 1000

Existen otros tipos de objetos como:


• Vector: un conjunto de valores del mismo tipo.
• Factor: una variable categorizada.
• arreglo y Matriz: variable del tipo vector de una y multidimensionalidad.
• data.frame: es una variable compleja que puede tener varios tipos de variables.
• ts: es una serie temporal, utilizada para frecuencias y otros.
• lista: es un conjunto de cualquier tipo de variable antes mencionada, incluyendo otras
listas.

Operadores
• Aritméticos (binarios): +, -, *, /, ^ (potencia), %% (módulo), %/% (división de
enteros).
• Comparativos (binarios): >,<,>=,<=,==, !=
• Lógicos: ! (NO lógico), & o && (Y lógico), | o || (O lógico), xor (o Exclusivo)
#Creamos las variables a y b
a<-30
b<-15
#Realizamos una operación matemática y el resultaado lo guardamos en c
c<-a+b*b
#Observamos el valor que contiene la cariable c
c

## [1] 255

#Comparamos si la variable a es mayor que la variable b


a>b

## [1] TRUE

#Comparamos si la variable a y c son iguales


a==c

## [1] FALSE

#Realizamos distintas comparaciones usando el operador lógico && y ||


a>b && b<c

## [1] TRUE

a>b && b>c

## [1] FALSE

a>b || b>c

## [1] TRUE

Generación de Datos
• Secuencias de datos: puede utilizar la función c(), para ingresar los datos que
necesite. O utilice * scan() para ingresarles directamente desde el teclado.
#v3<-scan()
#ingresar los valores de manera manual

• Secuencias Regulares: es una secuencia de números enteros entre dos valores.


separados por “:”, utilice * seq() para secuencias de números reales. utilice rep() si
quiere el mismo valor repetido.
• La función sequence(), permite que creemos distintas secuencias desde el uno hasta
el o los valores que indiquemos.
#creamos la variable lista y antigua, con valores crecientes y decrecientes
respectivaamente
lista<-1:7
antigua<-5:1
lista

## [1] 1 2 3 4 5 6 7

antigua

## [1] 5 4 3 2 1

#creamos una secuencia del 1 al 10 con un incremento de 0,5 en 0,4


seq(1,10,0.5)

## [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5
## [15] 8.0 8.5 9.0 9.5 10.0

#creamos la variable EscalaDeNota y le asignamos una secuencia del 1 al 7 con


un incremento de 0,1 en 0,1
EscalaDeNota<-seq(1,7,0.1)
EscalaDeNota

## [1] 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6
## [18] 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0 4.1 4.2 4.3
## [35] 4.4 4.5 4.6 4.7 4.8 4.9 5.0 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 6.0
## [52] 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7.0

#Decimos que el numero 3 se repetirá 3 veces


rep(3,4)

## [1] 3 3 3 3

#creamos distintas secuencias


sequence(1:3)

## [1] 1 1 2 1 2 3

sequence(4:5)

## [1] 1 2 3 4 1 2 3 4 5

sequence(1:5)

## [1] 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5

#Creamos una secuencia con los valore que nosotros queramos


sequence(c(3,5,2,8))

## [1] 1 2 3 1 2 3 4 5 1 2 1 2 3 4 5 6 7 8
• Generador de niveles: para esto utilice la función gl(k,n), donde k es el número de
niveles y n el valor de las repeticiones. se puede incluir labels para especificar las
categorias. Utilice expand.grid para crear las combinaciones entre vectores.
#Mostra niveles del 1 al 3 en donde cada nivel se repite 5 veces
gl(3,5)

## [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
## Levels: 1 2 3

#Se almacena en la variable x


x<-gl(3,5)
#Podemos ver una tabla con el contenido de x
table(x)

## x
## 1 2 3
## 5 5 5

#Se le asigna a la variable x los niveles y las repeticiones


correspondientes, asignando el tamaño y asignano a los niveles los nombres de
masculino y femenino
x<-gl(2,6, length=27, labels = c("masculino" , "femenino"))
#Se muestra en una tabla las edades, el salario y genero que corresponden a
los valores asignados
expand.grid(edad=c(20,10,5),salario=c(100,300),genero=c("masc","fem"))

## edad salario genero


## 1 20 100 masc
## 2 10 100 masc
## 3 5 100 masc
## 4 20 300 masc
## 5 10 300 masc
## 6 5 300 masc
## 7 20 100 fem
## 8 10 100 fem
## 9 5 100 fem
## 10 20 300 fem
## 11 10 300 fem
## 12 5 300 fem

#Se muestra lo mismo, pero creadas las variables de manera distinta


edad=c(20,10,5)
salario=c(100,300)
genero=c("masc","fem")
expand.grid(edad,salario,genero)

## Var1 Var2 Var3


## 1 20 100 masc
## 2 10 100 masc
## 3 5 100 masc
## 4 20 300 masc
## 5 10 300 masc
## 6 5 300 masc
## 7 20 100 fem
## 8 10 100 fem
## 9 5 100 fem
## 10 20 300 fem
## 11 10 300 fem
## 12 5 300 fem

x<-expand.grid(edad,salario,genero)
#mostramos a que tipo de variable corresponde x
class(x)

## [1] "data.frame"

• Distribuciones.
R maneja distintos tipos de distribuciones. Por ejemplo:
1) Gausse: rnorm(n,mean=0,sd=1)
2) exponencial: rexp(n,rate=1)
3) gamma: rgamma(n, shape, scale=1)
4) Poisson: rpois(n, lambda)
5) Weibull: rweibull(n, shape, scale=1)
6) Cauchy: rcauchy(n, location=0, scale=1)
7) beta: rbeta(n, shape1, shape2)
8) Student (t): rt(n, df)
9) FisherSnedecor(F): rf(n, df1, df2)
10) Pearson: rchisq(n, df)
11) binomial: rbinom(n, size, prob)
12) geométrica: rgeom(n, prob)
13) hypergeométrica: rhyper(nn, m, n, k)
14) logística: rlogis(n, location=0, scale=1)
15) lognormal: rlnorm(n, meanlog=0, sdlog=1)
16) binomial negativa: rnbinom(n, size, prob)
17) uniforme: runif(n, min=0, max=1)
18) Estadístico de Wilcoxons: rwilcox(nn, m, n), rsignrank(nn, n).
cree algunas variables y cárguelas entre 10 y 15 valores de una distribución.
rnorm(6,mean=0,sd=1)

## [1] -0.7530051 0.6126379 -0.5505872 0.5772612 -0.9472209 -0.6596252

rnorm(15,mean=0,sd=1)
## [1] -0.04600932 0.73204877 -2.59871397 1.41311146 -1.24888595
## [6] -0.50535544 -0.09728516 0.58344999 0.65539917 0.45861875
## [11] -0.08822538 -1.66829046 -0.09783110 -0.75120525 0.99531766

#Se le asigna a la variable vaores las condciones de la distribución


valores<-rnorm(14,mean=0,sd=1)
valores2<-rnorm(20,mean=0,sd=1)
#Se muestra la distribución que se obtuvo
plot(valores)

plot(valores, col="red")
lines(valores,col="pink")
plot(valores2)
plot(valores2,col ="gold")
lines(valores2,col="blue")

* Secuencias
Aleatorias. para generar valores enteros utilice la función sample(intervalo, total,
replace=FALSE/TRUE), replace indica si quiere que salgan repetidos o no. Utilice
runif(total,minimo,maximo) si quiere obtener numeros reales aleatorios.
#Se crean números aleatorios con la condición de que estos si se puedan
repetir
sample(1:5)

## [1] 3 5 1 4 2

sample(1:6,20,replace=TRUE)

## [1] 1 6 3 2 5 4 2 5 2 6 3 5 1 6 3 2 3 1 1 3

edad <-sample (18:25,100, replace=TRUE)


sexo<- sample(1:2,100, replace=TRUE)
#Se muestra la edad de los alumnos,y la cantidad de alumnos que hay según su
sexo y genero
alumnos<-data.frame(edad,sexo)
alumnos$sexo<-factor(alumnos$sexo,levels=c(1,2),labels=c("Hombre","Mujer"))
#Se muestran datos de los alumnos de diferentes formas
table(alumnos)

## sexo
## edad Hombre Mujer
## 18 10 12
## 19 6 5
## 20 9 7
## 21 5 5
## 22 2 9
## 23 2 8
## 24 4 3
## 25 9 4

table(alumnos$sexo)

##
## Hombre Mujer
## 47 53

prop.table(table(alumnos))

## sexo
## edad Hombre Mujer
## 18 0.10 0.12
## 19 0.06 0.05
## 20 0.09 0.07
## 21 0.05 0.05
## 22 0.02 0.09
## 23 0.02 0.08
## 24 0.04 0.03
## 25 0.09 0.04

barplot(table(alumnos),col=rainbow(10))
barplot(table(alumnos$edad),col=rainbow(10))

barplot(table(alumnos$sexo),col=rainbow(10))
#Funcion if
runif(5,min=1,max=2)

## [1] 1.762939 1.444202 1.392514 1.087564 1.338664

plot(runif)
runif(10,min=1,max=4)

## [1] 1.209559 1.752302 2.590327 3.944256 1.473894 3.046259 2.628504


## [8] 2.439715 3.661707 2.660937

plot(runif)
#Manipulación de
Objetos Para crear vectores utilice la función vector(mode,length), donde
mode=0,“”,FALSE indica el tipo de dato. numeric(N),logical(N) y character(N) hacen lo
mismo. Puede realizar operaciones con el vector, agregar, eliminar y realizar
comparaciones.
#crear vectores
valor <-vector(mode="numeric",10)
valor2 <-numeric(10)
logicos <- "logical"(5)

#agregar un 10 a la primera y ultima casilla del vector


valor[c(1,length(valor))]<-10

#sumar 5 a cada vector


valor<-valor +5

NA identifica un dato que no está disponible independiente del tipo de dato. NaN, quiere
decir que el valor no es un número, por ejemplo un error dentro de un vector numérico.los
valores infinitos, son descritos como Inf y -Inf.Para el primer caso utilice is.na() para
localizar los valores NA, y !is.na()
aa<-c(3,NA,3,4)

#buscar los valores disponibles en un vector


is.na(aa)

## [1] FALSE TRUE FALSE FALSE


#sacar la raiz cuadrada de -2
sqrt(as.complex(-2))

## [1] 0+1.414214i

para categorizar una variable utilizamos factor(datos, levels), al categorizar una variable
logramos que esta pueda organizar su propio contenido, y ya nos entrega estadística
relacionada. utilice las funciones class() para ver el tipo de objeto y levels() para ver las
categorias que tiene.
#arrojar valores aleatorios con la probabilidad de 80% mujeres y 20% hombres
sexo<-sample(1:2,100,replace=TRUE, prob=c(0.8 , 0.2))
table(sexo)

## sexo
## 1 2
## 88 12

sexo <-factor(sexo, levels = c(1,2), labels = c("mujer", "hombre"))


table(sexo)

## sexo
## mujer hombre
## 88 12

Una matriz es realmente un vector con un atributo adicional (dim) el cual a su vez es un
vector numerico de longitud 2, que define el número de filas y columnas de la matriz. Una
matriz se puede crear con la función matrix. también puede utilizar la función c()
(concatenar) y dim() para convertir arreglos en matrices.
#crea matriz cuadrada de 4 x 4 donde se implementan valores entre 1 y 6
mat1<- matrix(dat=sample(1:6,16,replace=TRUE), nr=4,nc=4)
mat1

## [,1] [,2] [,3] [,4]


## [1,] 4 1 4 6
## [2,] 1 2 5 1
## [3,] 2 3 2 2
## [4,] 3 6 4 6

#crear vector y pasarlo a matriz


mat2<-1:16
dim(mat2)<-c(4,4)

mat1*mat2

## [,1] [,2] [,3] [,4]


## [1,] 4 5 36 78
## [2,] 2 12 50 14
## [3,] 6 21 22 30
## [4,] 12 48 48 96
#multiplicar matrices
mat1%*%mat2

## [,1] [,2] [,3] [,4]


## [1,] 42 102 162 222
## [2,] 24 60 96 132
## [3,] 22 58 94 130
## [4,] 51 127 203 279

#asignar valor 0 a columa y fila de raiz


mat1[,3]<- 0
mat1[3,]<- 0
mat1

## [,1] [,2] [,3] [,4]


## [1,] 4 1 0 6
## [2,] 1 2 0 1
## [3,] 0 0 0 0
## [4,] 3 6 0 6

DataFrames.
Un Dataframe es una estructura de datos de dos dimensiones, cada componente puede ser
de distinto tipo pero de igual largo, si esto no sucede, el componente utiliza redundancia
para rellenarse. cada componente es una columna, y el contenido es la fila. cree un
dataframe, utilizando la función data.frame() que se llame Datos, con tres campos
(id,edad,nombres) el primero numérico correlativo, el segundo aleatorio entre 10 y 15, y
con los siguientes nombres jason, freddy, carrie, mike, morgan y Vlad. Podemos acceder a
los datos
id<-1:6
edad<-sample(10:15,6,replace=TRUE)
nombres<-c("jason", "freddy", "carrie", "mike", "morgan" , "Vlad")
Datos<-data.frame(id,edad,nombres)

utilice el nombre del dataframe para ver su contenido, utilice la función str() para conocer
su estructura, si el dataframe tiene muchos campos puede ver el principio con head() o el
final con tail() puede incluir predicados lógicos para acceder a sus contenidos.
str(Datos)

## 'data.frame': 6 obs. of 3 variables:


## $ id : int 1 2 3 4 5 6
## $ edad : int 10 14 14 10 10 14
## $ nombres: Factor w/ 6 levels "carrie","freddy",..: 3 2 1 4 5 6

head(Datos,1)

## id edad nombres
## 1 1 10 jason
tail(Datos,2)

## id edad nombres
## 5 5 10 morgan
## 6 6 14 Vlad

para acceder a los valores del dataframe se utilizan [],** [[]] y $**.para alterar alguna
información del dataframe, se realiza en forma directa indicando la casilla.
#Cambiar la edad a todos que se llaman vlad
Datos$edad[Datos$nombres=="Vlad"]<-150

para agregar más filas utilizaremos la función rbind() y la función list(), para agregar
columnas debe utilizar cbind(), para eliminar filas estas son reasignadas con un negativo(-
) y en el caso de columnas asignación de un NULL.
nuevos<-data.frame
(genero=sample(1:2,100,replace=TRUE),edad=sample(5:55,100,replace=TRUE))
#agregar un hombre nuevo de 80 años
nuevos<-rbind(nuevos,list(2,80))
#crear la variable nueva n
n<-sample(1:3,101, replace=TRUE)

#agregar la nueva variable a nuevos


nuevos<-cbind(nuevos,n)

Función de conversión
Para realizar conversiones a otros tipos de datos utilice los siguientes conversores:
as.numeric(), as.logical() y as.character()
#Asignamos los valores a la variabe direcciones
direcciones <- c("Norte","Sur","Este","Oeste")
#Categorizamos la variable y luego la mostramos
direcciones.factor <- factor(direcciones)
direcciones.factor

## [1] Norte Sur Este Oeste


## Levels: Este Norte Oeste Sur

#Mostramos la dirección en caracteres


as.character(direcciones.factor)

## [1] "Norte" "Sur" "Este" "Oeste"

#Mostramos la dirección de manera numérica


as.numeric(direcciones.factor)

## [1] 2 4 1 3
#Mostramos la dirección de manera lógica
as.logical(direcciones.factor)

## [1] NA NA NA NA

Sistema de indexación
El sistema de indexacion es una manera eficiente y flexible de acceder selectivamente a
elementos de un objeto, y puede ser numérico o lógico. Por ejemplo, para acceder al tercer
elemento de un vector x, simplemente se escribe x[3]. Si x es una matriz o un marco de
datos el valor de la i-ésima fila y la j-ésima columna se accede con x[i, j]. * construya un
vector A1 de 10 elementos aleatorios entre 1 y 20, muestre algunos de sus componentes.
A1 <- sample(1:10,20,replace=TRUE)
A1[c(1,4,6,20)]

## [1] 6 5 3 8

• construya una matriz M1 de 5x8 y aumente al doble los datos de la columna 3 y los de
las fila 3 y 5.
#Creando matriz 5x8
M1<-matrix (1:10,5,8)
M1

## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]


## [1,] 1 6 1 6 1 6 1 6
## [2,] 2 7 2 7 2 7 2 7
## [3,] 3 8 3 8 3 8 3 8
## [4,] 4 9 4 9 4 9 4 9
## [5,] 5 10 5 10 5 10 5 10

#Se busca la columna 3 y se multiplica por 2


M1[,3] <- M1[,3]*2
#Se buscan las columnas 3 y 5 y se multplican por 2
M1[3,] <- M1[3,]*2
M1[5,] <- M1[5,]*2
M1

## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]


## [1,] 1 6 2 6 1 6 1 6
## [2,] 2 7 4 7 2 7 2 7
## [3,] 6 16 12 16 6 16 6 16
## [4,] 4 9 8 9 4 9 4 9
## [5,] 10 20 20 20 10 20 10 20

llene un vector con la siguiente sentencia: da<-rpois(40, lambda=5).


• utilizando indexación logica, cambie todos los 1 por 3.
• muestre todos los valores pares.
#Creación del vector
da<-rpois(40, lambda=5)
da

## [1] 6 5 5 4 2 5 4 9 4 5 2 7 8 3 9 8 2 5 3 2 10 3 8
## [24] 8 4 9 13 6 5 10 6 6 8 2 7 8 7 3 4 5

#Buscando los valores que son igual a 1


da[da==1]

## integer(0)

#Remplazar los valores multiplicandolos por 3


da[da==1] <-da[da==1] *3
da

## [1] 6 5 5 4 2 5 4 9 4 5 2 7 8 3 9 8 2 5 3 2 10 3 8
## [24] 8 4 9 13 6 5 10 6 6 8 2 7 8 7 3 4 5

Funciones de agrupación y otras.


Funciones Básicas.
• sum(x) suma de los elementos de x
• prod(x) producto de los elementos de x
• max(x) valor maximo en el objeto x
• min(x) valor mínimo en el objeto x
• which.max(x) devuelve el índice del elemento maximo de x
• which.min(x) devuelve el índice del elemento m´inimo de x
• range(x) rango de x o c(min(x), max(x))
• length(x) numero de elementos en x
• mean(x) promedio de los elementos de x
• median(x) mediana de los elementos de x
• var(x) o cov(x) varianza de los elementos de x (calculada en n-1); si x es una matriz o
un marco de datos, se calcula la matriz de varianza-covarianza
• cor(x) matriz de correlacion de ´ x si es una matriz o un marco de datos (1 si x es un
vector)
• var(x, y) o cov(x, y) covarianza entre x y y, o entre las columnas de x y y si son
matrices o marcos de datos
• cor(x, y) correlacion lineal entre ´ x y y, o la matriz de correlacion si ´ x y y son
matrices o marcos de datos Realice algunos ejemplos:

Funciones Complejas.
• round(x, n) redondea los elementos de x a n cifras decimales
• rev(x) invierte el orden de los elementos en x
• sort(x) ordena los elementos de x en orden ascendente; para hacerlo en orden
descendente: rev(sort(x))
• rank(x) alinea los elementos de x
• log(x, base) calcula el logaritmo de x en base “base”
• scale(x) si x es una matriz, centra y reduce los datos; si se desea centrar solamente
utilizar scale=FALSE, para reducir solamente usar center=FALSE (por defecto
center=TRUE, scale=TRUE)
• pmin(x,y,…) un vector en el que el iavo elemento es el m´inimo de x[i], y[i], . . .
• pmax(x,y,…) igual que el anterior pero para el maximo ´
• cumsum(x) un vector en el que el iavo elemento es la suma desde x[1] a x[i]
• cumprod(x) igual que el anterior pero para el producto
• cummin(x) igual que el anterior pero para el m´inimo
• cummax(x) igual que el anterior pero para el maximo ´
• match(x, y) devuelve un vector de la misma longitud que x con los elementos de x que
estan en y (NA si no)
• which(x == a) devuelve un vector de los indices de x si la operacion es ( ´ TRUE) (en
este ejemplo, los valores de i para los cuales x[i] == a). El argumento de esta funcion
debe ser una variable de tipo logico
• choose(n, k) calcula el numero de combinaciones de ´ k eventos en n repeticiones =
n!/[(n-k)!k!]
• na.omit(x) elimina las observaciones con datos ausentes (NA) (elimina la fila
correspondiente si x es una matriz o un marco de datos)
• na.fail(x) devuelve un mensaje de error si x contiene por lo menos un NA
• unique(x) si x es un vector o un marco de datos, devuelve un objeto similar pero
suprimiendo elementos duplicados
• table(x) devuelve una tabla con el numero de diferentes valores de ´ x (t´ipicamente
para enteros o factores)
• subset(x, …) devuelve una seleccion de ´ x con respecto al criterio (…, típicamente
comparaciones: x$V1 <10); si x es un marco de datos, la opcion´ select proporciona las
variables que se mantienen (o se ignoran con -)
• sample(x, size) remuestrea al azar y sin reemplazo size elementos en el vector x; la
opción replace = TRUE permite remuestrear con reemplazo. Realice algunos ejemplos:

Trabajando con R.
Proyecto, realizaremos un análisis sobre datos. Desde este punto usted será evaluado.

Análisis de datos.
Ejercicio 1.
trabajaremos con un conjunto de datos existentes en el archivo encuestados.csv. este
archivo ha recogido los datos de 500 personas de sectores rurales, están organizados en
edad, sexo (0:hombre, 1: mujer) y nivel educacional (0:“Sin estudios”; 1: “Ed.Básica”; 2:
“Ed.Media”; 3:“Ed.Superior”) carguelo en un dataframe llamado enc
ruta<-"C:/Users/Hans/Documents"
setwd(ruta)
#enc<-data.frame(encuestados)
enc<-read.csv("encuestados.csv")

Tendremos que recodificar las categorías. la categoría de sexo, será Hombre y Mujer. y la
categoría de nivel educacional será el descrito arriba.
#Categorizamos sexo en hombre y mujer
enc$sexo<-factor(enc$sexo,levels=c(0,1),labels=c("hombre","mujer"))
#Categorizamos el nivel de estudio en sin estudios, basicos, medios y
superior
enc$estudios<-factor(enc$estudios, levels= c(0,1,2,3), labels =c("sin
estudios", "basicos", "medios", "superior"))

Construiremos una tabla de frecuencia para cada campo.


table(enc$sexo)

##
## hombre mujer
## 237 263

table(enc$edad)

##
## 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
## 21 13 18 21 22 14 17 12 18 14 15 13 14 14 23 19 20 12 16 13 13 17 9 12 10
## 43 44 45 46 48 49 50
## 12 16 10 19 9 15 9

table(enc$estudios)

##
## sin estudios basicos medios superior
## 249 96 92 63

Construya las tablas de frecuencias relativas y expreselas en percentil.


quantile(prop.table(table(enc$sexo)), prob = seq(0, 1, length = 10), type =
5)

## 0% 11.11111% 22.22222% 33.33333% 44.44444% 55.55556% 66.66667%


## 0.4740000 0.4740000 0.4740000 0.4826667 0.4942222 0.5057778 0.5173333
## 77.77778% 88.88889% 100%
## 0.5260000 0.5260000 0.5260000

quantile(prop.table(table(enc$estudios)), prob = seq(0, 1, length = 10), type


= 5)
## 0% 11.11111% 22.22222% 33.33333% 44.44444% 55.55556% 66.66667%
## 0.1260000 0.1260000 0.1485556 0.1743333 0.1862222 0.1897778 0.2430000
## 77.77778% 88.88889% 100%
## 0.3790000 0.4980000 0.4980000

quantile(prop.table(table(enc$edad)), prob = seq(0, 1, length = 10), type =


5)

## 0% 11.11111% 22.22222% 33.33333% 44.44444% 55.55556%


## 0.01875000 0.02083333 0.02500000 0.02708333 0.02916667 0.03125000
## 66.66667% 77.77778% 88.88889% 100%
## 0.03506944 0.03831019 0.04363426 0.04791667

prop.table(table(enc$edad))

##
## 18 19 20 21 22 23
## 0.04375000 0.02708333 0.03750000 0.04375000 0.04583333 0.02916667
## 24 25 26 27 28 29
## 0.03541667 0.02500000 0.03750000 0.02916667 0.03125000 0.02708333
## 30 31 32 33 34 35
## 0.02916667 0.02916667 0.04791667 0.03958333 0.04166667 0.02500000
## 36 37 38 39 40 41
## 0.03333333 0.02708333 0.02708333 0.03541667 0.01875000 0.02500000
## 42 43 44 45 46 48
## 0.02083333 0.02500000 0.03333333 0.02083333 0.03958333 0.01875000
## 49 50
## 0.03125000 0.01875000

prop.table(table(enc$estudios))

##
## sin estudios basicos medios superior
## 0.498 0.192 0.184 0.126

Verifique cuantos valores están perdidos. para esto utilice la opción useNA=“ifany”
#Se buscan los valores perdidos de manera separada para cada campo de la
tabla
table(enc$edad,useNA="ifany")

##
## 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
## 21 13 18 21 22 14 17 12 18 14 15 13 14 14 23
## 33 34 35 36 37 38 39 40 41 42 43 44 45 46 48
## 19 20 12 16 13 13 17 9 12 10 12 16 10 19 9
## 49 50 <NA>
## 15 9 20

table(enc$sexo,useNA="ifany")
##
## hombre mujer
## 237 263

table(enc$estudios,useNA="ifany")

##
## sin estudios basicos medios superior
## 249 96 92 63

Construya una tabla de referencias cruzadas, entre estudio y sexo, para saber como se
distribuyen los datos por genero.
table(enc$estudios,enc$sexo)

##
## hombre mujer
## sin estudios 114 135
## basicos 43 53
## medios 48 44
## superior 32 31

construya rangos de edad utilizando las funciones range(),nclass.Sturges(), seq() y cut()


#determinar rango de las edades
rango<-range(edad,na.rm = TRUE)
#10 posibles columnas de histograma
nc<-nclass.Sturges(edad)
#hace las 10 secuencias
se<-seq(18,30, length=nc)
#Se hacen los intervalos de edad
intervalos<-cut(edad,breaks = se,include.lowwest = TRUE)
intervalosEdad=cut(edad,breaks=seq(18,30,length=nclass.Sturges(edad)),include
.lowest=TRUE)
intervalosEdad # Se muestran los intervalos de edad, uno correspondiente a
cada edad observada

## [1] <NA> <NA> <NA> <NA> <NA> <NA>


## Levels: [18,22] (22,26] (26,30]

table(intervalos)

## intervalos
## (18,22] (22,26] (26,30]
## 0 0 0

hist(table(intervalos))
realice un resumen
de los Encuestados.
#Resumen por edad, sexo y estudios
summary(enc)

## edad sexo estudios


## Min. :18.00 hombre:237 sin estudios:249
## 1st Qu.:24.00 mujer :263 basicos : 96
## Median :32.00 medios : 92
## Mean :32.39 superior : 63
## 3rd Qu.:40.00
## Max. :50.00
## NA's :20

Represente gráficamente los datos. utilice los siguientes gráficos para representar los
datos: pie(), barplot(), hist(),boxplot(), plot()
hist(enc$edad, col="orange", main="Histograma de las
edades",xlab="Edad",ylab="Catidad de personas")
boxplot(enc$edad, col="red", main="Edad")

pie(table(enc$estudios), col= rainbow(10))


estudios <- table(enc$sexo)
barplot(estudios, main="sexo", col=c("Blue","Pink"))
plot(enc$estudios , main="Nivel de estudios", col=c("darkolivegreen1",
"darkolivegreen2","darkolivegreen3","darkolivegreen4"))

###Ejercicio 2
Revisemos la felicidad del planeta. instalaremos el paquete Lock5Data. extraeremos el
dataframe HappyPlanetIndex, para esto usaremos las funciones data() y attach(), y le
renombraremos a feliz. cargue del mismo modo los datos de SalaryGender (muestra de 100
profesores universitarios y sus sueldos) 50% hombres (Mujer=0,Hombre=1), se registra el
sueldo anual en miles de dolares, la edad y la variable PhD que indica con un 1 si es un
doctor. llame a este dataframe Sueldos.
#install.packages("Lock5Data")

library(Lock5Data)

data("HappyPlanetIndex")

feliz<-HappyPlanetIndex

data("SalaryGender")

sueldos<-SalaryGender

Aplicaremos distintas formas de ver la información. para cambiar los colores de los graficos
utilice las siguientes opciones. col = “red”,“blue”,“darkolivegreen1”,rainbow(10),“lightblue”
Por medio de un grafico de dispersión muestre la relación entre la Felicidad y la esperanza
de vida. utilice la función plot()
#Asignamos los campos a las variables x e y

x <- feliz$Happiness
y <- feliz$LifeExpectancy

#Mostramos los valores asignados mediante un grafico de barras

plot(x,y, col =c("red","blue"),main="Relación entre felicidad y esperanza" ,


ylab="Expectativa de vida", xlab="Felicidad")

por medio de un
histograma muestre la frecuencia de los niveles de felicidad. utilice la función hist()
hist(feliz$Happiness, col="yellow", main= "Niveles de
felicidad",xlab="Felicidad")
Instale el paquete
plotrix. categorice el genero de los docentes en Hombres(1) y mujeres(0). utilice la función
histStack(), enfrente el salario versus el género.
data("SalaryGender")
Sueldos<-SalaryGender
Sueldos$Gender<-factor(Sueldos$Gender,levels =c(0:1),labels =
c("Mujer","Hombre"))
#install.packages("plotrix")
library(plotrix)
histStack(Sueldos$Salary,Sueldos$Gender)
Mediante un
diagrama de barras muestra el nivel de felicidad por región. utilice la opción
col=rainbow(10) en la función barplot(), esta debe recibir una tabla de frecuencia.
felicidad <- table(feliz$Happines,feliz$Region)

barplot(felicidad, main="Nivel de felicidad por región", col=rainbow(10) ,


xlab="Región", ylab="Nivel de felicidad" )
categorice los PhD
en los niveles Doctorado y Sin Doctorado. construya un grafico de barras categorizado.
Muestre la cantidad de hombres y mujeres que son doctor y que no son doctor. utilice dos
colores para diferenciar hombres de mujeres.
sueldos$PhD<-factor(sueldos$PhD, levels= c(0,1), labels =c("Sin Doctorado",
"Doctorado"))
sueldos$Gender<-factor(sueldos$Gender, levels= c(0,1), labels =c("Mujer",
"Hombre"))

barplot(table(sueldos$Gender,sueldos$PhD),beside=TRUE,
col=c("pink","black"))
Muestre el
promedio de felicidad por región. utilice un gráfico de cajas para un mejor análisis. cada
caja debe ser de color gold, la etiqueta del eje X es Nivel de Felicidad, y el del eje y es
Region. el titulo del gráfico es Felicidad promedio por Región, los datos enfrentados son
Happiness y Región (utilice el operador ~)
boxplot(feliz$Happiness ~ feliz$Region , col="gold",xlab="Region",ylab="Nivel
de felicidad",
main="Felicidad promedio por región")