Este documento es base para dictado de los talleres del Proyecto de Innovación a la Docencia “Introducción a R para Ciencias Sociales”. El objetivo de este taller es brindar las herramientas introductorias para la utilización de R a través de su plataforma R-Studio.
R Studio es un entorno de desarrollo integrado (IDE) para el lenguaje de programación R, orientado al procesamiento estadístico. Su interfaz se ve así:
A partir de esta interfaz hay muchas formas de trabajar. Se puede trabajar directamente en la consola, crear archivos de sintaxis e ir ejecutándolos total o parcialmente, o bien crear projectos completos que agrupan todos los elementos en una única carpeta bajo el directorio “~/documentos/R/”
Los objetos son el elemento escencial en R. Todo es un objeto y puede ser almacenado con un nombre (que no debe contener espacios). Desde un número, un vector, una cadena de caracteres, un gráfico, una tabla, una base de datos, una función, etc.
Los objetos se crean utilizando el operador <-
. A la
izquierda del operador se pone el nombre, y a la derecha la sintaxis que
crea o define el objeto.
Por ejemplo, si queremos crear un objeto que sea igual a un número, por ejemplo 1, y lo llamamos “a”, se crea de la siguiente forma:
a <- 1
Este elemento queda guardado en el ambiente del programa, por lo que podremos disponer del mismo posteriormente, y operar con/en él.
Lo podemos invocar por su nombre:
a
## [1] 1
O realizar una operación:
a*2
## [1] 2
También se puede utilizar el símbolo =
, pero como el
mismo también se utiliza dentro de las funciones, se presta a confusión.
También <-
es unidireccional, por lo que implica que lo
del lado izquierdo se somete a lo del lado derecho:
b = 3 # Creo el objeto b=3
a <- b # defino a como b
Ahora el nombre a
significa un 3
, y ya no
un 1
.
a
## [1] 3
Los operadores utilizados por R son los habituales en la lógica de programación: > mayor >= mayor igual < menor <= menor igual == igual != distinto
Los operadores lógicos nos serviran para establecer condiciones y comparar variables. Los resultados de dichas comparaciones también pueden ser almacenados como objetos:
a == b
## [1] TRUE
2>3
## [1] FALSE
c <- 2!=3
c
## [1] TRUE
Las operaciones aritméticas también funcionan con sus caracteres habituales, tales como + suma, - resta, * multiplicación y / división
a+b
## [1] 6
26/2
## [1] 13
4^2
## [1] 16
25^(1/2)
## [1] 5
Las funciones son una serie de pasos estandarizados que asocian una
serie de inputs según cierta lógica, brindando un output a partir de los
mismos. Para lograr tal resultado, a las funciones se les brindan
distintos argumentos. R sigue el siguiente esquema para definir una
función
funcion(argumento_1 = arg_1, argumento_2 = arg_2, ..., argumento_n = arg_n)
,
donde primero se define la función, y entre paréntesis se van definiendo
los argumentos nombrando cada uno (esto es opcional, puedo poner el
valor del argumento en orden si la sé), definiendo el valor del
argumento con el signo =
y luego dándole el valor deseado,
separando cada argumento por una ,
.
Tomando como ejemplo la función paste()
, la cual une los
distintos elementos mencionados, separados por el caracter que se define
a tal fin al final.
paste("hola", "mundo!", "esto", "es", "una", "prueba", sep=" ")
## [1] "hola mundo! esto es una prueba"
O bien se puede hacer con objetos, los cuales no se deben citar entre comillas
paste(a, b, c, sep=" -.- ")
## [1] "3 -.- 3 -.- TRUE"
Hay otras funciones de relevancia, tales como sum()
que
suma los valores numéricos incluidos allí, mean()
que
calcula el promedio de una serie de valores numéricos, y otros más.
a
## [1] 3
b
## [1] 3
sum(a, b)
## [1] 6
sum(a, b, 8)
## [1] 14
El lenguaje R diferencia entre MAYÚSCULAS y minúsculas, por lo que
A
es distinto de a
. Si le designo un valor a
a
reemplazo al anterior, pero si se lo designo a
A
me crea un objeto nuevo:
a <- 5
a
## [1] 5
A <- 6
A
## [1] 6
a
## [1] 5
a+A
## [1] 11
Los espacios y el carriage return (enter) no son leídos por el lenguaje. Esto es muy útil para hacer más prolijo el código y más entendible
sum(1,3,15,18)
## [1] 37
sum( 1,
3,
15,
18)
## [1] 37
El numeral #
se utiliza para comentar el código, ya que
el lenguaje deja de leer dicha línea a partir del #
sum(1, 3, 15, 18) #esta función realiza la suma de los números 1+3+15+18
## [1] 37
Los corchetes []
sirven para acceder a un objeto dentro
de otro, tal que:
- en un vector [número de orden]
- en una tabla [fila, columna]
- en una lista [número de elemento]
El signo $
sirve para acceder a una variable dentro de
un data frame (una columna específica dentro de una tabla)
Los objetos de R pueden ser
- Valores
- Vectores: conjunto de valores
- Data frames: base de datos, tablas
- Listas: conjunto de objetos
Los valores de R pueden ser de distintas clases: numéricos, caracteres, factores, entre otros
d <- 3 #Valor
class(d)
## [1] "numeric"
e <- paste("hola", "mundo!", sep=" ") #caracter
class(e)
## [1] "character"
f <- factor("hola mundo!") #factor
class(f)
## [1] "factor"
Los vectores son una combinación de elementos. Se crean a través de
la función c()
g <- c(1, 2, 4)
g
## [1] 1 2 4
Trabajar sobre un vector, hace que se opere sobre todos los valores, tal que:
g+2
## [1] 3 4 6
g*4
## [1] 4 8 16
Se pueden crear vectores con caracteres tambien:
h <- c("maria", "pedro", "zamba")
h
## [1] "maria" "pedro" "zamba"
Con los []
se llama a un elemento específico del vector,
que se puede utilizar o guardar para crear otro objeto
g
## [1] 1 2 4
g[3]
## [1] 4
h
## [1] "maria" "pedro" "zamba"
i <- h[2]
i
## [1] "pedro"
Si lo embocamos a la izquierda, reemplazamos ese valor
h
## [1] "maria" "pedro" "zamba"
h[1] <- "julieta"
h
## [1] "julieta" "pedro" "zamba"
Un Data Frame es un objeto que se refiere a un conjunto de datos ordenados, una tabla de datos o una base de datos, donde cada columna significa una variable y cada fila una observación. Es uno de los elementos centrales de R, y se asocia mucho con el trabajo habitual que se realiza en R, tanto a través de la generación de DF en el mismo entorno como por la importación de datos externos de distinto formato. Tabmién se puede crear un DF a partir de la combinación de distintos vectores.
Por ejemplo: podemos crear tres vectores de nombre, sexo y edad y agruparlos bajo la lógica de un data frame:
nombre <- c("ema", "laura", "silvia", "roman", "adam")
edad <- c(10, 12, 8, 15, 9)
sexo <-c("hombre", "mujer", "mujer", "hombre", "hombre")
datos <- data.frame(nombre, edad, sexo)
class(datos)
## [1] "data.frame"
datos
## nombre edad sexo
## 1 ema 10 hombre
## 2 laura 12 mujer
## 3 silvia 8 mujer
## 4 roman 15 hombre
## 5 adam 9 hombre
Para acceder a elementos particulares del DF podemos usar los
[]
donde tendremos dos elementos separados por una
,
, explicitando filas y columnas:
[fila, columna]
datos[1,3]
## [1] "hombre"
datos[1,]
## nombre edad sexo
## 1 ema 10 hombre
datos[,3]
## [1] "hombre" "mujer" "mujer" "hombre" "hombre"
También podemos usar el operador $
para acceder a una
columna en particular, mencionando su nombre:
datos$sexo
## [1] "hombre" "mujer" "mujer" "hombre" "hombre"
datos$sexo[2]
## [1] "mujer"
Esta metodología es útil para imponer condiciones lógicas a modo de
filtrar las bases, según condicionantes que se pongan en sus filas o
columnas, dentro de los [,]
. Por ejemplo, si solo quisiera
los registros de las mujeres, debería establecer la condición
sexo=="mujer"
dentro de los condicionantes que se imponen a
las filas del DF:
datos[sexo=="mujer",]
## nombre edad sexo
## 2 laura 12 mujer
## 3 silvia 8 mujer
La lógica de esta sintaxis sería accedo al DF “datos” y me quedo con las filas que contienen la cadena de caracteres “mujer” dentro de la columna “sexo”, y me quedo con todas las columnas.
O podría imponer una condición de mayor o menor. Por ejemplo, solicitando los registros mayores a 10 años de edad:
datos[edad>10,]
## nombre edad sexo
## 2 laura 12 mujer
## 4 roman 15 hombre
A través de dichos filtros, nos permiten operar sobre el DF en partes diferenciadas de la misma. Por ejemplo, calcular el edad promedio de los hombres y de las mujeres, se podría realizar de la siguiene forma:
datosh <- datos[sexo=="hombre",] #Se crea un objeto que es un df de solo hombres
mean(datosh$edad) #se calcula el promedio de la columna edad
## [1] 11.33333
mean(datos[sexo=="mujer",]$edad) # Aquí no crea el df de mujeres, sino que lo filtra y lo calcula directamente sobre el mismo
## [1] 10
Las listas son una concatenación de distintos elementos independientes, que puede ser de cualquier clase. Pueden tener relación entre ellos o no. Por ejemplo: puede ser un conjunto de DF, de vectores, de valores, etc.
lista <- list(a, A, b, c, g, h, datos, datosh)
lista
## [[1]]
## [1] 5
##
## [[2]]
## [1] 6
##
## [[3]]
## [1] 3
##
## [[4]]
## [1] TRUE
##
## [[5]]
## [1] 1 2 4
##
## [[6]]
## [1] "julieta" "pedro" "zamba"
##
## [[7]]
## nombre edad sexo
## 1 ema 10 hombre
## 2 laura 12 mujer
## 3 silvia 8 mujer
## 4 roman 15 hombre
## 5 adam 9 hombre
##
## [[8]]
## nombre edad sexo
## 1 ema 10 hombre
## 4 roman 15 hombre
## 5 adam 9 hombre
Para acceder a los elementos de una lista acudo a los
[]
lista[3]
## [[1]]
## [1] 3
lista[[2]]
## [1] 6
lista[[6]][2] #Accede al 6° elemento de la lista, y allí a su 2° elemento
## [1] "pedro"
Si la lista tiene nombre, para acceder a subelementos de las listas,
se puede utilizar $
iterativamente, e incluso los
[]
cuando corresponda (en vectores y df):
lista2 <- list(a=a, A=A, otro=b, logico=c, vector=g, vector2=h, df=datos, dfh=datosh)
lista2$A
## [1] 6
lista2$vector
## [1] 1 2 4
lista2$vector2[2]
## [1] "pedro"
lista2$df
## nombre edad sexo
## 1 ema 10 hombre
## 2 laura 12 mujer
## 3 silvia 8 mujer
## 4 roman 15 hombre
## 5 adam 9 hombre
lista2$df$edad
## [1] 10 12 8 15 9
lista2$df[edad>10,]
## nombre edad sexo
## 2 laura 12 mujer
## 4 roman 15 hombre
lista2$df$edad[3]
## [1] 8