-
Notifications
You must be signed in to change notification settings - Fork 0
/
matrices.Rmd
572 lines (357 loc) · 13.3 KB
/
matrices.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
---
title: "Introducción a R II"
author: "joseangeldiazg"
date: "13/12/2017"
output: html_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
# Matrices, factores y dataframes
## 2.1 Matrices
* Ejecuta los siguientes comandos.
```{r}
matrix(data=5, nr=2, nc=2)
matrix(1:6, 2, 3)
matrix(1:6, 2, 3, byrow=TRUE)
```
* Crea un vector z con los 30 primeros números y crea con el una matriz m con 3 filas y 10 columnas.
```{r}
z<-c(1:30)
m<-matrix(data=z, nr=3, nc=10, byrow = TRUE)
```
* Escribe la tercera columna en un vector
```{r}
z<-m[,3]
```
*Create in R the matrices
x =3 21
−1 1
y =1 4 0
0 1 -1
```{r}
x<-c(3,21,-1,1)
xmatrix<-matrix(data=x,ncol = 2, nrow = 2, byrow = TRUE)
xmatrix
y<-c(1,4,0,0,1,-1)
ymatrix<-matrix(data=y, ncol=3, nrow=2, byrow = TRUE)
ymatrix
```
* Y calcula los efectos de los siguientes comandos
1. (a) x[1,]
2. (b) x[2,]
3. (c) x[,2]
4. (d) y[1,2]
5. (e) y[,2:3]
```{r}
xmatrix[1,]
xmatrix[2,]
xmatrix[,2]
ymatrix[1,2]
ymatrix[,2:3]
```
* Transforma la matriz m que creaste en el ejercicio anterior en un array multidimensional.
```{r}
z<-c(1:30)
m<-matrix(data=z, nr=3, nc=10, byrow = TRUE)
marray = array(m, dim=c(dim(m),2))
marray
```
* Crea un array de 5 x 5 y rellénalo con valores del 1 al 25. Investiga la función array(). Llama al array x
```{r}
x<-array(1:25, dim=c(5,5,1))
x
```
* Escribe el array x en un vector y
```{r}
y<-x[1:25]
```
* Dadas las matrices m1 y m2 usa rbind() y cbind() para crear matrices nuevas utilizando estas funciones, llamalas M1 y M2. ¿En que se diferencian las matrices creadas?
```{r}
m1 <- matrix(1, nr = 2, nc = 2)
m2 <- matrix(2, nr = 2, nc = 2)
M1 <-cbind(m1, m2)
M2 <-rbind(m1, m2)
M1
M2
```
La diferencia está en que cbind une por las columnas y rbind une por filas
* El operador para el producto de dos matrices es ‘ %* %’. Por ejemplo, considerando las dos matrices creadas en el ejercicio anterior utilízalo.
```{r}
M1%*%M2
```
* Usa la matriz M1 del ejercicio anterior y aplica la función t(). ¿qué hace esa función?
```{r}
help(t)
t(M1)
```
La función T nos ofrece la matriz o el dataframe traspuesto del que le pasemos como argumento
* Ejecuta los siguientes comandos basados en la función diag() sobre las matrices creadas anteriormente m1 y m2. ¿Qué tipo de acciones puedes ejecutar con ella?
```{r}
diag(m1)
diag(rbind(m1, m2) %*% cbind(m1, m2))
diag(m1) <- 10
diag(3)
v <- c(10, 20, 30)
diag(v)
diag(2.1, nr = 3, nc = 5)
```
La función diag nos permite obtener la diagonal de una matriz dada o crear una matriz con una diagonal especificada-
* Ordena la matriz x <- matrix(1:100, ncol=10):
1. En orden descendente por su segunda columna y asigna el resultado a una nueva matrix x1. Pista: función order()
2. En orden descendente por su segunda fila y asigna el resultado a una nueva matrix x2
3. Ordena solo la primera columna de x de forma descendente
```{r}
x <- matrix(1:100, ncol=10)
x1<-x[order(x[,2], decreasing=TRUE),]
x2<-x[order(x[2,], decreasing=TRUE),]
x[,1] <- sort(x[,1],decreasing = TRUE)
x1 <- x
```
* Accede al dataset “women”.
1. Primero confirma que los datos están ordenados de forma creciente según la altura (height) y el peso (weight) sin mirar los datos.
2. Crea una nueva variable “bmi”. Este valor responde a la siguiente fórmula:
*BMI = ( Weight in Pounds / (Height in inches) x (Height in inches) ) x 703*
3. Ordena el dataframe por el valor de bmi y por orden alfabético de la variable name
```{r}
str(women)
is.unsorted(women$height)
is.unsorted(women$weight)
women$bmi<-(women$weight/women$height^2)*703
order(women$bmi)
```
* Crea los siguientes vectores:
Box office Star Wars: In Millions (!) First element: US, Second element:Non-US
```{r}
new_hope = c(460.998007, 314.4)
empire_strikes = c(290.475067, 247.9)
return_jedi = c(309.306177, 165.8)
```
* Construye la matriz star_wars_matrix con esos vectores
```{r}
star_wars_matrix<-rbind(new_hope,empire_strikes,return_jedi )
star_wars_matrix
```
* Añádele nombres a las columnas y filas de la matriz según las descripciones dadas anteriormente de los datos
```{r}
colnames(star_wars_matrix)<-c("US","Non-US")
star_wars_matrix
```
* Calcula las ganacias mundiales de cada película y guardalas en un vector que se llame worldwide_vector.
```{r}
worldwide_vector<-rowSums(star_wars_matrix)
```
* Añade éste último vector como una columna nueva a la matriz star_wars_matrix y asigna el resultado a all_wars_matrix. Usa para ello la función cbind().
```{r}
all_wars_matrix<-cbind(star_wars_matrix,worldwide_vector)
all_wars_matrix
```
* Calcula las ganancias totales en USA y fuera de USA para las tres películas. Puedes usar para ello la función colSums()
```{r}
colSums(all_wars_matrix[,1:2])
```
* Calcula la media de ganancias para todas las películas fuera de los estados unidos. Asigna esa media la variable non_us_all.
```{r}
non_us_all<-mean(all_wars_matrix[,2])
```
* Haz lo mismo pero solo para las dos primeras películas . Asigna el resultado a la variable non_us_some.
```{r}
non_us_some<-mean(all_wars_matrix[1:2,2])
```
* Calcula cuantos visitantes hubo para cada película en cada área geográfica. Ya tienes las ganancias totales en star_wars_matrix. Asume que el precio de las entradas es de cinco euros/dólares.
```{r}
star_wars_matrix/5
```
* Calcula la media de visitantes en territorio USA y en territorio noUS
```{r}
mean(star_wars_matrix[,1]/5)
mean(star_wars_matrix[,2]/5)
```
## 2.2 Subsetting matrices y arrays
* Crea un array i <- array(c(1:10),dim=c(5,2)). ¿Que información te dan los siguientes comandos?
```{r}
i <- array(c(1:10),dim=c(5,2))
dim(i)
#Nos dice el número de filas y columnas
nrow(i)
#Nos dice el número de filas
ncol(i)
#Nos dice el número de columnas
```
* Crea un array de dimensiones 5 filas y dos columnas y rellénalo con valores del 1-5 y del 5 al 1
```{r}
x <- array(c(c(1:5),c(5:1)), dim = c(5,2))
```
* ¿Qué hace el comando x[i]? ¿y el comando x[i] <- 0? Comprueba que tienes en x antes.
```{r}
x
x[6]
```
Devuelve el elemento i del array pero lo hace por columnas. El otro comando asigna el valor que pasamos a la derecha de <-, en este caso 0, al elemento i del array.
* Descárgate el fichero array_datos.txt de PRADO (Datos/) e impórtalo en tu work space de R teniendo en cuenta que es un texto tabulado. Después crea un documento con los mismos datos pero en formato csv en vez de tab separated.
```{r}
array_datos<-read.table("./datasets/array_datos.txt")
array_datos
write.csv(array_datos, file="./datasets/array_datos2.csv")
```
## 2.3 Factors
* Dado x = c(1, 2, 3, 3, 5, 3, 2, 4, NA), ¿cuáles son los levels de factor(x)?
```{r}
x = c(1, 2, 3, 3, 5, 3, 2, 4, NA)
factor(x)
```
Los NA no se tiene como posibles valores del factor, por lo que los niveles de este serán 1, 2, 3, 4 y 5.
* Dado x <- c(11, 22, 47, 47, 11, 47, 11) y la ejecución de la sentencia factor(x, levels=c(11, 22, 47), ordered=TRUE)¿cuál es el cuarto elemento de la salida?
```{r}
x <- c(11, 22, 47, 47, 11, 47, 11)
factor(x, levels=c(11, 22, 47), ordered=TRUE)
```
No hay cuarto elemento, ya que solo tenemos tres posibles valores para el factor
* Para el factor z <- c("p", "a" , "g", "t", "b"), reemplaza el tercer elemento de z por "b".
```{r}
z <- c("p", "a" , "g", "t", "b")
z[3] <- "b"
z
```
* Dado z <- factor(c("p", "q", "p", "r", "q")) escribe una expresión de R que cambie el level "p" a "w"
```{r}
z <- factor(c("p", "q", "p", "r", "q"))
z
levels(z)[1] <- "w"
z
```
* Usa el dataset “iris” Escribe la expresión necesaria para convertir la variable “Sepal.Length” en un factor con cinco niveles (levels) .
```{r}
irisfactor <- factor(cut(iris$Sepal.Length, b=5))
irisfactor
```
* El factor responses se define como:
*responses <- factor(c("Agree", "Agree", "Strongly Agree", "Disagree", "Agree")) *
Sin embargo nos damos cuenta que tiene un nuevo nivel, "Strongly Disagree", que no estaba presente cuando se creó. Añade el nuevo nivel al factor y conviértelo en un factor ordenado de la siguiente forma:
*Levels: Strongly Agree < Agree < Disagree < Strongly Disagree*
```{R}
responses <- factor(c("Agree", "Agree", "Strongly Agree", "Disagree", "Agree"))
levels(responses) = c(levels(responses), "Strongly disagree")
responses = factor(responses, levels(responses)[c(3,1:2,4)], ordered = TRUE)
responses
```
* Dado el factor:
*x <- factor(c("high", "low", "medium", "high", "high", "low", "medium"))*
Escribe la expresión en R que permita dar valores numéricos únicos para los distintos niveles (levels) de x según el siguiente esquema:
*level high => value 1 level low => value 2 level medium => value 3*
```{r}
x <- factor(c("high", "low", "medium", "high", "high", "low", "medium"), levels=c("high","low","medium"),labels=c(1,2,3))
unique(x)
```
# 2.4 Acceso y selección de secciones de un data frames
Vamos a trabajar con un ejemplo que viene por defecto en la instalación de R USArrests. Este data frame contiene la información para cada estado Americano de las tasas de criminales (por 100.000 habitantes). Los datos de las columnas se refieren a Asesinatos, violaciones yporcentaje de la población que vive en áreas urbanas. Los datos son de 1973. Contesta a las siguientes preguntas sobre los datos:
1. Las dimensiones del dataframe
2. La longitud del dataframe (filas o columnas)
3. Numero de columnas
```{r}
USArrests
dim.data.frame(USArrests) # 50 * 4
nrow(USArrests) # 50
ncol(USArrests) # 4
```
* ¿Cómo calcularías el número de filas?
```{r}
nrow(USArrests)
```
* Obtén el nombre de las filas y las columnas para este data frame
```{r}
row.names(USArrests)
colnames(USArrests)
```
* Échale un vistazo a los datos, por ejemplo a las seis primeras filas
```{r}
head(USArrests, 6)
```
*Ordena de forma decreciente las filas de nuestro data frame según el porcentaje de población en el área urbana. Para ello investiga la función order () y sus parámetros.
```{r}
USArrests[order(USArrests$UrbanPop, decreasing = TRUE),]
```
* ¿Podrías añadir un segundo criterio de orden?, ¿cómo?
```{r}
USArrests[order(c(USArrests$UrbanPop,USArrests$Assault), decreasing = TRUE),]
```
* Muestra por pantalla la columna con los datos de asesinato
```{r}
USArrests$Murder
```
* Muestra las tasas de asesinato para el segundo, tercer y cuarto estado
```{r}
USArrests$Murder[2:4]
```
* Muestra las primeras cinco filas de todas las columnas
```{r}
USArrests[1:5,]
```
* Muestra todas las filas para las dos primeras columnas
```{r}
USArrests[,1:2]
```
* Muestra todas las filas de las columnas 1 y 3
```{r}
USArrests[,c(1,3)]
```
* Muestra solo las primeras cinco filas de las columnas 1 y 2
```{r}
USArrests[1:5,1:2]
```
* Extrae las filas para el índice Murder
```{r}
USArrests$Murder
```
* ¿Que estado tiene la menor tasa de asesinatos? ¿qué línea contiene esa información?, obtén esa información
```{r}
minorMurder = USArrests[order(USArrests$Murder, decreasing = TRUE),]
minorMurder[nrow(minorMurder),]
```
*¿Que estados tienen una tasa inferior al 4%?, obtén esa información
```{r}
minorMurder[minorMurder$Murder<4,]
```
* ¿Que estados estan en el cuartil superior (75) en lo que a poblacion en zonas urbanas se refiere?
```{r}
rownames(USArrests[USArrests[,"UrbanPop"]>quantile(USArrests[,"UrbanPop"],.75),])
```
* Vamos a trabajar con otro dataframe. Descarga el fichero student.txt de la plataforma PRADO, almacena la información en una variable llamada “students”. Ten en cuenta que los datos son tab-delimited y tienen un texto para cada columna. Comprueba que R ha leído correctamente el fichero imprimiendo el objeto en la pantalla.
```{r}
students<-read.table("./datasets/student.txt", header = TRUE)
students
```
* Imprime solo los nombres de la columnas
```{r}
colnames(students)
```
* Llama a la columna height solo
```{r}
students$height
```
* ¿Cuantas observaciones hay en cada grupo?. Utiliza la función table(). Este commando se puede utilizar para crear tablas cruzadas (cross-tabulations)
```{r}
table(students)
```
* Crea nuevas variables a partir de los datos que tenemos. Vamos a crear una variable nueva “sym” que contenga M si el genero es masculino y F si el genero es femenino. Busca en la ayuda información sobre la función ifelse(). Crea una segunda variable “colours” cuyo valor será “Blue” si el estudiante es de kuopio y “Red” si es de otro sitio.
```{r}
sym<-ifelse(students$gender=="male", "M", "F")
colours<-ifelse(students$population=="kuopio", "Blue", "Red")
```
* Con los datos anteriores de height y shoesize y las nuevas variables crea un nuevo data.frame que se llame students.new
```{r}
students.new<-cbind(students,sym, colours)
```
* Comprueba que la clase de student.new es un dataframe
```{r}
str(students.new)
```
* Crea dos subsets a partir del dataset student. Dividelo dependiendo del sexo. Para ello primero comprueba que estudiantes son hombres (male). Pista: busca información sobre la función which. Basándote en esa selección dada por which() toma solo esas filas del dataset student para generar el subset stundent.male
```{r}
students.male = students.new[which(students.new$sym=="M"),]
students.female = students.new[which(students.new$sym=="F"),]
```
* Utiliza la function write.table() para guarder el contenido de student.new en un archivo.
```{r}
write.table(students.new, "./datasets/studentsnew.txt", col.names = TRUE)
```