asignación
tipos de datos
estructuras de datos
funciones
paquetes: instalación y ayuda
<-
) permite asignar datos/valores a variables/objetos. Con la asignación se crean objetos/variables que después podremos usar en otras operaciones.El operador de asignación (<-
) permite asignar datos/valores a variables/objetos. Con la asignación se crean objetos/variables que después podremos usar en otras operaciones.
Es mucho más fácil explicarlo apoyándose en ejemplos:
#- ¿Qué diferencias hay entre las siguientes 2 expresiones?2 + 2aa <- 2 + 2#- una vez hemos creado una variable, podemos usarla para efectuar nuevos cálculosaa + 1#- podemos cambiar el valor de una variableaaaa <- 10aa#- ¿Qué hacen las siguientes lineas de código? aa <- 2 + 2bb <- 5 + aacc <- 1 + aa * 2dd <- bb
En R, la forma genérica de una operación de asignación, o de “creación de objetos”, es: nombre_del_objeto <- valor , por ejemplo aa <- 2 + 2 [ 🌟 ] [🌶]
Recuerda que para que un nombre sea sintácticamente válido en R sólo puede contener caracteres alfanuméricos (letras y números), puntos (.) y guiones bajos (_).
Además, hay nombres reservados (TRUE, NA, if, while, do , next, for ...)
En R, la forma genérica de una operación de asignación, o de “creación de objetos”, es: nombre_del_objeto <- valor , por ejemplo aa <- 2 + 2 [ 🌟 ] [🌶]
Recuerda que para que un nombre sea sintácticamente válido en R sólo puede contener caracteres alfanuméricos (letras y números), puntos (.) y guiones bajos (_).
Además, hay nombres reservados (TRUE, NA, if, while, do , next, for ...)
Cada vez que asignamos un nombre a un valor, R crea un nuevo objeto en el Global environment. Veámoslo:
aa <- 2 + 2bb <- 5 + aacc <- 1 + aa * 2dd <- bbls() #- muestra los objetos q hay en el Global env. rm(cc) #- borra/elimina el objeto cc del Global env.rm(list = ls()) #- borra todos los objetos del Global env.
Hay 3 tipos principales: numéricos, de texto y lógicos, pero en realidad R tiene 6 tipos de datos.
Además, hay 4 valores especiales: NULL, NA, NaN, e infinito
Cada dato, valor o variable es de un tipo.
aa <- "La calle en la que vivo es" #- texto (character)bb <- 4L #- número enterocc <- 4.3 #- número decimaldd <- TRUE #- logicaltypeof(aa)typeof(dd)
2 + 25 * 6
2 + 25 * 6
2 < 4 # MENOR que: esta expresión chequea si 2 es MENOR que cuatro. Como es cierto, nos devuelve un TRUE2 > 4 # MAYOR que: esta expresión chequea si 2 es MAYOR que cuatro. Como es cierto, nos devuelve un TRUE5 >= 7 # MAYOR o IGUAL que.8 <= 8 # MENOR o IGUAL que.5 == 4 # == IGUAL: == chequea si dos valores son iguales, como no son iguales devolverá FALSE2 != 4 # NO IGUAL: como 2 no es igual a 4 nos devuelve TRUE5 != 5 # NO IGUAL: como 5 es igual a 5, nos devuelve FALSE
2 = 2 #- ¿qué ocurre? ¿xq se queja R?
En R hay muchas funciones para trabajar/operar sobre texto
Por ejemplo, la función paste()
nos permite pegar o concatenar dos variables de tipo character:
aa <- "mi nombre es"bb <- "pedro"paste(aa, bb)paste(aa, bb, sep = " ... ")# Prueba tú mismo que hace la función paste0()
toupper(aa)tolower(aa)stringr::str_to_sentence(aa) #- stringr es un pkg del tidyversenchar(bb) #- nchar() nos devuelve el número de caracteres de un stringsubstring(bb, 2, nchar(bb)) #- substring() extrae caracteres de un string [🌶🌶]
TRUE & TRUE #- AND: para q devuelva TRUE hace falta que TODAS las condiciones sean ciertasTRUE & FALSEFALSE & FALSETRUE | TRUE #- OR: devuelve TRUE si ALGUNA de las condiciones es ciertaTRUE | FALSEFALSE | FALSE!TRUE #- NOT: devuelve el valor contrario!FALSE
(4 > 3) & (3 < 2) #- AND: como solo se cumple la primera condición, nos devuelve TRUE(1==2) | (2 >3) #- OR: Como no se cumple ninguna de las 2 condiciones nos devuelve FALSE!(4 > 3) #- NOT: 4 es mayor que 3 es TRUE, pero el ! delante de esa condición la niega y pasa a FALSE!!(4 > 3) #- si niegas dos veces, vuelves al principio: TRUE
R sirve para hacer análisis estadísticos con datos, y los datos tienen que estar almacenados en alguna estructura. Las principales estructuras de datos en R son:
vectores
matrices
arrays (matrices multidimensionales)
listas
data.frames
R sirve para hacer análisis estadísticos con datos, y los datos tienen que estar almacenados en alguna estructura. Las principales estructuras de datos en R son:
vectores
matrices
arrays (matrices multidimensionales)
listas
data.frames
Las que más utilizaremos en el curso son los *data.frames, y en segundo lugar las listas.
Si, pero en realidad estas 2 estructuras (data.frames y listas) son en realidad agrupaciones de vectores; es decir, la estructura básica, la más importante en R son los vectores.
Son los más importantes porque el resto de estructuras se construyen a partir de grupos de vectores o añadiendo alguna propiedad adicional, o atributo, a un vector.
La estructura de datos fundamental en R es el vector.
En R, un vector es una estructura de datos que sirve para almacenar un conjunto ordenado de valores o elementos.
Un vector puede contener cualquier número de elementos; sin embargo, todos los elementos deben ser del mismo tipo. Por ejemplo, un vector no puede contener simultáneamente números y texto.
aa <- c(3, 22, 6)aais.vector(aa)typeof(aa)
Sabemos que un vector solo puede contener elementos de un tipo (es una estructura homogénea)
¿Qué ocurre si intentamos mezclar en un vector elementos de distinto tipo? R convertirá (coercerá) los elementos para que sean del mismo tipo
aa <- c(4, 6, "Hola") #- intentamos poner en aa elementos numéricos y character (¿?)is.vector(aa)typeof(aa) #- ¿qué ha pasado?aa #- ¿qué ha pasado?
character > double > integer > logical
. Por ejemplo, si en el vector hay un valor textual, todos los valores se convertirán al tipo character.Sabemos que un vector solo puede contener elementos de un tipo (es una estructura homogénea)
¿Qué ocurre si intentamos mezclar en un vector elementos de distinto tipo? R convertirá (coercerá) los elementos para que sean del mismo tipo
aa <- c(4, 6, "Hola") #- intentamos poner en aa elementos numéricos y character (¿?)is.vector(aa)typeof(aa) #- ¿qué ha pasado?aa #- ¿qué ha pasado?
character > double > integer > logical
. Por ejemplo, si en el vector hay un valor textual, todos los valores se convertirán al tipo character.aa <- c(1:4)aaaa <- as.character(aa)aa
En R podemos agrupar valores en vectores. Perfecto, pero habrá veces que necesitemos manipular los vectores. Por ejemplo necesitaremos acceder a determinados elementos de un vector. Este tipo de operaciones sobre los vectores se les conoce genéricamente como subsetting.
Para hacer subsetting se usan los corchetes: []
Vemos 3 tipos de subsetting
En R podemos agrupar valores en vectores. Perfecto, pero habrá veces que necesitemos manipular los vectores. Por ejemplo necesitaremos acceder a determinados elementos de un vector. Este tipo de operaciones sobre los vectores se les conoce genéricamente como subsetting.
Para hacer subsetting se usan los corchetes: []
Vemos 3 tipos de subsetting
aa <- c(10:1)aa[c(1:2)] #- primer y segundo elemento del vectoraa[c(1, 2, 9, 10)] #- dos primeros y 2 últimosaa[c(1, 1, 10, 10)] #- si repites el indice se repite el elemento del vector
aa <- c(10:1)aa[c(1:2)] #- primer y segundo elemento del vectoraa[c(1, 2, 9, 10)] #- dos primeros y 2 últimosaa[c(1, 1, 10, 10)] #- si repites el indice se repite el elemento del vector
aa <- c(10:1)aa[-2]aa[- c(1, 2, 9:10)]
aa <- c(10:1)aa[c(1:2)] #- primer y segundo elemento del vectoraa[c(1, 2, 9, 10)] #- dos primeros y 2 últimosaa[c(1, 1, 10, 10)] #- si repites el indice se repite el elemento del vector
aa <- c(10:1)aa[-2]aa[- c(1, 2, 9:10)]
aa <- 1:10aa[aa >= 7]aa[aa < 4]aa[(aa >= 9) | (aa < 2)]aa[(aa >= 9) & (aa < 2)]
aa <- 1:10aa <= 4aa[aa <= 4]aa <- aa[aa <= 4]aa
aa <- 1:10aa <= 4aa[aa <= 4]aa <- aa[aa <= 4]aa
aa <- c(1:10)aa[4] <- 88 #- el cuarto elemento de aa tomará el valor 88aa <- c(aa, 111, 112) #- añadimos 2 elementos al vector aa
aa <- 1:10aa <= 4aa[aa <= 4]aa <- aa[aa <= 4]aa
aa <- c(1:10)aa[4] <- 88 #- el cuarto elemento de aa tomará el valor 88aa <- c(aa, 111, 112) #- añadimos 2 elementos al vector aa
aa <- c(1:5)bb <- c(100:105)cc <- c(aa, bb)
aa <- 1:10bb <- 1:10aa + bbaa * bb
aa %*% bb
aa <- 1:10bb <- 1:10aa + bbaa * bb
aa %*% bb
aa <- 1:10aa + 1
aa <- c(4, 9, 25)sqrt(aa)
aa <- c(4, 9, 25)sqrt(aa)
aa <- 1:3bb <- 3:1aa == bbaa >= bbaa != bb
aa <- 1:3bb <- 2aa == bbaa >= bbaa != bb
Las listas son una estructura de datos heterogénea: sí pueden contener elementos de distinto tipo.
La mejor forma de entender como funciona una lista es pensar que es como una cajonera. En cada cajón podemos poner objetos de diferentes tipos.
Las listas son una estructura de datos heterogénea: sí pueden contener elementos de distinto tipo.
La mejor forma de entender como funciona una lista es pensar que es como una cajonera. En cada cajón podemos poner objetos de diferentes tipos.
list()
# defino 3 vectores y una matrizvec_numerico <- c(1:8)vec_character <- c("Pedro", "Rebeca", "Susana")vec_logic <- c(TRUE, FALSE, TRUE)matriz <- matrix(1:6, nrow = 2, ncol = 3)# creo una lista con cuatro elementosmy_list <- list(vec_numerico, vec_character, vec_logic, matriz)my_list
Como son tan flexibles, se usan para muchas cosas, por ejemplo para almacenar los resultados de la estimación de modelos estadísticos. (por ejemplo, los gráficos de ggplot internamente son listas)
Un ejemplo:
my_list_2 <- list(primer_slot = c(44:47), segundo_slot = my_list)my_list_2
Como son tan flexibles, se usan para muchas cosas, por ejemplo para almacenar los resultados de la estimación de modelos estadísticos. (por ejemplo, los gráficos de ggplot internamente son listas)
Un ejemplo:
my_list_2 <- list(primer_slot = c(44:47), segundo_slot = my_list)my_list_2
Son otra estructura de R para almacenar datos. Se utiliza para almacenar datos tabulares, tablas de datos
En el fondo, un data.frame es una lista. Al ser una lista puede almacenar elementos de distinto tipo (numéricos, carácter etc…).
PERO es una lista especial: está restringida a que sus elementos/slots son vectores con la misma longitud; de forma que, al final tenemos una tabla de datos, donde cada columna será una variable
Otra propiedad de los data.frames es que sus vectores (o columnas) tienen que tener un nombre: será el nombre de la variable.
data.frame()
aa <- c(4, 8, 6, 3)bb <- c("Juan", "Paz", "Adrian", "Marquitos")cc <- c(FALSE, TRUE, TRUE, FALSE)df <- data.frame(aa, bb, cc)
data.frame()
aa <- c(4, 8, 6, 3)bb <- c("Juan", "Paz", "Adrian", "Marquitos")cc <- c(FALSE, TRUE, TRUE, FALSE)df <- data.frame(aa, bb, cc)
df <- data.frame(Nota = aa, Nombre = bb, Aprobado = cc)
Generalmente, cuando tengamos que hacer subsetting en un data frame, lo haremos à la tidyverse, pero conviene al menos conocer lo básico de como hacer subsetting con R-base.
Varias formas de subsetting:
como si fuera una matriz, usando el corchete; o sea, con [.
como si fuera una lista. De hecho un df es una clase especial de lista. Podemos usar 3 operadores: [, [[ y $.
Generalmente, cuando tengamos que hacer subsetting en un data frame, lo haremos à la tidyverse, pero conviene al menos conocer lo básico de como hacer subsetting con R-base.
Varias formas de subsetting:
como si fuera una matriz, usando el corchete; o sea, con [.
como si fuera una lista. De hecho un df es una clase especial de lista. Podemos usar 3 operadores: [, [[ y $.
df_s <- df[,1] #- seleccionamos la primera columna. devuelve un vector !!!df_s <- df[,c(2,3)] #- seleccionamos la segunda y tercera columna. devuelve un dfdf_s <- df[1, ] #- seleccionamos primera fila de todas las variables. devuelve un df. ¿xq no devuelve un vector? Preguntad si no lo sabéisdf_s <- df[c(1,4), ] #- seleccionamos primera y cuarta fila. devuelve un dfdf_s <- df[2, 3] #- seleccionamos segunda observación de la tercera variable. Devuelve un vector.
df_s <- df[3] #- devuelve un df. Good!!df_s <- df[c(1,2)]#- también se puede hacer por nombredf_s <- df["Name"] #- devuelve un dfdf_s <- df[c("Name", "Grade")]
df_s <- df[3] #- devuelve un df. Good!!df_s <- df[c(1,2)]#- también se puede hacer por nombredf_s <- df["Name"] #- devuelve un dfdf_s <- df[c("Name", "Grade")]
df_s <- df[[2]] #- Extraemos la segunda columna. Devuelve un vector, concretamente un factor. Ahhhh!!!!!
df_s <- df[3] #- devuelve un df. Good!!df_s <- df[c(1,2)]#- también se puede hacer por nombredf_s <- df["Name"] #- devuelve un dfdf_s <- df[c("Name", "Grade")]
df_s <- df[[2]] #- Extraemos la segunda columna. Devuelve un vector, concretamente un factor. Ahhhh!!!!!
df_s <- df$Name #- Extraemos la columna con nombre "Name". Devuelve un vector, concretamente un factor. Ahhhh!!!!!df_s <- df$Grade #- Extraemos la columna con nombre "Grade". Devuelve un vector numérico
To understand computations in R, two slogans are helpful:
- Everything that exists is an object.- Everything that happens is a function call.— John Chambers (creador de S)
To understand computations in R, two slogans are helpful:
- Everything that exists is an object.- Everything that happens is a function call.— John Chambers (creador de S)
¿Qué es una función? Una función no es más un trozo de código R, unas instrucciones de R, a las que les hemos puesto/asignado un nombre; entonces, cuando invoquemos ese nombre, esa función, se ejecutarán esas lineas de código. (!!!)
Como no creo que lo anterior os diga mucho, voy a usar 5 minutos para crear nuestra primera función. Vamos a R.
Tarea: crea una función que permita sumar 2 números
Pista: Las funciones en R se crean con la función llamada function()
. Sí, un poco trabalenguas.
Pista: La función que vamos a crear será un objeto de R, así que le tenemos que asignar un nombre
Pista: Los argumentos de la función van dentro de los parentesis separados por comas
Pista: El código que queramos que se ejecute cuando llamemos a la función va entre llaves
Por lo tanto, en genérico, una función en R se crea así:
nombre_de_mi_funcion <- function(primer_argumento, segundo_argumento, ...) { <el-codigo-q-quiero-q-se-ejecute-cuando-se-invoque-a-la-función>}
Sí lo conseguís sois genios o ya habéis visto esto en otro lenguaje
#- creamos una función llamada "my_suma()". Lo hacemos con la función de R llamada "function()"my_suma <- function(n1 , n2){ n1 + n2}#- para usar la función que hemos creadomy_suma(3 , 5)my_suma(n1 = 3 , n2 = 5)aa <- my_suma(30 , 50)
Tarea: crea una función que permita sumar 2 números
Pista: Las funciones en R se crean con la función llamada function()
. Sí, un poco trabalenguas.
Pista: La función que vamos a crear será un objeto de R, así que le tenemos que asignar un nombre
Pista: Los argumentos de la función van dentro de los parentesis separados por comas
Pista: El código que queramos que se ejecute cuando llamemos a la función va entre llaves
Por lo tanto, en genérico, una función en R se crea así:
nombre_de_mi_funcion <- function(primer_argumento, segundo_argumento, ...) { <el-codigo-q-quiero-q-se-ejecute-cuando-se-invoque-a-la-función>}
Sí lo conseguís sois genios o ya habéis visto esto en otro lenguaje
#- creamos una función llamada "my_suma()". Lo hacemos con la función de R llamada "function()"my_suma <- function(n1 , n2){ n1 + n2}#- para usar la función que hemos creadomy_suma(3 , 5)my_suma(n1 = 3 , n2 = 5)aa <- my_suma(30 , 50)
sqrt()
. Resulta que alguien se ha preocupado de construir una función llamada sqrt()
que sirve para calcular raíces cuadradas. Vamos a usarla!! Cómo??sqrt()
. Resulta que alguien se ha preocupado de construir una función llamada sqrt()
que sirve para calcular raíces cuadradas. Vamos a usarla!! Cómo??Para saber como usar una función lo que hay que hacer es consultar la ayuda de la función; sí cada función de R tiene una página de ayuda interna.
Para abrir la ayuda de una función tienes que situar el cursor en el nombre de la función y pinchar en F1. También puedes hacer:
help(sqrt)
sqrt(9)sqrt(9, 4) #- no funciona ¿por qué? ¿cuantos argumentos tiene la f. sqrt()?sqrt("9") #- no funciona, ¿por qué? ¿Cómo, de que tipo, ha de ser el argumento?
nombre_de_la_funcion(name_argumento_1 = valor_1, name_argumento_2 = valor_2, ....)
sqrt
, ok, pero ¿cuales son sus argumentos? La ayuda nos dice que sólo tiene un argumento, cuyo nombre es x; además, el valor del argumento debe ser numérico. (!!!). sqrt(9) #- en realidad "no hace falta" poner el nombre del argumentosqrt(x = 9) #- sqrt(x = 4)
nombre_de_la_funcion(name_argumento_1 = valor_1, name_argumento_2 = valor_2, ....)
sqrt
, ok, pero ¿cuales son sus argumentos? La ayuda nos dice que sólo tiene un argumento, cuyo nombre es x; además, el valor del argumento debe ser numérico. (!!!). sqrt(9) #- en realidad "no hace falta" poner el nombre del argumentosqrt(x = 9) #- sqrt(x = 4)
sqrt(9)sqrt(x = 9)x <- 25sqrt(x)sqrt(x = x) #- !!!sqrt(x = un_valor) #- !!!sqrt(nn = 9) #- !!!
Tarea: calculad con R el logaritmo de 1000 en base 10.
Para ello tenéis que usar la función log(), y cómo no sabéis cómo se usa, no sabéis cómo es su sintaxis, no sabéis cuales son sus argumentos, os tocará mirar la ayuda de la función.
Tarea: calculad con R el logaritmo de 1000 en base 10.
Para ello tenéis que usar la función log(), y cómo no sabéis cómo se usa, no sabéis cómo es su sintaxis, no sabéis cuales son sus argumentos, os tocará mirar la ayuda de la función.
log(1000)
no va a funcionar. ¿Por qué? para saberlo tendrás que mirar la ayuda de la función log()
help(log)
log(1000) #- como no especificamos el valor del argumento "base", #- R lo fija a su valor x defecto; es decir, base = exp(1) #- así que estamos tomando logaritmos naturales
log(x = 1000, base = 10) #- GOODlog(1000, base = 10) #- es equivalentelog(x = 1000, 10) #- es equivalentelog(1000, 10) #- es equivalentelog(1000, bas = 10) #- funciona, pero ...
¿Por qué no podemos usar la expresión de abajo?
log(10, 1000)
log(base = 10, 1000)
function_name <- function(my_args) { # process the arguments # return some value }
function_name <- function(my_args) { # process the arguments # return some value }
Por ejemplo, podríamos crear una función para sumar 1 a un número:
add1 <- function(my_number) { my_number + 1}
function_name <- function(my_args) { # process the arguments # return some value }
Por ejemplo, podríamos crear una función para sumar 1 a un número:
add1 <- function(my_number) { my_number + 1}
Os recuerdo la tarea: tenéis que crear una función que sume 3 números
Venga, que os ayudo: Hay que utilizar la f. llamada function()
y poner entre llaves el código que quieres que implemente la función.
Recuerda que has de poner un nombre a tu función.
Recuerda que has de poner el nombre de los argumentos de tu función dentro del paréntesis, separados por comas. Nuestra función tendrá 3 argumentos
Quedará algo así:
name_of_my_function <- function(<los argumentos van AQUI>){ #- aquí tienes que poner el código de la función}
Esta vez no hay solución.
00:45
Como ya hemos creado nuestra función que suma 3 números, vamos a mejorarla un poco: vamos a poner valores por defecto a los argumentos (por si alguien se olvida de introducir los valores a nuestra función).
Venga, os doy una solución parcial. Solo tenéis que rellenar los 7 sitios en los que aparece "..."
... <- function(n1 = ... , ... = 6, ... = ... ){ ... + n2 + ...}
00:45
my_suma <- function(n1 , n2, n3){ n1 + n2 + n3}#- vamos a usar nuestra funciónmy_suma(2, 2, 2)my_suma(2) #- xq no funciona
my_suma <- function(n1 = 4 , n2 = 6, n2 = 3){ n1 + n2 + n3}#- vamos a usar nuestra funciónmy_suma(2, 2, 2)my_suma(2) #- xq ahora sí funciona
¿Qué son los paquetes? trozos/porciones de código R que podemos instalar en nuestro ordenador
¿Qué ganamos instalando un paquete? Los paquetes nos proveen de nuevas funciones o nuevos datos; es decir incrementa la funcionalidad de R: por ejemplo, con el pkg meme
podemos hacer memes.
¿Qué son los paquetes? trozos/porciones de código R que podemos instalar en nuestro ordenador
¿Qué ganamos instalando un paquete? Los paquetes nos proveen de nuevas funciones o nuevos datos; es decir incrementa la funcionalidad de R: por ejemplo, con el pkg meme
podemos hacer memes.
Los paquetes suelen estar en repositorios
R tiene un repositorio oficial llamado CRAN. Ahora mismo tiene 16.273 paquetes. Aquí puedes ver el listado de paquetes ordenados alfabéticamente y por fecha, y aquí ordenados por tópico.
Hay otros repositorios: Github, Gitlab, Bioconductor, ...
install.packages("dplyr") #- instalamos el pkg dplyr en nuestro ordenadorlibrary(dplyr) #- cargamos dplyr en memoria de R para así poder usarlo
remotes
o el paquete devtools
y hacer: install.packages("remotes") #- previamente hay que instalar el pkg remotesremotes::install_github("tidyverse/dplyr") #- instalamos la versión de github del pkg dplyr
install.packages("dplyr") #- instalamos el pkg dplyr en nuestro ordenadorlibrary(dplyr) #- cargamos dplyr en memoria de R para así poder usarlo
remotes
o el paquete devtools
y hacer: install.packages("remotes") #- previamente hay que instalar el pkg remotesremotes::install_github("tidyverse/dplyr") #- instalamos la versión de github del pkg dplyr
library(dplyr) #- cargamos dplyr en memoria de R para así poder usarlo
library()
Los paquetes que están en CRAN, tienen obligatoriamente un manual en pdf, pero son mucho más didácticas las vignettes (que no son obligatorias).
Por ejemplo, el paquete dplyr
está en CRAN en esta dirección. Como podéis ver tiene un manual en pdf y un listado de viñetas.
Si el paquete tiene vignettes, también puedes consultarlas desde RStudio usando cualquiera de las 2 expresiones de abajo:
help(package = "dplyr")browseVignettes("dplyr")
Los paquetes que están en CRAN, tienen obligatoriamente un manual en pdf, pero son mucho más didácticas las vignettes (que no son obligatorias).
Por ejemplo, el paquete dplyr
está en CRAN en esta dirección. Como podéis ver tiene un manual en pdf y un listado de viñetas.
Si el paquete tiene vignettes, también puedes consultarlas desde RStudio usando cualquiera de las 2 expresiones de abajo:
help(package = "dplyr")browseVignettes("dplyr")
Generalmente los paquetes, incluso los que están en CRAN, tienen una versión de desarrollo en Github. Por ejemplo, aquí tienes el link al repo de dplyr en Github.
Además, cada vez es más frecuente que los paquetes tengan una pagina web propia. Por ejemplo aquí tienes la pagina web de dplyr
. Generalmente tienen una sección llamada "Articles" donde tienes las vignettes.
Los paquetes que están en CRAN, tienen obligatoriamente un manual en pdf, pero son mucho más didácticas las vignettes (que no son obligatorias).
Por ejemplo, el paquete dplyr
está en CRAN en esta dirección. Como podéis ver tiene un manual en pdf y un listado de viñetas.
Si el paquete tiene vignettes, también puedes consultarlas desde RStudio usando cualquiera de las 2 expresiones de abajo:
help(package = "dplyr")browseVignettes("dplyr")
Generalmente los paquetes, incluso los que están en CRAN, tienen una versión de desarrollo en Github. Por ejemplo, aquí tienes el link al repo de dplyr en Github.
Además, cada vez es más frecuente que los paquetes tengan una pagina web propia. Por ejemplo aquí tienes la pagina web de dplyr
. Generalmente tienen una sección llamada "Articles" donde tienes las vignettes.
Aunque la verdad, muchas veces, la forma más rápida de aprender a usar un paquete es buscar en Google, y generalmente encuentras un post con una buena introducción al paquete.
Tarea: imagina que queremos usar el paquete explore
ya que parece que facilita el análisis rápido de datos. Trata de usar este paquete para analizar un conjunto de datos; p.ej. el conjunto de datos iris
o el conjunto de datos penguins
del paquete palmerpenguins
.
Yo: Sí, ya sé que llevas poco tiempo con R y que no has usado nunca ese paquete... pero sabes que generalmente los paquetes tienen vignettes y que igual en algún post describen su uso. Venga a ello!!!
Tú: casi mejor me espero a que lo hagas tú.
Yo: No way!!
Tú: pero es que estoy cansado, y da pereza, y no voy a saber!!
Yo: Venga a buscar información de ese paquete!! Ni se te ocurra mirar la "solución".
#- post: https://rolkra.github.io/start-to-explore/#- CRAN: https://cran.r-project.org/web/packages/explore/index.html#- Github: https://github.com/rolkra/explore#- install.packages("explore") #- instalamos la versión de CRAN#- devtools::install_github("rolkra/explore") #- instalamos la versión de Github#- vamos a usar el paquete con el conjunto de datos `iris`library(explore)explore(iris)#- vamos a usar explore para analizar `penguins`library(palmerpenguins)library(explore)explore(penguins)
Keyboard shortcuts
↑, ←, Pg Up, k | Go to previous slide |
↓, →, Pg Dn, Space, j | Go to next slide |
Home | Go to first slide |
End | Go to last slide |
Number + Return | Go to specific slide |
b / m / f | Toggle blackout / mirrored / fullscreen mode |
c | Clone slideshow |
p | Toggle presenter mode |
t | Restart the presentation timer |
?, h | Toggle this help |
o | Tile View: Overview of Slides |
s | Toggle scribble toolbox |
Alt + f | Fit Slides to Screen |
Esc | Back to slideshow |
asignación
tipos de datos
estructuras de datos
funciones
paquetes: instalación y ayuda
<-
) permite asignar datos/valores a variables/objetos. Con la asignación se crean objetos/variables que después podremos usar en otras operaciones.El operador de asignación (<-
) permite asignar datos/valores a variables/objetos. Con la asignación se crean objetos/variables que después podremos usar en otras operaciones.
Es mucho más fácil explicarlo apoyándose en ejemplos:
#- ¿Qué diferencias hay entre las siguientes 2 expresiones?2 + 2aa <- 2 + 2#- una vez hemos creado una variable, podemos usarla para efectuar nuevos cálculosaa + 1#- podemos cambiar el valor de una variableaaaa <- 10aa#- ¿Qué hacen las siguientes lineas de código? aa <- 2 + 2bb <- 5 + aacc <- 1 + aa * 2dd <- bb
En R, la forma genérica de una operación de asignación, o de “creación de objetos”, es: nombre_del_objeto <- valor , por ejemplo aa <- 2 + 2 [ 🌟 ] [🌶]
Recuerda que para que un nombre sea sintácticamente válido en R sólo puede contener caracteres alfanuméricos (letras y números), puntos (.) y guiones bajos (_).
Además, hay nombres reservados (TRUE, NA, if, while, do , next, for ...)
En R, la forma genérica de una operación de asignación, o de “creación de objetos”, es: nombre_del_objeto <- valor , por ejemplo aa <- 2 + 2 [ 🌟 ] [🌶]
Recuerda que para que un nombre sea sintácticamente válido en R sólo puede contener caracteres alfanuméricos (letras y números), puntos (.) y guiones bajos (_).
Además, hay nombres reservados (TRUE, NA, if, while, do , next, for ...)
Cada vez que asignamos un nombre a un valor, R crea un nuevo objeto en el Global environment. Veámoslo:
aa <- 2 + 2bb <- 5 + aacc <- 1 + aa * 2dd <- bbls() #- muestra los objetos q hay en el Global env. rm(cc) #- borra/elimina el objeto cc del Global env.rm(list = ls()) #- borra todos los objetos del Global env.
Hay 3 tipos principales: numéricos, de texto y lógicos, pero en realidad R tiene 6 tipos de datos.
Además, hay 4 valores especiales: NULL, NA, NaN, e infinito
Cada dato, valor o variable es de un tipo.
aa <- "La calle en la que vivo es" #- texto (character)bb <- 4L #- número enterocc <- 4.3 #- número decimaldd <- TRUE #- logicaltypeof(aa)typeof(dd)
2 + 25 * 6
2 + 25 * 6
2 < 4 # MENOR que: esta expresión chequea si 2 es MENOR que cuatro. Como es cierto, nos devuelve un TRUE2 > 4 # MAYOR que: esta expresión chequea si 2 es MAYOR que cuatro. Como es cierto, nos devuelve un TRUE5 >= 7 # MAYOR o IGUAL que.8 <= 8 # MENOR o IGUAL que.5 == 4 # == IGUAL: == chequea si dos valores son iguales, como no son iguales devolverá FALSE2 != 4 # NO IGUAL: como 2 no es igual a 4 nos devuelve TRUE5 != 5 # NO IGUAL: como 5 es igual a 5, nos devuelve FALSE
2 = 2 #- ¿qué ocurre? ¿xq se queja R?
En R hay muchas funciones para trabajar/operar sobre texto
Por ejemplo, la función paste()
nos permite pegar o concatenar dos variables de tipo character:
aa <- "mi nombre es"bb <- "pedro"paste(aa, bb)paste(aa, bb, sep = " ... ")# Prueba tú mismo que hace la función paste0()
toupper(aa)tolower(aa)stringr::str_to_sentence(aa) #- stringr es un pkg del tidyversenchar(bb) #- nchar() nos devuelve el número de caracteres de un stringsubstring(bb, 2, nchar(bb)) #- substring() extrae caracteres de un string [🌶🌶]
TRUE & TRUE #- AND: para q devuelva TRUE hace falta que TODAS las condiciones sean ciertasTRUE & FALSEFALSE & FALSETRUE | TRUE #- OR: devuelve TRUE si ALGUNA de las condiciones es ciertaTRUE | FALSEFALSE | FALSE!TRUE #- NOT: devuelve el valor contrario!FALSE
(4 > 3) & (3 < 2) #- AND: como solo se cumple la primera condición, nos devuelve TRUE(1==2) | (2 >3) #- OR: Como no se cumple ninguna de las 2 condiciones nos devuelve FALSE!(4 > 3) #- NOT: 4 es mayor que 3 es TRUE, pero el ! delante de esa condición la niega y pasa a FALSE!!(4 > 3) #- si niegas dos veces, vuelves al principio: TRUE
R sirve para hacer análisis estadísticos con datos, y los datos tienen que estar almacenados en alguna estructura. Las principales estructuras de datos en R son:
vectores
matrices
arrays (matrices multidimensionales)
listas
data.frames
R sirve para hacer análisis estadísticos con datos, y los datos tienen que estar almacenados en alguna estructura. Las principales estructuras de datos en R son:
vectores
matrices
arrays (matrices multidimensionales)
listas
data.frames
Las que más utilizaremos en el curso son los *data.frames, y en segundo lugar las listas.
Si, pero en realidad estas 2 estructuras (data.frames y listas) son en realidad agrupaciones de vectores; es decir, la estructura básica, la más importante en R son los vectores.
Son los más importantes porque el resto de estructuras se construyen a partir de grupos de vectores o añadiendo alguna propiedad adicional, o atributo, a un vector.
La estructura de datos fundamental en R es el vector.
En R, un vector es una estructura de datos que sirve para almacenar un conjunto ordenado de valores o elementos.
Un vector puede contener cualquier número de elementos; sin embargo, todos los elementos deben ser del mismo tipo. Por ejemplo, un vector no puede contener simultáneamente números y texto.
aa <- c(3, 22, 6)aais.vector(aa)typeof(aa)
Sabemos que un vector solo puede contener elementos de un tipo (es una estructura homogénea)
¿Qué ocurre si intentamos mezclar en un vector elementos de distinto tipo? R convertirá (coercerá) los elementos para que sean del mismo tipo
aa <- c(4, 6, "Hola") #- intentamos poner en aa elementos numéricos y character (¿?)is.vector(aa)typeof(aa) #- ¿qué ha pasado?aa #- ¿qué ha pasado?
character > double > integer > logical
. Por ejemplo, si en el vector hay un valor textual, todos los valores se convertirán al tipo character.Sabemos que un vector solo puede contener elementos de un tipo (es una estructura homogénea)
¿Qué ocurre si intentamos mezclar en un vector elementos de distinto tipo? R convertirá (coercerá) los elementos para que sean del mismo tipo
aa <- c(4, 6, "Hola") #- intentamos poner en aa elementos numéricos y character (¿?)is.vector(aa)typeof(aa) #- ¿qué ha pasado?aa #- ¿qué ha pasado?
character > double > integer > logical
. Por ejemplo, si en el vector hay un valor textual, todos los valores se convertirán al tipo character.aa <- c(1:4)aaaa <- as.character(aa)aa
En R podemos agrupar valores en vectores. Perfecto, pero habrá veces que necesitemos manipular los vectores. Por ejemplo necesitaremos acceder a determinados elementos de un vector. Este tipo de operaciones sobre los vectores se les conoce genéricamente como subsetting.
Para hacer subsetting se usan los corchetes: []
Vemos 3 tipos de subsetting
En R podemos agrupar valores en vectores. Perfecto, pero habrá veces que necesitemos manipular los vectores. Por ejemplo necesitaremos acceder a determinados elementos de un vector. Este tipo de operaciones sobre los vectores se les conoce genéricamente como subsetting.
Para hacer subsetting se usan los corchetes: []
Vemos 3 tipos de subsetting
aa <- c(10:1)aa[c(1:2)] #- primer y segundo elemento del vectoraa[c(1, 2, 9, 10)] #- dos primeros y 2 últimosaa[c(1, 1, 10, 10)] #- si repites el indice se repite el elemento del vector
aa <- c(10:1)aa[c(1:2)] #- primer y segundo elemento del vectoraa[c(1, 2, 9, 10)] #- dos primeros y 2 últimosaa[c(1, 1, 10, 10)] #- si repites el indice se repite el elemento del vector
aa <- c(10:1)aa[-2]aa[- c(1, 2, 9:10)]
aa <- c(10:1)aa[c(1:2)] #- primer y segundo elemento del vectoraa[c(1, 2, 9, 10)] #- dos primeros y 2 últimosaa[c(1, 1, 10, 10)] #- si repites el indice se repite el elemento del vector
aa <- c(10:1)aa[-2]aa[- c(1, 2, 9:10)]
aa <- 1:10aa[aa >= 7]aa[aa < 4]aa[(aa >= 9) | (aa < 2)]aa[(aa >= 9) & (aa < 2)]
aa <- 1:10aa <= 4aa[aa <= 4]aa <- aa[aa <= 4]aa
aa <- 1:10aa <= 4aa[aa <= 4]aa <- aa[aa <= 4]aa
aa <- c(1:10)aa[4] <- 88 #- el cuarto elemento de aa tomará el valor 88aa <- c(aa, 111, 112) #- añadimos 2 elementos al vector aa
aa <- 1:10aa <= 4aa[aa <= 4]aa <- aa[aa <= 4]aa
aa <- c(1:10)aa[4] <- 88 #- el cuarto elemento de aa tomará el valor 88aa <- c(aa, 111, 112) #- añadimos 2 elementos al vector aa
aa <- c(1:5)bb <- c(100:105)cc <- c(aa, bb)
aa <- 1:10bb <- 1:10aa + bbaa * bb
aa %*% bb
aa <- 1:10bb <- 1:10aa + bbaa * bb
aa %*% bb
aa <- 1:10aa + 1
aa <- c(4, 9, 25)sqrt(aa)
aa <- c(4, 9, 25)sqrt(aa)
aa <- 1:3bb <- 3:1aa == bbaa >= bbaa != bb
aa <- 1:3bb <- 2aa == bbaa >= bbaa != bb
Las listas son una estructura de datos heterogénea: sí pueden contener elementos de distinto tipo.
La mejor forma de entender como funciona una lista es pensar que es como una cajonera. En cada cajón podemos poner objetos de diferentes tipos.
Las listas son una estructura de datos heterogénea: sí pueden contener elementos de distinto tipo.
La mejor forma de entender como funciona una lista es pensar que es como una cajonera. En cada cajón podemos poner objetos de diferentes tipos.
list()
# defino 3 vectores y una matrizvec_numerico <- c(1:8)vec_character <- c("Pedro", "Rebeca", "Susana")vec_logic <- c(TRUE, FALSE, TRUE)matriz <- matrix(1:6, nrow = 2, ncol = 3)# creo una lista con cuatro elementosmy_list <- list(vec_numerico, vec_character, vec_logic, matriz)my_list
Como son tan flexibles, se usan para muchas cosas, por ejemplo para almacenar los resultados de la estimación de modelos estadísticos. (por ejemplo, los gráficos de ggplot internamente son listas)
Un ejemplo:
my_list_2 <- list(primer_slot = c(44:47), segundo_slot = my_list)my_list_2
Como son tan flexibles, se usan para muchas cosas, por ejemplo para almacenar los resultados de la estimación de modelos estadísticos. (por ejemplo, los gráficos de ggplot internamente son listas)
Un ejemplo:
my_list_2 <- list(primer_slot = c(44:47), segundo_slot = my_list)my_list_2
Son otra estructura de R para almacenar datos. Se utiliza para almacenar datos tabulares, tablas de datos
En el fondo, un data.frame es una lista. Al ser una lista puede almacenar elementos de distinto tipo (numéricos, carácter etc…).
PERO es una lista especial: está restringida a que sus elementos/slots son vectores con la misma longitud; de forma que, al final tenemos una tabla de datos, donde cada columna será una variable
Otra propiedad de los data.frames es que sus vectores (o columnas) tienen que tener un nombre: será el nombre de la variable.
data.frame()
aa <- c(4, 8, 6, 3)bb <- c("Juan", "Paz", "Adrian", "Marquitos")cc <- c(FALSE, TRUE, TRUE, FALSE)df <- data.frame(aa, bb, cc)
data.frame()
aa <- c(4, 8, 6, 3)bb <- c("Juan", "Paz", "Adrian", "Marquitos")cc <- c(FALSE, TRUE, TRUE, FALSE)df <- data.frame(aa, bb, cc)
df <- data.frame(Nota = aa, Nombre = bb, Aprobado = cc)
Generalmente, cuando tengamos que hacer subsetting en un data frame, lo haremos à la tidyverse, pero conviene al menos conocer lo básico de como hacer subsetting con R-base.
Varias formas de subsetting:
como si fuera una matriz, usando el corchete; o sea, con [.
como si fuera una lista. De hecho un df es una clase especial de lista. Podemos usar 3 operadores: [, [[ y $.
Generalmente, cuando tengamos que hacer subsetting en un data frame, lo haremos à la tidyverse, pero conviene al menos conocer lo básico de como hacer subsetting con R-base.
Varias formas de subsetting:
como si fuera una matriz, usando el corchete; o sea, con [.
como si fuera una lista. De hecho un df es una clase especial de lista. Podemos usar 3 operadores: [, [[ y $.
df_s <- df[,1] #- seleccionamos la primera columna. devuelve un vector !!!df_s <- df[,c(2,3)] #- seleccionamos la segunda y tercera columna. devuelve un dfdf_s <- df[1, ] #- seleccionamos primera fila de todas las variables. devuelve un df. ¿xq no devuelve un vector? Preguntad si no lo sabéisdf_s <- df[c(1,4), ] #- seleccionamos primera y cuarta fila. devuelve un dfdf_s <- df[2, 3] #- seleccionamos segunda observación de la tercera variable. Devuelve un vector.
df_s <- df[3] #- devuelve un df. Good!!df_s <- df[c(1,2)]#- también se puede hacer por nombredf_s <- df["Name"] #- devuelve un dfdf_s <- df[c("Name", "Grade")]
df_s <- df[3] #- devuelve un df. Good!!df_s <- df[c(1,2)]#- también se puede hacer por nombredf_s <- df["Name"] #- devuelve un dfdf_s <- df[c("Name", "Grade")]
df_s <- df[[2]] #- Extraemos la segunda columna. Devuelve un vector, concretamente un factor. Ahhhh!!!!!
df_s <- df[3] #- devuelve un df. Good!!df_s <- df[c(1,2)]#- también se puede hacer por nombredf_s <- df["Name"] #- devuelve un dfdf_s <- df[c("Name", "Grade")]
df_s <- df[[2]] #- Extraemos la segunda columna. Devuelve un vector, concretamente un factor. Ahhhh!!!!!
df_s <- df$Name #- Extraemos la columna con nombre "Name". Devuelve un vector, concretamente un factor. Ahhhh!!!!!df_s <- df$Grade #- Extraemos la columna con nombre "Grade". Devuelve un vector numérico
To understand computations in R, two slogans are helpful:
- Everything that exists is an object.- Everything that happens is a function call.— John Chambers (creador de S)
To understand computations in R, two slogans are helpful:
- Everything that exists is an object.- Everything that happens is a function call.— John Chambers (creador de S)
¿Qué es una función? Una función no es más un trozo de código R, unas instrucciones de R, a las que les hemos puesto/asignado un nombre; entonces, cuando invoquemos ese nombre, esa función, se ejecutarán esas lineas de código. (!!!)
Como no creo que lo anterior os diga mucho, voy a usar 5 minutos para crear nuestra primera función. Vamos a R.
Tarea: crea una función que permita sumar 2 números
Pista: Las funciones en R se crean con la función llamada function()
. Sí, un poco trabalenguas.
Pista: La función que vamos a crear será un objeto de R, así que le tenemos que asignar un nombre
Pista: Los argumentos de la función van dentro de los parentesis separados por comas
Pista: El código que queramos que se ejecute cuando llamemos a la función va entre llaves
Por lo tanto, en genérico, una función en R se crea así:
nombre_de_mi_funcion <- function(primer_argumento, segundo_argumento, ...) { <el-codigo-q-quiero-q-se-ejecute-cuando-se-invoque-a-la-función>}
Sí lo conseguís sois genios o ya habéis visto esto en otro lenguaje
#- creamos una función llamada "my_suma()". Lo hacemos con la función de R llamada "function()"my_suma <- function(n1 , n2){ n1 + n2}#- para usar la función que hemos creadomy_suma(3 , 5)my_suma(n1 = 3 , n2 = 5)aa <- my_suma(30 , 50)
Tarea: crea una función que permita sumar 2 números
Pista: Las funciones en R se crean con la función llamada function()
. Sí, un poco trabalenguas.
Pista: La función que vamos a crear será un objeto de R, así que le tenemos que asignar un nombre
Pista: Los argumentos de la función van dentro de los parentesis separados por comas
Pista: El código que queramos que se ejecute cuando llamemos a la función va entre llaves
Por lo tanto, en genérico, una función en R se crea así:
nombre_de_mi_funcion <- function(primer_argumento, segundo_argumento, ...) { <el-codigo-q-quiero-q-se-ejecute-cuando-se-invoque-a-la-función>}
Sí lo conseguís sois genios o ya habéis visto esto en otro lenguaje
#- creamos una función llamada "my_suma()". Lo hacemos con la función de R llamada "function()"my_suma <- function(n1 , n2){ n1 + n2}#- para usar la función que hemos creadomy_suma(3 , 5)my_suma(n1 = 3 , n2 = 5)aa <- my_suma(30 , 50)
sqrt()
. Resulta que alguien se ha preocupado de construir una función llamada sqrt()
que sirve para calcular raíces cuadradas. Vamos a usarla!! Cómo??sqrt()
. Resulta que alguien se ha preocupado de construir una función llamada sqrt()
que sirve para calcular raíces cuadradas. Vamos a usarla!! Cómo??Para saber como usar una función lo que hay que hacer es consultar la ayuda de la función; sí cada función de R tiene una página de ayuda interna.
Para abrir la ayuda de una función tienes que situar el cursor en el nombre de la función y pinchar en F1. También puedes hacer:
help(sqrt)
sqrt(9)sqrt(9, 4) #- no funciona ¿por qué? ¿cuantos argumentos tiene la f. sqrt()?sqrt("9") #- no funciona, ¿por qué? ¿Cómo, de que tipo, ha de ser el argumento?
nombre_de_la_funcion(name_argumento_1 = valor_1, name_argumento_2 = valor_2, ....)
sqrt
, ok, pero ¿cuales son sus argumentos? La ayuda nos dice que sólo tiene un argumento, cuyo nombre es x; además, el valor del argumento debe ser numérico. (!!!). sqrt(9) #- en realidad "no hace falta" poner el nombre del argumentosqrt(x = 9) #- sqrt(x = 4)
nombre_de_la_funcion(name_argumento_1 = valor_1, name_argumento_2 = valor_2, ....)
sqrt
, ok, pero ¿cuales son sus argumentos? La ayuda nos dice que sólo tiene un argumento, cuyo nombre es x; además, el valor del argumento debe ser numérico. (!!!). sqrt(9) #- en realidad "no hace falta" poner el nombre del argumentosqrt(x = 9) #- sqrt(x = 4)
sqrt(9)sqrt(x = 9)x <- 25sqrt(x)sqrt(x = x) #- !!!sqrt(x = un_valor) #- !!!sqrt(nn = 9) #- !!!
Tarea: calculad con R el logaritmo de 1000 en base 10.
Para ello tenéis que usar la función log(), y cómo no sabéis cómo se usa, no sabéis cómo es su sintaxis, no sabéis cuales son sus argumentos, os tocará mirar la ayuda de la función.
Tarea: calculad con R el logaritmo de 1000 en base 10.
Para ello tenéis que usar la función log(), y cómo no sabéis cómo se usa, no sabéis cómo es su sintaxis, no sabéis cuales son sus argumentos, os tocará mirar la ayuda de la función.
log(1000)
no va a funcionar. ¿Por qué? para saberlo tendrás que mirar la ayuda de la función log()
help(log)
log(1000) #- como no especificamos el valor del argumento "base", #- R lo fija a su valor x defecto; es decir, base = exp(1) #- así que estamos tomando logaritmos naturales
log(x = 1000, base = 10) #- GOODlog(1000, base = 10) #- es equivalentelog(x = 1000, 10) #- es equivalentelog(1000, 10) #- es equivalentelog(1000, bas = 10) #- funciona, pero ...
¿Por qué no podemos usar la expresión de abajo?
log(10, 1000)
log(base = 10, 1000)
function_name <- function(my_args) { # process the arguments # return some value }
function_name <- function(my_args) { # process the arguments # return some value }
Por ejemplo, podríamos crear una función para sumar 1 a un número:
add1 <- function(my_number) { my_number + 1}
function_name <- function(my_args) { # process the arguments # return some value }
Por ejemplo, podríamos crear una función para sumar 1 a un número:
add1 <- function(my_number) { my_number + 1}
Os recuerdo la tarea: tenéis que crear una función que sume 3 números
Venga, que os ayudo: Hay que utilizar la f. llamada function()
y poner entre llaves el código que quieres que implemente la función.
Recuerda que has de poner un nombre a tu función.
Recuerda que has de poner el nombre de los argumentos de tu función dentro del paréntesis, separados por comas. Nuestra función tendrá 3 argumentos
Quedará algo así:
name_of_my_function <- function(<los argumentos van AQUI>){ #- aquí tienes que poner el código de la función}
Esta vez no hay solución.
00:45
Como ya hemos creado nuestra función que suma 3 números, vamos a mejorarla un poco: vamos a poner valores por defecto a los argumentos (por si alguien se olvida de introducir los valores a nuestra función).
Venga, os doy una solución parcial. Solo tenéis que rellenar los 7 sitios en los que aparece "..."
... <- function(n1 = ... , ... = 6, ... = ... ){ ... + n2 + ...}
00:45
my_suma <- function(n1 , n2, n3){ n1 + n2 + n3}#- vamos a usar nuestra funciónmy_suma(2, 2, 2)my_suma(2) #- xq no funciona
my_suma <- function(n1 = 4 , n2 = 6, n2 = 3){ n1 + n2 + n3}#- vamos a usar nuestra funciónmy_suma(2, 2, 2)my_suma(2) #- xq ahora sí funciona
¿Qué son los paquetes? trozos/porciones de código R que podemos instalar en nuestro ordenador
¿Qué ganamos instalando un paquete? Los paquetes nos proveen de nuevas funciones o nuevos datos; es decir incrementa la funcionalidad de R: por ejemplo, con el pkg meme
podemos hacer memes.
¿Qué son los paquetes? trozos/porciones de código R que podemos instalar en nuestro ordenador
¿Qué ganamos instalando un paquete? Los paquetes nos proveen de nuevas funciones o nuevos datos; es decir incrementa la funcionalidad de R: por ejemplo, con el pkg meme
podemos hacer memes.
Los paquetes suelen estar en repositorios
R tiene un repositorio oficial llamado CRAN. Ahora mismo tiene 16.273 paquetes. Aquí puedes ver el listado de paquetes ordenados alfabéticamente y por fecha, y aquí ordenados por tópico.
Hay otros repositorios: Github, Gitlab, Bioconductor, ...
install.packages("dplyr") #- instalamos el pkg dplyr en nuestro ordenadorlibrary(dplyr) #- cargamos dplyr en memoria de R para así poder usarlo
remotes
o el paquete devtools
y hacer: install.packages("remotes") #- previamente hay que instalar el pkg remotesremotes::install_github("tidyverse/dplyr") #- instalamos la versión de github del pkg dplyr
install.packages("dplyr") #- instalamos el pkg dplyr en nuestro ordenadorlibrary(dplyr) #- cargamos dplyr en memoria de R para así poder usarlo
remotes
o el paquete devtools
y hacer: install.packages("remotes") #- previamente hay que instalar el pkg remotesremotes::install_github("tidyverse/dplyr") #- instalamos la versión de github del pkg dplyr
library(dplyr) #- cargamos dplyr en memoria de R para así poder usarlo
library()
Los paquetes que están en CRAN, tienen obligatoriamente un manual en pdf, pero son mucho más didácticas las vignettes (que no son obligatorias).
Por ejemplo, el paquete dplyr
está en CRAN en esta dirección. Como podéis ver tiene un manual en pdf y un listado de viñetas.
Si el paquete tiene vignettes, también puedes consultarlas desde RStudio usando cualquiera de las 2 expresiones de abajo:
help(package = "dplyr")browseVignettes("dplyr")
Los paquetes que están en CRAN, tienen obligatoriamente un manual en pdf, pero son mucho más didácticas las vignettes (que no son obligatorias).
Por ejemplo, el paquete dplyr
está en CRAN en esta dirección. Como podéis ver tiene un manual en pdf y un listado de viñetas.
Si el paquete tiene vignettes, también puedes consultarlas desde RStudio usando cualquiera de las 2 expresiones de abajo:
help(package = "dplyr")browseVignettes("dplyr")
Generalmente los paquetes, incluso los que están en CRAN, tienen una versión de desarrollo en Github. Por ejemplo, aquí tienes el link al repo de dplyr en Github.
Además, cada vez es más frecuente que los paquetes tengan una pagina web propia. Por ejemplo aquí tienes la pagina web de dplyr
. Generalmente tienen una sección llamada "Articles" donde tienes las vignettes.
Los paquetes que están en CRAN, tienen obligatoriamente un manual en pdf, pero son mucho más didácticas las vignettes (que no son obligatorias).
Por ejemplo, el paquete dplyr
está en CRAN en esta dirección. Como podéis ver tiene un manual en pdf y un listado de viñetas.
Si el paquete tiene vignettes, también puedes consultarlas desde RStudio usando cualquiera de las 2 expresiones de abajo:
help(package = "dplyr")browseVignettes("dplyr")
Generalmente los paquetes, incluso los que están en CRAN, tienen una versión de desarrollo en Github. Por ejemplo, aquí tienes el link al repo de dplyr en Github.
Además, cada vez es más frecuente que los paquetes tengan una pagina web propia. Por ejemplo aquí tienes la pagina web de dplyr
. Generalmente tienen una sección llamada "Articles" donde tienes las vignettes.
Aunque la verdad, muchas veces, la forma más rápida de aprender a usar un paquete es buscar en Google, y generalmente encuentras un post con una buena introducción al paquete.
Tarea: imagina que queremos usar el paquete explore
ya que parece que facilita el análisis rápido de datos. Trata de usar este paquete para analizar un conjunto de datos; p.ej. el conjunto de datos iris
o el conjunto de datos penguins
del paquete palmerpenguins
.
Yo: Sí, ya sé que llevas poco tiempo con R y que no has usado nunca ese paquete... pero sabes que generalmente los paquetes tienen vignettes y que igual en algún post describen su uso. Venga a ello!!!
Tú: casi mejor me espero a que lo hagas tú.
Yo: No way!!
Tú: pero es que estoy cansado, y da pereza, y no voy a saber!!
Yo: Venga a buscar información de ese paquete!! Ni se te ocurra mirar la "solución".
#- post: https://rolkra.github.io/start-to-explore/#- CRAN: https://cran.r-project.org/web/packages/explore/index.html#- Github: https://github.com/rolkra/explore#- install.packages("explore") #- instalamos la versión de CRAN#- devtools::install_github("rolkra/explore") #- instalamos la versión de Github#- vamos a usar el paquete con el conjunto de datos `iris`library(explore)explore(iris)#- vamos a usar explore para analizar `penguins`library(palmerpenguins)library(explore)explore(penguins)