Para saber los objetos que hemos definido hacemos
ls()
objects()
objects(pattern = "a*")
R tiene una lista donde buscar los objetos accesibles: 'the search list'. Cargar un paquete extiende la 'search list'. Para obtener la lista de los directorios, llamados 'databases':
search()
library(MASS)
search()
Para que un objeto o directorio sea fácilmente accesible lo podemos poner en la 'search list' de R. En el caso de un data.frame, esto permite acceder directamente a las columnas por su nombre.
str(datos.df) # es un data.frame
A # error
attach(datos.df)
A # ahora sí
plot(A, B) # en lugar de plot(datos.df$A,datos.df$B)
Pero la actualización no es dinámica
datos.df$D <- 1:4 # una nueva columna
datos.df # aquí está
D # pero aquí no
Recordamos que para desconectar
detach(datos.df)
Para borrar objetos concretos
# rm(<objetos>)
Para borrar todos los objetos del entorno de trabajo:
# rm(list = ls())
Para cargar un archivo nombre.RData con objetos diversos (datos, funciones,…) se puede hacer un attach o un load. La primera instrucción accede a los objetos cuando se requieren, la segunda los carga todos.
search()
attach("misdatos.RData")
search()
ls(pos = 2) # segunda posición en la 'search list'
summary(crabs)
detach(file:misdatos.RData)
search()
summary(crabs)
¡Alerta!
attach(datos.df)
datos.df
A <- 1
A # usa la última
search() # el search path
detach(datos.df)
attach(datos.df)
D
A # cuidado
Conclusión: En “entornos confusos”, como un análisis que se prolonga dos semanas, es mejor evitar attach y acceder siempre a las variables usando su localización explícita y completa.
Tenemos a nuestra disposición distintas funciones para obtener los atributos
de un objeto definido: (i) Modo (mode) o tipo básico (vector o array: lógico, entero, real, carácter, etc); (ii) Tipo (typeof) tipo de elementos que contiene (int, double, etc.); (iii) Nombres (names) etiquetas de los elementos individuales de un vector o lista; (iv) Dimensiones (dim) de los arrays (alguna puede ser cero); (v) Dimnames (dimnames) nombres de las dimensiones de los arrays; (vi) Clase (class): vector alfanumérico con la lista de las clases del objeto; (vii) Otros: atributos de una serie temporal.
x <- 1:15
length(x)
y <- matrix(5, nrow = 3, ncol = 4)
dim(y)
is.vector(x)
is.vector(y)
is.array(x)
x1 <- 1:5
x2 <- c(1, 2, 3, 4, 5)
x3 <- "patata"
typeof(x1)
typeof(x2)
typeof(x3)
mode(x)
mode(y)
z <- c(TRUE, FALSE)
mode(z)
attributes(y)
w <- list(a = 1:3, b = 5)
attributes(w)
y <- as.data.frame(y)
attributes(y)
f1 <- function(x) {
return(2 * x)
} # función doble de un número
attributes(f1)
is.function(f1)
Los nombres válidos para un objeto son combinaciones de letras, números y el punto '.'. Los nombres no pueden empezar con un número. R es 'case-sensitive', es decir, la variable x es distinta de la variable X. Hay nombres reservados ('function', 'if', etc.). Otras consideraciones:
c, mean)# x<-1:5 # Estilo incorrecto
x <- 1:5 # Estilo correcto
¡Recuerda! las operaciones con vectores mejoran el uso de bucles (en tiempo y memoria). Las principales operaciones aritméticas:
+, resta -, multiplicación *, división /^, raíz cuadrada sqrt()%/% división entera, %% módulo: resto de la división enteralog, log10, log2, logb(x, base), exponencial
expsin, cos, tan, asin, acos, atanmax, min, range, pmax, pmin, mean, median, var,
sd, quantile, sum, prod, diff cumsum, cumprod, cummax, cummindata(presidents)
help(presidents)
range(presidents, na.rm = TRUE)
which.min(presidents) # 28
which.max(presidents) # 2
R es capaz de trabajar con los operadores lógicos habituales en otros lenguajes de progrmación. Destacamos:
<, >, <=, >=, ==, !=
!, &, |, xor() y los parecidos &&, ||
x <- 5
x < 5
x >= 5
x == 6
x != 5
y <- c(TRUE, FALSE)
!y
z <- c(TRUE, TRUE)
xor(y, z)
y & z
y | z
&&, || se evalúan de izquierda a derecha, examinando sólo el primer elemento de cada vector (si decide). Se suelen usar dentro de instrucciones 'if'.if (is.numeric(x) && min(x) > 0) {entonces..., min(x) no tiene sentido si x no es numérico.0 + y; as.numeric(y); mode(y) <- "numeric"peso <- c(19, 14, 15, 17, 20, 23, 30, 19, 25)
peso < 20
peso < 20 | peso > 25
peso[peso < 20]
peso[peso < 20 & peso != 15]
trat <- c(rep("A", 3), rep("B", 3), rep("C", 3))
peso[trat == "A"]
peso[trat == "A" | trat == "B"]
split(peso, trat)
split(peso, trat)$A
La función split(x,f)
split(peso, trat)
split(peso, trat)$A
La función cut
vv <- rnorm(100)
cut1 <- cut(vv, 5)
table(cut1)
cut2 <- cut(vv, quantile(vv, c(0, 1/4, 1/2, 3/4, 1)))
summary(cut2)
class(cut2)
x <- 1:5
y <- c(1, 3, 7:10)
union(x, y)
intersect(x, y)
setdiff(y, x)
v <- c("bcA1", "bcA2", "blX1")
w <- c("bcA2", "xA3")
union(v, w)
intersect(v, w)
setdiff(w, v)
setdiff(v, w)
reshape), etc.