-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy path6-2_manipulacion_de_objetos.r
539 lines (354 loc) · 17.4 KB
/
6-2_manipulacion_de_objetos.r
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
################################################################################
### R BASICS WORKSHOP ###
### EJERCICIO 7-2: Indexación de objectos (y un poco de gráficos) ###
### ###
### Unida de Servicios Bioinformáticos ###
### Instituto Nacional de Medicina Genómica ###
### Website: github.com/hachepunto/R_Basics_workshop ###
################################################################################
### INTRODUCCIÓN ############################################## #################
# En este ejercicio, usted explorará valores de las variables predictoras para
# el modelo IGM2 (el modelo discutido en el ejercicio 5.1). Usted va a utilizar
# un set de datos con los valores de precipitación anual (Ran, en mm), la
# evapotranspiración potencial mínima (PETmin, en milímetros) y de la elevación
# (TOPOG, en metros ) para áreas a través del Neotrópico occidental.
## TAREA 1 ##
# Definir el directorio de trabajo utilizando la función "setwd". Verificar el
# cambio correcto utilizando la función "getwd". Aquí también puede usa las
# opciones en las pestañas de las ventanas de R o RStudio.
## TAREA 2 ##
# Use la función "read.table" para crear un objeto (clase marco de datos)
# llamado "neo_IGM2" con los datos en el archivo "data_neotropicooccidente_igm2.txt"
# (disponible en el sitio web del taller). Este archivo tiene valores separados
# por comas y columnas con nombres en la primera fila. El archivo contiene los
# valores de Ran, PETmin y TOPOG para varias zonas Neotropicales. Cada área se
# identifica por un número (columna "Point.id") y las coordenadas ("Lat" y
# "Lon"). Estas coordenadas se proyectan geográficamente de manera que
# corresponden al centro de celdas de una cuadrícula de igual área (i.e., estas
# no son latitud y longitud en grados decimales). Cada área tiene a 100 km x 100
# kilómetros. Una vez haya abierto el archibo, examine las cinco primeras filas
# escribiendo "neo_IGM2 [1: 5,]" en la consola.
## TAREA 3 ##
# El marco de datos "neo_IGM2" tiene valores perdidos de PETmin o TOPOG en
# varias áreas geográficas. Estas áreas muestran "NA" en lugar de valores
# numéricos. El siguiente código utiliza la función "plot", junto con corchetes
# (para la indexación) para visualizar todas las áreas de "neo_IGM2". Luego,
# utiliza la función "points" y corchetes de indexación para diferenciar las
# zonas con valores numéricos de Ran, PETmin y TOPOG.
plot(neo_IGM2[,2], neo_IGM2[,3])
points(neo_IGM2[!is.na(neo_IGM2[,4]),2], neo_IGM2[!is.na(neo_IGM2[,4]),3], pch=19)
## TAREA 4 ##
# Para representar mejor el Neotrópico occidental,utilice el argumento "asp = 1"
# de la función "plot". Lea sobre este argumento en la página de ayuda para la
# función "plot".
plot(neo_IGM2[,2], neo_IGM2[,3], asp=1)
points(neo_IGM2[!is.na(neo_IGM2[,4]),2], neo_IGM2[!is.na(neo_IGM2[,4]),3], pch=19)
## TAREA 5 ##
# Use y estudie el código siguiente para examinar la relación entre Ran y
# PETmin a través del Neotrópico:
plot(neo_IGM2[,4], neo_IGM2[,5], pch=19, xlab="Ran (mm)", ylab="PETmin (mm)")
#or
plot(neo_IGM2$Ran, neo_IGM2$PETmin, pch=19, xlab="Ran (mm)", ylab="PETmin (mm)")
## TAREA 6 ##
# Lleve a cabo una versión modificada de la tarea 5 usando argumentos "cex.axis"
# y "cex.lab". Use y estudie este código:
plot(neo_IGM2[,4], neo_IGM2[,5], pch=19, xlab="Ran (mm)", ylab="PETmin (mm)",
cex.axis=1.5, cex.lab=1.5)
## TAREA 7 ##
# Inspeccione la relación entre Ran y el logaritmo natural de TOPOG usando la
# función "plot".
## TAREA 8 ##
# Ver la relación entre PETmin y el logaritmo natural de TOPOG usando la
# función "plot"
## TAREA 9 ##
# Calcule el rango de los valores de Ran utilizando la función "range". Consulte
# la ayuda de esta función. Estudie este código:
range(neo_IGM2[!is.na(neo_IGM2[,4]),4])
## TAREA 10 ##
# Un investigador intenta obtener el rango de valores de Ran a través de todo el
# Neotrópico utilizando este código:
range(neo_IGM2[,4])
# Hay un problema, lo puede ver? Describa el problema y resuelvalo. Lea la
# página de ayuda de la función "range".
## TAREA 11 ##
# Calcule el rango de valores de PETmin.
## TAREA 12 ##
# Calcule el rango de valores de TOPOG
## TAREA 13 ##
# Lleve a cabo versiones modificadas de las TAREAS 3 a 12 usando el operador "$"
# y los nombres de las columnas de "neo_IGM2". Por ejemplo, para la tarea 3,
# utilice este código:
plot(neo_IGM2$Lon, neo_IGM2$Lat)
points(neo_IGM2$Lon[!is.na(neo_IGM2$Ran)], neo_IGM2$Lat[!is.na(neo_IGM2$Ran)], pch=19)
## TAREA 14 ##
# Hay otra manera de acceder a las variables en un marco de datos: usando
# corchetes rectangulares y el nombre de la variable entre comillas:
neo_IGM2["Lon"]
# Sin embargo, hay una diferencia entre neo_IGM2 [, 2] y neo_IGM2$Lon por un
# lado, y neo_IGM2["Lon"] en el otro. ¿Cual es esta diferencia? Vea la página 11
# de "R para principiantes". Esta diferencia también puede verse mediante este
# código:
class(neo_IGM2[,2])
class(neo_IGM2$Lon)
class(neo_IGM2["Lon"])
is.vector(neo_IGM2[,2])
is.vector(neo_IGM2$Lon)
is.vector(neo_IGM2["Lon"])
attributes(neo_IGM2[,2])
attributes(neo_IGM2$Lon)
attributes(neo_IGM2["Lon"])
## TAREA 15 ##
# Utilice el siguiente código para observar algunas de las consecuencias de la
# diferencia entre neo_IGM2[,2] y neo_IGM2$Lon por un lado, y neo_IGM2["Lon"]
# por el otro. Lea cuidadosamente el mensaje de error después de la tercera
# línea de código y explique el problema.
plot(neo_IGM2[,2], neo_IGM2[,3])
plot(neo_IGM2$Lon, neo_IGM2$Lat)
plot(neo_IGM2["Lon"], neo_IGM2["Lat"])
## TAREA 16 ##
# Use corchetes de indexación para extraer de "neo_IGM2" sólo en las zonas con
# valores numéricos de Ran, PETmin, y TOPOG. Guarde el resultado en una marco de
# datos denominado "Neot.occ.IGM2". Utilice y estudie este código:
Neot.occ.IGM2 <- neo_IGM2[!is.na(neo_IGM2[,4]),]
Neot.occ.IGM2[1:5,]
# Ahora, el código para examinar ciertas relaciones es más simple. Por ejemplo,
# para la TAREA 3 use:
plot(neo_IGM2[,2], neo_IGM2[,3])
points(Neot.occ.IGM2[,2], Neot.occ.IGM2[,3], pch=19)
## TAREA 17 ##
# Utilice la función "read.table" para crear un marco de datos denominado
# "neo_COL" con los datos del archivo "neotropicooccidente_col.txt" (disponible
# en el sitio web del taller). Tenga en cuenta que las columnas en el archivo
# "neotropicooccidente_col.txt" tienen cabeceras y que los valores están
# separados por comas. En la columna "especimenes" de este marco de
# se encuentra el número de especímenes de herbario que se han recogido en
# varias zonas neotropicales. Un investigador quiere utilizar estas muestras
# para calcular la riqueza de especies en cada áreas para poner a prueba
# predicciones derivadas del IGM2. Cada área se identifica con un número en la
# columna "Point.id" y coordenadas ("Latitud" y "Lon"). Como antes, las
# coordenadas están proyectadas. Después de crear el marco de datos, examine las cinco
# primeras filas usando:
neo_COL[1:5,]
## TAREA 18 ##
# El marco Datos "neo_COL" tiene áreas geográficas para las cuales no hay
# información en el número de ejemplares disponibles. Estas áreas tienen "NA" en
# lugar de un valor numérico en la columna "especimenes". Use corchetes de
# indexación para extraer del marco de datos "neo_COL" sólo valores numéricos
# para "especimenes". Almacene los resultados en un nuevo marco de datos llamado
# "Neot.occ.COL". Examine el resultado mirando las primeras cinco filas:
Neot.occ.COL[1:5,]
## TAREA 19 ##
# ¿Cuáles son las dimensiones de "Neot.occ.IGM2" y de "Neot.occ.COL"? Utilice la
# función "dim". Tienen el mismo número de filas?
## TAREA 20 ##
# Use la función "identical" en combinación con corchetes de indexación para
# determinar si las tres primeras columnas de "Neot.occ.IGM2" son idénticas a
# las respectivas columnas de "Neot.occ.COL".
## TAREA 21 ##
# Si las tres primeras columnas de "Neot.occ.IGM2" son idénticas a las de
# "Neot.occ.COL", proceda a la consolidación de los datos en un solo marco de
# datos. Si no son identicas, examine su código para descubrir la causa de las
# diferencias. Consolide los datos en un marco de datos llamado "Neot.occ".
# Utilice la función "data.frame" para unir todas las columnas de "Neot.occ.IGM2"
# con la cuarta columna de "Neot.occ.COL".
Neot.occ <- cbind(Neot.occ.IGM2, Neot.occ.COL[,4])
# Examine las primeras cinco filas de su resultado:
Neot.occ[1:5,]
# Cambie el nombre de la última columna de "Neot.occ" usando la función
# "colnames". Primero, use este código para ver los nombres de las columnas de
# "Neot.occ":
colnames(Neot.occ)
# Utilice corchetes de indexación para ver el nombre que va a cambiar:
colnames(Neot.occ)[7]
# Ahora, cambie el nombre usando el operador "<-" de asignar:
colnames(Neot.occ)[7] <- "Especimenes"
# Vea el resultado:
Neot.occ[1:5,]
# Examine Los atributos de "Neot.occ", y asegúrese de que se trata de un marco
# de datos:
attributes(Neot.occ)
## TAREA 22 ##
# Examine la distribución del número de ejemplares en las zonas incluidas en
# "Neot.occ" usando la función "summary".
## TAREA 23 ##
# ¿Cuántas áreas hay en "Neot.occ" con menos de 500 especímenes de herbario?
# ¿Cuál es la proporción de las áreas de "Neot.occ" con menos de 500 herbario
especímenes #?
## TAREA 24 ##
# ¿Cuántas áreas hay en "Neot.occ" con menos de 1000 especímenes de herbario?
# ¿Cuál es la proporción de áreas de "Neot.occ" con menos de 1000
# especímenes de herbario?
# ¿Cuántas áreas hay en "Neot.occ" con menos de 2.000 especímenes de herbario?
# ¿Cuál es la proporción de áreas de "Neot.occ" con menos de 2000
# especímenes de herbario?
# ¿Cuántas áreas hay en "Neot.occ" con menos de 3000 especímenes de herbario?
# ¿Cuál es la proporción de áreas de "Neot.occ" con menos de 3000
# especímenes de herbario?
## TAREA 25 ##
# Cree un mapa de las áreas incluidas en "Neot.occ" usando el siguiente código:
plot(Neot.occ[,2], Neot.occ[,3], asp=1, xlab="Longitude (m)",
ylab="Latitude (m)", cex.axis=1.5, cex.lab=1.5)
## TAREA 26 ##
# Use la función "points" para distinguir (en el mapa que ha creado) las zonas
# con al menos 3000 especímenes de herbario. Un investigador tiene previsto
# utilizar estas áreas para probar predicciones derivadas del IGM2 dado que
# están relativamente bien muestreadas. OK, 3000 especímenes no es mucho para
# áreas de 100 km x 100 km (que es el tamaño de las zonas de "Neot.occ"), pero
# es relativamente alto para el Neotrópico.
## TAREA 27 ##
# Examine la relación entre Ran y PETmin a través de las áreas en las "Neot.occ"
# usando "plot" en combinación con corchetes de indexación.
## TAREA 28 ##
# Use la función "points" para distinguir áreas con al menos 3.000 especímenes
# de herbario (en la figura que ha creado en la tarea 27). Si el investigador
# fuera a enfocarse en estas áreas, ¿se perdería una porción significativa de la
# variación ambiental definida por Ran y PETmin?
## TAREA 29 ##
# Examine la relación entre Ran y el logaritmo natural de TOPOG a través de las
# zonas de "Neot.occ" usando la función "plot" y corchetes para indexación.
# Utilice la función "points" para diferenciar las zonas con al menos 3000
# especímenes de herbario. Si el investigador fuera a enfocarse en estas áreas,
# ¿se perdería una porción significativa de la variación ambiental definida por
# Ran y TOPOG?
## TAREA 30 ##
# Examine la relación entre PETmin y el logaritmo natural de TOPOG a través de
# las zonas de "Neot.occ" utilizando la función "plot" y corchetes. Utilice
# la función de "points" para distinguir áreas con al menos 3.000 especímenes de
# herbario.
## TAREA 31 ##
# Calcula el rango de Ran, PETmin y TOPOG en las zonas de "Neot.occ" que tienen
# al menos 3.000 especímenes de herbario.
################################################################################
### SOLUCIONES PARA TAREAS #####################################################
################################################################################
## TAREA 1 ##
setwd("C:/_transfer/R_Basics_Workshop/St_Louis_May_2015/Drafts/Day2")
# Este es directorio de trabajo en la computadora de Iván
getwd()
## TAREA 2 ##
neo_IGM2 <- read.table("data_neotropicooccidente_igm2.txt", header=T, sep=",")
neo_IGM2[1:5,]
#or
head(neo_IGM2)
## TAREA 3 ##
# Ya tiene todas las respuestas
## TAREA 4 ##
# Ya tiene todas las respuestas
## TAREA 5 ##
# Ya tiene todas las respuestas
## TAREA 6 ##
# Ya tiene todas las respuestas
## TAREA 7 ##
plot(neo_IGM2[,4], log(neo_IGM2[,6]), pch=19, xlab="Ran (mm)",
ylab="Log(TOPOG (m))", cex.axis=1.5, cex.lab=1.5)
## TAREA 8 ##
plot(neo_IGM2[,5], log(neo_IGM2[,6]), pch=19, xlab="PETmin (mm)",
ylab="Log(TOPOG (m))", cex.axis=1.5, cex.lab=1.5)
## TAREA 9 ##
# Ya tiene todas las respuestas
## TAREA 10 ##
range(neo_IGM2[!is.na(neo_IGM2[,4]),4])
#or
range(neo_IGM2[,4], na.rm=T)
## TAREA 11 ##
range(neo_IGM2[!is.na(neo_IGM2[,5]),5])
#or
range(neo_IGM2[,5], na.rm=T)
## TAREA 12 ##
range(neo_IGM2[!is.na(neo_IGM2[,6]),6])
#or
range(neo_IGM2[,6], na.rm=T)
## TAREA 13 ##
plot(neo_IGM2$Lon, neo_IGM2$Lat, asp=1)
points(neo_IGM2$Lon[!is.na(neo_IGM2$Ran)], neo_IGM2$Lat[!is.na(neo_IGM2$Ran)],
pch=19)
plot(neo_IGM2$Ran, neo_IGM2$PETmin, pch=19, xlab="Ran (mm)", ylab="PETmin (mm)")
plot(neo_IGM2$Ran, neo_IGM2$PETmin, pch=19, xlab="Ran (mm)", ylab="PETmin (mm)",
cex.axis=1.5, cex.lab=1.5)
plot(neo_IGM2$Ran, log(neo_IGM2$TOPOG), pch=19, xlab="Ran (mm)",
ylab="Log(TOPOG (m))", cex.axis=1.5, cex.lab=1.5)
plot(neo_IGM2$PETmin, log(neo_IGM2$TOPOG), pch=19, xlab="PETmin (mm)",
ylab="Log(TOPOG (m))", cex.axis=1.5, cex.lab=1.5)
range(neo_IGM2$Ran[!is.na(neo_IGM2$Ran)])
#o
range(neo_IGM2$Ran, na.rm=T)
range(neo_IGM2$PETmin[!is.na(neo_IGM2$PETmin)])
#o
range(neo_IGM2$PETmin, na.rm=T)
range(neo_IGM2$TOPOG[!is.na(neo_IGM2$TOPOG)])
#o
range(neo_IGM2$TOPOG, na.rm=T)
## TAREA 14 ##
#Los atributos del objeto original se mantienen cuando los elementos de un
# objeto se accede utilizando nombres, un procedimiento mejor definido como
# "subsetting". En contraste, los atributos del objeto original no se mantienen
# cuando se usan corchetes rectangulares o el operador "$" para la indexación,
# por lo tanto esto se puede pensar mejor como una "extracción".
## TAREA 15 ##
# Ya tiene todas las respuestas
## TAREA 16 ##
# Ya tiene todas las respuestas
## TAREA 17 ##
neo_COL <- read.table("data_neotropicooccidente_col.txt", header=T, sep=",")
neo_COL[1:5,]
#or
head(neo_COL)
## TAREA 18 ##
Neot.occ.COL <- neo_COL[!is.na(neo_COL$Especimenes),]
Neot.occ.COL[1:5,]
head(Neot.occ.COL)
## TAREA 19 ##
dim(Neot.occ.IGM2)
dim(Neot.occ.COL)
#Si, "Neot.occ.IGM2" y "Neot.occ.COL" tienen el mismo número de filas.
## TAREA 20 ##
identical(Neot.occ.IGM2[,1:3], Neot.occ.COL[,1:3])
## TAREA 21 ##
# Ya tiene todas las respuestas
## TAREA 22 ##
summary(Neot.occ$Especimenes)
## TAREA 23 ##
# Número de áreas con menos de 500 especímenes:
sum(Neot.occ$Especimenes<500)
# Proporción de áreas con menos de 500 especímenes:
sum(Neot.occ$Especimenes<500)/length(Neot.occ$Especimenes)
## TAREA 24 ##
# Número de áreas con menos de 1000 especímenes:
sum(Neot.occ$Especimenes<1000)
# Proporción de áreas con menos de 1000 especímenes:
sum(Neot.occ$Especimenes<1000)/length(Neot.occ$Especimenes)
# Número de áreas con menos de 2000 especímenes:
sum(Neot.occ$Especimenes<2000)
# Proporción de áreas con menos de 2000 especímenes:
sum(Neot.occ$Especimenes<2000)/length(Neot.occ$Especimenes)
# Número de áreas con menos de 3000 especímenes:
sum(Neot.occ$Especimenes<3000)
# Proporción de áreas con menos de 3000 especímenes:
sum(Neot.occ$Especimenes<3000)/length(Neot.occ$Especimenes)
## TAREA 25 ##
# Ya tiene todas las respuestas
## TAREA 26 ##
points(Neot.occ[Neot.occ$Especimenes>=3000,2],
Neot.occ[Neot.occ$Especimenes>=3000,3], pch=19, col="red")
## TAREA 27 ##
plot(Neot.occ[,4], Neot.occ[,5], xlab="Annual mean precipitation (mm)",
ylab="Min. monthly potential evapotranspiration (mm)", cex.axis=1.5,
cex.lab=1.5)
## TAREA 28 ##
points(Neot.occ[Neot.occ$Especimenes>=3000,4],
Neot.occ[Neot.occ$Especimenes>=3000,5], pch=19, col="red")
## TAREA 29 ##
plot(Neot.occ[,4], log(Neot.occ[,6]), xlab="Annual mean precipitation (mm)",
ylab="Log(TOPOG (m))", cex.axis=1.5, cex.lab=1.5)
points(Neot.occ[Neot.occ$Especimenes>=3000,4],
log(Neot.occ[Neot.occ$Especimenes>=3000,6]), pch=19, col="red")
## TAREA 30 ##
plot(Neot.occ[,5], log(Neot.occ[,6]),
xlab="Min. monthly potential evapotranspiration (mm)", ylab="Log(TOPOG (m))",
cex.axis=1.5, cex.lab=1.5)
points(Neot.occ[Neot.occ$Especimenes>=3000,5],
log(Neot.occ[Neot.occ$Especimenes>=3000,6]), pch=19, col="red")
## TAREA 31 ##
range(Neot.occ[Neot.occ$Especimenes>=3000,4])
range(Neot.occ[Neot.occ$Especimenes>=3000,5])
range(Neot.occ[Neot.occ$Especimenes>=3000,6])