"R is a language and environment for statistical computing and graphics."
Entre otras cosas R incluye:
Un poco más en realidad:
La página principal de R es r-project.org.
Hay instaladores para Windows y MacOS disponibles. R hace parte de varias distribuciones de Linux y se puede instalar fácilmente con los manejadores de paquetes.
Básicamente lo primero que aparece en el Comprehensive R Archive Network (CRAN): cran.r-project.org
En Mac también se puede instalar R con brew (recomendado):
brew install homebrew/science/r
Aprender a usar R puede ser (muy) frustrante.
Interfaces:
Igualmente Emacs y Vim tienen plugins:
Por dónde empezar?
Desde R:
help.start()
o desde RStudio en Help o simplemente desde el CRAN llegamos al Manual Introductorio.
Este manual se encuentra en español en la sección de documentación contribuida donde hay mucho material.
"Hola mundo!"
#> [1] "Hola mundo!"
# Esto es un comentario y <- 2 + 2 # Asignación y^y / 10*pi + 1 # Expresión
#> [1] 81.42477
matrix(1, nrow = y/2, ncol = y)
#> [,1] [,2] [,3] [,4] #> [1,] 1 1 1 1 #> [2,] 1 1 1 1
Usamos <-
(o =
) para asignar y #
para iniciar un comentario.
y <- 2 + 2 # Asignación
matrix()
es una función, entre paréntesis van sus argumentos (los podemos especificar por posición, por nombre o por omisión).
matrix(data = 1, y/2, y)
Para explorar un objeto o variable usamos la funcion str()
(estructura)
str(matrix(data = 1, y/2, y))
#> num [1:2, 1:4] 1 1 1 1 1 1 1 1
Para ver la ayuda de una función la precedemos con un ?
.
logico <- c(TRUE, FALSE, T) entero <- c(1L, 6L, 10L) doble <- c(a = 1, b = 2.5, c = 4.5) caracter <- c("Hola", "mundo", "!")
recursivo <- list(id = c(1, 2, 3), var = c("a", "b", "c"), lista = list(4:9, TRUE)) str(recursivo)
#> List of 3 #> $ id : num [1:3] 1 2 3 #> $ var : chr [1:3] "a" "b" "c" #> $ lista:List of 2 #> ..$ : int [1:6] 4 5 6 7 8 9 #> ..$ : logi TRUE
Dimensiones | Datos homogéneos | Datos heterogéneos |
---|---|---|
1 | Vector atómico - vector() |
Lista - list() |
2 | Matriz - matrix() |
data.frame() |
3 o más | Arreglo - array() |
## Las tres propiedades principales typeof(logico)
#> [1] "logical"
length(entero)
#> [1] 3
attributes(doble)
#> $names #> [1] "a" "b" "c"
# Las funciones is.* y as.* logical, integer, double, character, list is.character(caracter)
#> [1] TRUE
as.integer(logico)
#> [1] 1 0 1
# Coerción por defecto: mean(logico)
#> [1] 0.6666667
str(attributes(doble))
#> List of 1 #> $ names: chr [1:3] "a" "b" "c"
class(doble) # Se pueden modificar: class(doble) <- "myclass"
#> [1] "numeric"
names(doble)
#> [1] "a" "b" "c"
dim(doble)
#> NULL
Hay una constante lógica para especificar datos faltantes. La función is.na()
evalua si hay datos faltantes.
NA # logico NA_integer_; NA_real_; NA_character_;
La clase factor se usa para representar variables categóricas.
categoria <- factor(x = c("A", "B", "A", "A", "B")) typeof(categoria)
#> [1] "integer"
attributes(categoria)
#> $levels #> [1] "A" "B" #> #> $class #> [1] "factor"
table(categoria)
#> categoria #> A B #> 3 2
matriz <- matrix(data = runif(4), ncol = 2, nrow = 2) arreglo <- array(data = rnorm(24), c(2, 3, 4)) dim(caracter) <- c(1, 3) caracter
#> [,1] [,2] [,3] #> [1,] "Hola" "mundo" "!"
str(arreglo)
#> num [1:2, 1:3, 1:4] -1.1153 0.1908 -0.0383 1.0968 -0.7049 ...
ncol(matriz); dim(arreglo)
#> [1] 2
#> [1] 2 3 4
Algunas funciones:
Función | Vectores | Matrices | Arreglos |
---|---|---|---|
Dimensión | length() |
ncol() y nrow() |
dim() |
Nombres | names() |
rownames() y colnames() |
dimnames() |
Concatenar | c() |
cbind() y rbind() |
abind::abind() |
Para empezar el operador [
# Nada - útil para más dimensiones doble[]
#> a b c #> 1.0 2.5 4.5
# Entero positivo doble[c(1, 2)]
#> a b #> 1.0 2.5
# Entero negativo doble[-c(1, 2)]
#> c #> 4.5
# Lógico doble[doble > 1]
#> b c #> 2.5 4.5
# Caracter doble[c("a", "c", "c")]
#> a c c #> 1.0 4.5 4.5
El operador [
funciona igual en listas.
Ahora podemos combinar las anterirores formas de subindexar en matrices y arreglos, separando por coma.
matriz
#> [,1] [,2] #> [1,] 0.7236547 0.8617742 #> [2,] 0.2949301 0.5858607
matriz[, c(TRUE, FALSE)]
#> [1] 0.7236547 0.2949301
matriz[1, , drop = FALSE]
#> [,1] [,2] #> [1,] 0.7236547 0.8617742
Hay dos operadores más para seleccionar. [[
permite seleccionar sólo un valor (entero positivo o caracter), pero los extrae de las listas. $
es un atajo para [[
con un argumento caracter (nombres).
Además esta la función subset()
para seleccionar de forma más limpia con condiciones lógicas.
recursivo[[1]]
#> [1] 1 2 3
recursivo$lista[[1]][3:5]
#> [1] 6 7 8
subset(recursivo, c(FALSE, TRUE, FALSE))
#> $var #> [1] "a" "b" "c"
data.frame
Es la estructura de datos más utilizada en R. Es una lista de vectores atómicos (!?!).
(df <- data.frame(x = c("a", "b", "c"), y = 1:3))
#> x y #> 1 a 1 #> 2 b 2 #> 3 c 3
df[2, 2] # Se pueden seleccionar como en las matrices
#> [1] 2
df$y[2] # Se pueden seleccionar como en las listas
#> [1] 2
data.frame
Se pueden combinar dos o más data.frame
s con las funciones rbind()
y cbind()
df1 <- data.frame(x = c("a", "b"), y = 1:2) df2 <- data.frame(x = c("c", "a"), y = c(6, 7)) (df <- rbind(df1, df2))
#> x y #> 1 a 1 #> 2 b 2 #> 3 c 6 #> 4 a 7
La forma más común de crearlo es con una variación de la función read.table()
data.frame
subset()
con el data.frame
df[df$x == "a", "y", drop = FALSE]
#> y #> 1 1 #> 4 7
# Mejor así: subset(df, subset = x == "a", select = y)
#> y #> 1 1 #> 4 7
Las funciones también son objetos. Las creamos así:
miFuncion <- function(arg_1, arg_2, ...){ expresion ingeniosa o util }
readr
, readxl
y haven
lectura de archivos.lubridate
manejo de fechas y tiempo.stringr
interface a stringi
para manejo de caracteres.dplyr
y tidyr
manipulación y limpieza de datos.ggplot2
una gramática de gráficas.Recordemos que install.packages()
instala paquetes y library()
los carga en la sesión.
# Importar de un csv (Enfoque malo) dat <- read.csv("./data/saber2014II.csv", sep = ";", dec=",") # head(dat) # Importar de un csv (Enfoque correcto) clases <- c(rep("character", 8), rep("numeric", 8), rep("NULL", 7), "character") datos <- read.csv("./data/saber2014II.csv", sep = ";", dec=",", colClasses = clases)
library(readr) datos <- read_csv2("./data/saber2014II.csv") # Nuevo Paquete de Whickham para importar de Excel library(readxl) saber <- read_excel("./data/saber2014II.xlsx") # Importar de SPSS con etiquetas library(haven) saber <- read_spss("./data/saber2014II.sav")
dplyr
filter()
arrange()
select()
mutate()
y transmute()
summarise()
group_by()
*_join()
Pregunta: ¿cuántos estudiantes presentaron las pruebas Saber en el año 2014 por municipio?
library(dplyr) resumen_a <- datos %>% group_by(NOMBREMUNICIPIO) %>% summarize(DEPARTAMENTO = max(DEPARTAMENTO), TOTAL_EVALUADOS = sum(EVALUADOS)) %>% arrange(desc(TOTAL_EVALUADOS)) %>% mutate(ranking = row_number()) %>% select(ranking, DEPARTAMENTO, NOMBREMUNICIPIO, TOTAL_EVALUADOS)
resumen_a
#> Source: local data frame [1,022 x 4] #> #> ranking DEPARTAMENTO NOMBREMUNICIPIO TOTAL_EVALUADOS #> (int) (chr) (chr) (dbl) #> 1 1 BOGOTA BOGOTÁ D.C. 92799 #> 2 2 ANTIOQUIA MEDELLIN 30185 #> 3 3 VALLE CALI 18809 #> 4 4 ATLANTICO BARRANQUILLA 15728 #> 5 5 BOLIVAR CARTAGENA 12770 #> 6 6 NORTE SANTANDER CUCUTA 9075 #> 7 7 SANTANDER BUCARAMANGA 7540 #> 8 8 TOLIMA IBAGUE 7487 #> 9 9 CUNDINAMARCA SOACHA 6979 #> 10 10 META VILLAVICENCIO 6212 #> .. ... ... ... ...
Pregunta: ¿cuál es el municipio de mejor desempeño del país en las pruebas saber?
resumen_b <- datos %>% mutate(PROMGLOBAL = (PROMMATEMATICA + PROMINGLES + PROMLECTURACRITICA + PROMSOCIALESYCIUDADANAS + PROMCIENCIASNATURALES + PROMRAZONAMIENTOCUANTITA + PROMCOMPETENCIASCIUDADAN)/7) %>% group_by(NOMBREMUNICIPIO) %>% summarize(DEPARTAMENTO = max(DEPARTAMENTO), PROMGLOBALXMPIO = sum(PROMGLOBAL * EVALUADOS) / sum(EVALUADOS)) %>% arrange(desc(PROMGLOBALXMPIO)) %>% mutate(ranking = row_number()) %>% select(ranking, DEPARTAMENTO, NOMBREMUNICIPIO, PROMGLOBALXMPIO)
resumen_b
#> Source: local data frame [1,022 x 4] #> #> ranking DEPARTAMENTO NOMBREMUNICIPIO PROMGLOBALXMPIO #> (int) (chr) (chr) (dbl) #> 1 1 CUNDINAMARCA COTA 60.95414 #> 2 2 ANTIOQUIA RETIRO 58.63083 #> 3 3 CUNDINAMARCA TENJO 58.02804 #> 4 4 BOYACA PAIPA 55.98362 #> 5 5 ANTIOQUIA SABANETA 55.73571 #> 6 6 CUNDINAMARCA LA CALERA 55.54639 #> 7 7 CUNDINAMARCA CHIA 55.43881 #> 8 8 ANTIOQUIA ENVIGADO 55.32838 #> 9 9 BOYACA DUITAMA 55.04629 #> 10 10 CUNDINAMARCA SUBACHOQUE 54.97549 #> .. ... ... ... ...
En el CRAN hay una Vista de Tareas que sobrevuela paquetes, funciones y referencias para completar tareas específicas agrupadas temáticamente.
Canales: en twitter #rstats y en StackOverflow el tag R. También pueden googlea-R R + "pregunta".
Algunas buenas referencias:
Esta presentación fue escrita en RMarkdown desde RStudio y compilada por rmarkdown
en la plantilla ioslides
de Google gracias a knitr
y pandoc
. Publicada en la web en GitHub gracias a GitHub Pages.
La presentación fue preparada por por Daniel Moreno, Adriana Clavijo y Jose Zea para el Grupo de Usuarios de R de Bogotá y el contenido original esta bajo la licensia CC-BY 4.0.