-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy path3-1_objetos.R
448 lines (291 loc) · 9.79 KB
/
3-1_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
################################################################################
### R BASICS WORKSHOP ###
### PRESENTACIÓN 3-1: objetos ###
### ###
### Unida de Servicios Bioinformáticos ###
### Instituto Nacional de Medicina Genómica ###
### Website: github.com/hachepunto/R_Basics_workshop ###
################################################################################
### A. QUE ES UN OBJETO Y COMO CREARLO #########################################
# Un objeto en R es un pedazo de memoria que contiene información
# Frecuentemente esa información son datos
# Los objetos pueden tener varios tipos de datos y pueden ser de varias clases
# La manera más sencilla de crear un objeto es utilizando el operador *<-*
x <- 10
x
# Esto crea un objeto llamado *x* que contiene el valor 10
y <- 5.3
y
# Esto creo otro objeto llamado *y* que contiene el valor 5.3
x <- c(10, 5, 2)
x
# Esto RE-ESCRIBE el objeto *x* y le asigna una secuencia de 3 valores
# Otra manera de crear un objeto es con la función *assign*
assign(x = "x2", value = c(10, 5, 2))
x2
identical(x = x, y = x2)
# Equivalente:
identical(x, x2)
### B. TIPOS DE DATOS EN OBJETOS ###############################################
# Hay 4 tipos de datos comúnmente utilizados en R:
# 1. Numéricos - números
# 2. Caracteres - texto
# 3. Lógicos - verdadero/falso
# 4. Valores especiales
## 1. NUMÉRICOS ##
# Supongamos que tenemos los log Fold Changes de famosos 5 genes relacionados
# con cáncer:
logFCh <- c(1, 0, 0, 6, 2)
logFCh
# La función *mode* nos dice el tipo de datos contenidos en el objeto *logFCh*
mode(x=logFCh)
## 2. CARACTERES ##
# Supongamos que tenemos los nombres de esos 5 genes:
genes <- c("TP53", "MYC", "BRCA1", "BRCA2", "ATM")
genes
mode(genes)
# IMPORTANTE: Tomar en cuenta que los valores de caracteres siempre van entre
# comillas. Esto generaría un error:
genes <- c(TP53, MYC, BRCA1, BRCA2, ATM)
## 3. LÓGICOS ##
# Supongamos ahora que el log Fold Change cada gen incrementó o no
# respecto a un control:
increm <- c(TRUE, FALSE, FALSE, TRUE, TRUE)
increm
mode(increm)
# IMPORTANTE: Tomar en cuenta que valores lógicos NO van entre comillas y se
# escriben en mayúsculas
## 4. VALORES ESPECIALES ##
# 4.1. NA: valor perdido, no disponible (not available)
x <- NA
x
is.na(x)
# 4.2. Inf: infinito
100/0
-100/0
100-Inf
# 4.3. NaN: no es un número (not a number)
Inf-Inf
# 4.4. NULL: nulo - usado para indicar un valor de argumento no especificado
x <- NULL
x
is.null(x)
### C. CLASES DE OBJETOS #######################################################
# 1. Vectores: 1 dimensión - numéricos, caracteres, lógicos
# 2. Factores: 1 dimensión - niveles de un factor
# 2. Matrices: 2 dimensiones
# 3. Arreglos: n dimensiones
# 4. Marcos de datos (data frames): 2 dimensiones
# 5. Lista
# 6. Otras clases
## IMPORTANTE: Cada objeto tiene ATRIBUTOS que definen como funciona en R ##
### D. VECTORES ################################################################
# Vectores representan una secuencia lineal de valores, cada valor con una
# posición en la secuencia:
logFCh
genes
increm
# CLASE es el principal atributo de un vector
class(logFCh)
class(genes)
class(increm)
# LONGITUD es otro de los principales atributos de un vector
length(x=logFCh)
length(x=genes)
length(x=increm)
# NOMBRES es otro atributo de un vector
names(x=logFCh)
# Para crear nombres en este vector:
logFCh <- c(1, 0, 0, 6, 2)
names(x=logFCh) <- paste("gene", seq(1,length(logFCh)), sep = "_")
names(x=logFCh)
logFCh
# Alternativamente:
genes
names(x=logFCh) <- genes
logFCh
# También:
increm
names(x=increm)
names(x=increm) <- names(x=logFCh) # Utiliza los nombre de un objeto para otro
names(x=increm)
identical(x=names(increm), y=names(logFCh))
## IMPORTANTE: Los vectores pueden tener SOLO un tipo de datos: numéricos,
# caracteres o lógicos. NUNCA UNA COMBINACIÓN.
x <- c(1,2,3)
x
class(x)
x2 <- c(1,2,3,"a")
x2
class(x2)
### F. FACTORES ################################################################
# Factores también representan una secuencia linear de valores, pero están
# diseñados para ser NIVELES DE UNA VARIABLE CATEGÓRICA.
# Por ejemplo, supongamos que tenemos el estado de expresión diferencial de algunos genes:
diff <- c("down", "down", "equal", "up", "down", "equal", "equal", "down")
diff
length(diff)
class(diff)
mode(diff)
diff2 <- factor(x=diff)
diff2
length(diff2)
class(diff2)
mode(diff2)
identical(diff, diff2)
# Un atributo importante de factores es sus NIVELES (LEVELS)
levels(diff2)
# IMPORTANTE: la clase frecuentemente afecta como funciones procesan objetos.
# Por ejemplo:
plot(diff)
plot(diff2)
levels(diff2) <- c("equal", "up", "down")
### G. MATRICES ################################################################
# Las matrices son parecidas a vectores, pero tienen dos dimensiones: FILAS Y
# COLUMNAS.
# Supongamos que tenemos los niveles de expresión de 5 genes (filas) en
# muestras distintas (columnas):
expr.M <- matrix(1:(5*4), nrow = 5, ncol = 4)
expr.M
class(expr.M)
# la función *matrix* tiene otro argumento *byrow* con el valor pre-determinado
# de *FALSE*. ¿Qué pasa si lo cambiamos a *TRUE*?
expr.M2 <- matrix(1:(5*4), nrow=5, ncol = 4, byrow = TRUE)
expr.M2
?matrix
# Utilicemos valores un poco más realistas
expr.M <- matrix(rpois(5*4, 10), nrow=5, ncol=4)
expr.M
# Al igual que vectores, matrices tienen LONGITUD
length(expr.M)
# Además, matrices también tienen DIMENSIONES
dim(expr.M)
nrow(expr.M)
ncol(expr.M)
# Cada observación en una matriz puede tener NOMBRES
names(expr.M)
names(expr.M) <- paste("obs_", 1:length(expr.M), sep = "")
expr.M
# Más frecuentemente, se utilizan nombres solamente para columnas y filas
colnames(expr.M)
rownames(expr.M)
colnames(expr.M) <- paste(1:ncol(expr.M), ".CEL", sep="")
rownames(expr.M) <- genes
expr.M
## IMPORTANTE: Las matrices, como vectores, pueden tener SOLO un tipo de datos:
# numéricos, caracteres O lógicos. NUNCA UNA COMBINACIÓN.
expr.M2 <- matrix(sample(c(1:20, letters), 5*4), nrow=5, ncol=4)
expr.M2
class(expr.M2)
mode(expr.M2)
genes
logFCh
mixed.matrix <- cbind(genes, logFCh)
mixed.matrix
mode(mixed.matrix)
### H. ARREGLOS ################################################################
# Los arreglos son parecidos a matrices, pero tienen MÁS DE DOS DIMENSIONES.
# Con tres dimensiones, es como dos matrices de las mismas dimensiones una
# detrás de otra (con filas y columnas alineadas).
logFCh.A <- array(1:(5*4*2), dim=c(5,4,2))
logFCh.A
# Con valores de log Fold Change un poco más realistas:
logFCh.A <- array(rpois(5*4*2, 1), dim=c(5,4,2))
logFCh.A
mode(logFCh.A)
class(logFCh.A)
length(logFCh.A)
dim(logFCh.A)
dimnames(logFCh.A)
# Podemos poner nombres a cada elemento en cada dimensión
dimnames(logFCh.A) <- list(genes, paste(1:4, ".CEL", sep=""), c("days0", "days15"))
logFCh.A
### I. MARCOS DE DATOS #########################################################
# Los marcos de datos organizan variables (columnas) medidos para diferentes
# observaciones (filas). De esta manera, CADA COLUMNA PUEDE TENER VALORES DE
# TIPOS DISTINTOS (numéricos, caracteres, lógicos o factores).
genes
expr.M
increm
genes.code <- 1:length(genes)
expr.data <- data.frame(genes.code, genes, expr.M, increm)
expr.data
class(expr.data)
mode(expr.data$genes)
# IMPORTANTE: matrices y marcos de datos funcionan distinto!
expr.data2 <- as.matrix(expr.data)
expr.data2
class(expr.data2)
dim(expr.data)
dim(expr.data2)
length(expr.data)
length(expr.data2)
mode(expr.data)
mode(expr.data2)
names(expr.data)
names(expr.data2)
# Las columnas (variables) en un marco de datos deben todos tener la misma
# longitud.
x <- c("a", "b")
y <- 1:5
z <- 1:6
x
y
z
length(x)
length(y)
length(z)
xy <- data.frame(x,y)
xz <- data.frame(x,z)
xz
### J. LISTAS ##################################################################
# Las listas también pueden contener elementos de distintos tipos o clases, y NO
# necesitan tener la misma longitud.
x
class(x)
expr.M
class(expr.M)
diff
class(diff)
expr.data
class(expr.data)
random.list <- list(x, expr.M, diff, expr.data)
# Cada objeto se convierte en un elemento de la lista
random.list
# Algunos atributos de una lista:
class(random.list)
length(random.list)
dim(random.list)
names(random.list)
names(random.list) <- c("x", "expr.M", "diff", "expr.data")
random.list
# Conocer la estructura de una lista es muy útil:
str(random.list)
## IMPORTANTE: Muchas funciones utilizan listas para exportar resultados de
# análisis.
x <- rnorm(100)
y <- 4 + 5*x + rnorm(100)
plot(y~x)
lm.res <- lm(y~x)
lm.res
str(lm.res)
### K. OTROS ###################################################################
# Muchos análisis o funciones generan objetos de clases particulares. Pero, la
# gran mayoría son construcciones de los objetos básicos que hemos
# revisado. Por ejemplo:
# Modelos lineales generan objetos de clase *lm*, pero son en estructura listas
class(lm.res)
# Sin embargo, el hecho de ser de clase *lm* hace que ciertas funciones manejen
# este objeto de maneras específicas a su clase.
plot(lm.res)
# Otra clase de objeto son árboles filogenéticos
install.packages("ape") # Esto instala un paquete llamado *ape*
library(ape) # Esto abre el paquete
# El paquete *ape* contiene un árbol filogenético de murciélagos
data(chiroptera)
class(chiroptera)
# A pesar de ser un objeto de clase *phylo*, este objeto tiene la estructura
# de una lista
str(chiroptera)
# La función *plot* sabe que hacer cuando se le da un árbol filogenético
plot(chiroptera, show.tip.label=FALSE)