Trabajar con proyectos en RStudio permite organizar nuestro flujo de trabajo, manteniendo en un único espacio sus distintos componentes:
Crear un nuevo proyecto en RStudio
En la barra de menú, click en file > New Project, y luego:
Es posible escribir y ejecutar código directamente en la Consola, y guardar los resultados de los distintos procesamientos y análisis en nuestro environment (podemos ver los objetos creados en el panel correspondiente). Esta forma de trabajo no resulta conveniente, ya que no nos permitirá “recuperar” nuestro trabajo en el futuro.
Los scripts son archivos de texto plano donde guardaremos los códigos u órdenes que ejecutaremos en la Consola, y nos permitirán "recrear nuestro environment espacio de de trabajo.
Crear un nuevo script en un proyecto de RStudio
Dos alternativas:
# El símbolo de numeral a la izquierda permite realizar comentarios a los códigos
2*6 # Multiplicación
## [1] 12
23*32 + 34^2 # Puede utilizarse tanto el operador "^" como "**" para la potencia
## [1] 1892
10/(1+3)
## [1] 2.5
10%/%(1+3) # El operador %/% expresa división entera
## [1] 2
cos(pi) # Coseno del número Pi
## [1] -1
Permiten describir comparaciones entre dos objetos (por ej. \(x\) e \(y\)), de las que se obtiene como resultado verdadero (TRUE
) o falso (FALSE
).
Operador | Descripción |
---|---|
x < y | x es menor (estricto) que y |
x <= y | x es menor o igual que y |
x > y | x es mayor (estricto) que y |
x >= y | x es menor o igual que y |
x == y | x es exactamente igual que y |
x != y | x es no es igual que y |
5 <= 7
## [1] TRUE
4 == 8
## [1] FALSE
5 != 3
## [1] TRUE
Permiten describir relaciones lógicas (operaciones de álgebra Booleana), expresadas como verdadero (TRUE
) o falo (FALSE
).
Operador | Descripción |
---|---|
x | y | x o y son verdaderos |
x & y | x e y son verdaderos |
!x | x no es verdadero (negación) |
TRUE & FALSE # Al menos un Falso -> Falso
## [1] FALSE
TRUE & TRUE # Ambos Verdadero -> Verdadero
## [1] TRUE
TRUE | FALSE # Si al menos uno es Verdadero -> Verdadero
## [1] TRUE
TRUE | TRUE
## [1] TRUE
FALSE | FALSE # Ambos Falso -> Falso
## [1] FALSE
Los Objetos/Elementos constituyen la categoría escencial de R. Todo en R puede ser un objeto:
Los objetos que vamos creando a medida que trabajamos pueden visualizarse en la panel derecho superior de la pantalla (environment).
El operador <-
sirve para definir un objeto. A la izquierda del <-
debe ubicarse el nombre que tomará el elemento a crear (por ej. value
). Del lado derecho debe ir la definición del mismo: object_name <- value
(i.e. se trata de un operador unidericcional).
El operador =
es equivalente a <-
, pero en la práctica no se utiliza para la definición de objetos.
Los nombres que se empleen no debe poseer espacios, y deben evitarse algunos nombresreservados por R para determinados elementos (pi
) o funciones (mean
).
Caracteres especiales
R es sensible a mayúsculas y minúsculas, tanto para los nombres de las variables, como para las funciones y parámetros.
Los espacios en blanco y los carriage return (enter) no son considerados por el lenguaje. Los podemos aprovechar para emprolijar el código y que la lectura sea más limpia.
El numeral #
se utiliza para hacer comentarios. Todo lo que se escribe después del # no es interpretado por R. También Se puede utilizar un # por cada línea de código que se desea “anular”
Los corchetes []
se utilizan para acceder a un objeto:
el signo $ también es un método de acceso. Particularmente, en los dataframes, nos permitira acceder a una determinada columna de una tabla
Los paréntesis()
se utilizan en las funciones para definir los parámetros.
Las comas ,
se utilizan para separar los parametros al interior de una función.
Las funciones son series de procedimientos estandarizados (códigos, algoritmos, etc.), que toman como input determinados argumentos a fijar por el usuario (algunos están dados por defectos y pueden setearse). Su lógica de funcionamiento es:
funcion(argumento1 = arg1, argumento2 = arg2)
Algunos ejemplos:
paste("Pega", "estas", 4, "palabras", sep = " ") # para indicar que se trata de texto/caracteres, lo indicamos con comillas.
## [1] "Pega estas 4 palabras"
paste("Pega", "estas", 4, "palabras", sep = "*")
## [1] "Pega*estas*4*palabras"
sum(1:5) # 1:5 devulve los numeros enteros de 1 al 5. También puede emplearse c(1, 2, 3, 4, 5)
## [1] 15
mean(1:5, na.rm = TRUE)
## [1] 3
Los valores y vectores pueden ser a su vez de distintas clases:
Numeric
x <- 23*32 + 34^2
x # Retorna el elemento correspondiente al objeto x
## [1] 1892
class(x) # tipo o clase de objeto/variable
## [1] "numeric"
y <- x # Ahora "x" toma el valor de "y", e "y" continua conservando el mismo valor
Character
A <- paste('Soy', 'una', 'concatenación', 'de', 'caracteres', sep = " ")
A
## [1] "Soy una concatenación de caracteres"
class(A)
## [1] "character"
Factor
A <- factor(c("perro", "gato", "canario")) # consultar help(factor)
A
## [1] perro gato canario
## Levels: canario gato perro
class(A)
## [1] "factor"
La diferencia entre un character y un factor es que el último tiene solo algunos valores permitidos (levels), con un orden interno predefinido (el cual, por ejemplo, se respetará a la hora de realizar un gráfico)
Consultar help(factor)
Para crear un vector utilizamos el comando c()
, de combinar.
x <- c(1, 3, 5)
x
## [1] 1 3 5
Sumamos 2 a cada elemento del vector anterior:
x2 <- x + 2
x2
## [1] 3 5 7
Suma de vectores:
y <- 1:3 # También puede usarse c(1, 2, 3) o bien seq(1, 3)
z <- x + y
z
## [1] 2 5 8
Creamos un vector que contenga las palabras: “Carlos”,“Federico”,“Pedro”
E <- c("Carlos", "Federico", "Pedro")
E
## [1] "Carlos" "Federico" "Pedro"
Podemos acceder a algún elemento del vector (y de datos estruturados en general) mediante indexación. Existen diferentes formas según el tipo de objeto; en el casode vectores se utilizan el operador de selección [ ]
.
x[3]
## [1] 5
E[2]
## [1] "Federico"
Si nos interesa almacenar dicho valor, al buscarlo lo asignamos a un nuevo objeto con el nombre deseado:
elemento2 <- E[2]
elemento2
## [1] "Federico"
Selección negativa:
x[-3] # Selección negativa (no quedamos con todo, excepto el elemento 3 del vector)
## [1] 1 3
Para remover un objeto del ambiente de trabajo, utilizamos la función rm()
rm(elemento2)
elemento2
## Error in eval(expr, envir, enclos): objeto 'elemento2' no encontrado
También podemos cambiar el texto del segundo elemento de E, por el texto “Juan”
E[2] <- "Juan"
E
## [1] "Carlos" "Juan" "Pedro"
Empleamos la función matrix
, que tiene los siguientes argumentos:
FALSE
, por lo que ordena al vector definido en “data” como columnas en la conformación de la matriz.a <- c(6, 2, 3, 2, 15, 6, 3, 6, 3) # datos que incorporaremos en la matriz
V <- matrix(a, nrow = 3, byrow = TRUE) # mediante "byrow" indicamos si la ordenamos por fila por
V
## [,1] [,2] [,3]
## [1,] 6 2 3
## [2,] 2 15 6
## [3,] 3 6 3
D <- diag(diag(V)) # Armamos una matriz diagonales con los elementos de la doagonal principal de V
D
## [,1] [,2] [,3]
## [1,] 6 0 0
## [2,] 0 15 0
## [3,] 0 0 3
D <- sqrt(solve(D)) # solve devuelve la inversa de D
D
## [,1] [,2] [,3]
## [1,] 0.4082483 0.0000000 0.0000000
## [2,] 0.0000000 0.2581989 0.0000000
## [3,] 0.0000000 0.0000000 0.5773503
R <- D %*% V %*% D # %*% se emplea para producto de matrices
R # Observación: Si asumimos que V es una matriz de varianzas-covarianzas, R es una matriz de correlación
## [,1] [,2] [,3]
## [1,] 1.0000000 0.2108185 0.7071068
## [2,] 0.2108185 1.0000000 0.8944272
## [3,] 0.7071068 0.8944272 1.0000000
Un data frame es una tabla de datos, donde cada columna representa una variable y cada fila una observación. Este tipo de objetos son típicos en el proceso de trabajo con base de datos.
La función para crear un objeto de este tipo es data.frame()
.
Veamos el siguiente ejemplo de “juguete”.
INDICE <- c(100, 100, 100,
101.8, 101.2, 100.73,
102.9, 102.4, 103.2)
FECHA <- c("Ago-19", "Ago-19", "Ago-19",
"Sep-19", "Sep-19", "Sep-19",
"Oct-19", "Oct-19", "Oct-19")
GRUPO <- c("Privado_Registrado","Público","Privado_No_Registrado",
"Privado_Registrado","Público","Privado_No_Registrado",
"Privado_Registrado","Público","Privado_No_Registrado")
datos <- data.frame(INDICE, FECHA, GRUPO)
datos
En un dataframe las “indexaciones” se realizan ubicando sus elementos de de la siguiente manera: [fila, columna]
.
Alternativamente, se puede especificar la columna (variable) correspondiente mediante el operador $
, y luego seleccionar dentro de la columna el registro deseado mediante el número de orden.
datos$FECHA # obtenemos la columna "FECHA"
## [1] Ago-19 Ago-19 Ago-19 Sep-19 Sep-19 Sep-19 Oct-19 Oct-19 Oct-19
## Levels: Ago-19 Oct-19 Sep-19
datos[3,2] # obtenemos el dato de la fila 3 y columna 2 (FECHA)
## [1] Ago-19
## Levels: Ago-19 Oct-19 Sep-19
datos$FECHA[3] # idem anterior
## [1] Ago-19
## Levels: Ago-19 Oct-19 Sep-19
¿Qué sucede si hacemos datos$FECHA[3,2]
?
datos$FECHA[3,2]
## Error in `[.default`(datos$FECHA, 3, 2): número incorreto de dimensiones
El acceso a los dataframes mediante [ ]
puede utilizarse para realizar filtros sobre la base, especificando una condición para las filas. Por ejemplo, puedo utilizar los [ ]
para conservar del dataframe datos
unicamente los registros con fecha de Octubre 2019:
datos[datos$FECHA=="Oct-19", ]
Si queremos filtrar por más de una condición para las filas de una determinada variable podemos emplear %in% c()
.
datos[datos$FECHA %in% c("Sep-19", "Oct-19") ,]
Filtros incluyendo operadores lógicos:
datos[datos$FECHA == "Sep-19" & datos$INDICE > 101,]
datos[datos$FECHA == "Sep-19" | datos$INDICE > 101,]
También podemos aplicar el filtro y al mismo tiempo identificar una variable de interés para luego realizar un cálculo sobre aquella. Por ejemplo, podríamos calcular la media de los indices en el mes de Octubre.
### Por separado
Indices_Oct <- datos$INDICE[datos$FECHA=="Oct-19"]
Indices_Oct
## [1] 102.9 102.4 103.2
mean(Indices_Oct)
## [1] 102.8333
### Todo junto
mean(datos$INDICE[datos$FECHA=="Oct-19"])
## [1] 102.8333