Paquetes

Los paquetes en R son conjuntos de funciones desarrollados por usuarios de la comunidad que aumentan el poder de R base mejorando funciones existentes o creando nuevas.

Los paquetes se instalan una única vez utilizando la función install.packages() con el nombre del paquete dentro de los paréntesis y entre comillas.

Si no lo hiciste todavía, instalá el paquete tidyverse. Recordá que R es sensible a las mayúsculas y minúsculas.

install.packages("tidyverse")

Importante! Si bien los paquetes se instalan una única vez, para que estén disponibles para usarse en un script determinado necesitamos cargarlos. Para eso usamos la función library(). El nombre del paquete va sin comillas esta vez.

library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.0.4
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.2     v purrr   0.3.4
## v tibble  3.0.4     v dplyr   1.0.2
## v tidyr   1.1.2     v stringr 1.4.0
## v readr   1.4.0     v forcats 0.5.0
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()

Fijate que si el paquete está instalado, está la opción de autocompletar su nombre con tab.

Ahora bien, tidyverse no es exactamente un paquete sino un compendio de ellos, que comparten una gramática y estructura de datos. Cuando cargamos tidyverse utilizando la función library() en la consola se muestran los paquetes que incluidos en este conjunto: ggplot2, dplyr, tidyr y readr son los que más vamos a usar en estas clases.


Ejercicio 1: Usá la función library() para cargar los paquetes readxl y haven.


Importar bases de datos

Vamos a usar una función del paquete readxl para importar la base de datos PsicPositiva. Esta base está armada en una hoja de cálculo de excel con extensión .xlsx.

Las funciones para importar bases de datos dependen de la extensión del archivo que queremos importar.

read_csv() nos permite importar bases con extensión .csv (comma separated values).

read_sav() (del paquete haven) nos permite importar bases con extensión .sav (aquellas creadas con el programa SPSS).

read_xls sirve para importar hojas de cálculo de excel cuando el archivo tiene extensión .xls.

La función que vamos a utilizar ahora es read_xlsx().

El primer argumento de esta función es la localización del archivo y su nombre. Recordemos que nuestro proyecto cuenta con una carpeta para guardar nuestras bases llamada datos. Escribimos entre comillas primero el nombre de la carpeta, luego una barra, y finalmente el nombre del archivo incluyendo la extensión.

La base que vamos a importar incluye datos de un experimento donde se evaluó el efecto de 4 técnicas psicológicas distintas sobre la presencia de síntomas depresivos en un grupo de 295 pacientes.

Cada paciente fue asignado aleatoriamente a una de las cuatro técnicas y respondió a dos escalas, una que evalúa nivel de felicidad y otra que evalúa síntomas depresivos, antes y después de la intervención.

read_xlsx("datos/PsicPositiva.xlsx")
## # A tibble: 442 x 9
##       id  sexo edad  educacion ingresos evaluacion intervencion felicidad_AHI
##    <dbl> <dbl> <chr>     <dbl> <chr>         <dbl>        <dbl>         <dbl>
##  1     1     2 35            5 Altos             0            4            63
##  2     1     2 35            5 Altos             1            4            73
##  3     2     1 59            1 Bajos             0            1            73
##  4     2     1 59            1 Bajos             1            1            89
##  5     3     1 51            4 Altos             0            4            77
##  6     4     1 50            5 Medios            0            3            60
##  7     4     1 50            5 Medios            1            3            67
##  8     5     2 58            5 Medios            0            2            41
##  9     5     2 58            5 Medios            1            2            41
## 10     6     1 31            5 Bajos             0            1            62
## # ... with 432 more rows, and 1 more variable: depresion_CESD <dbl>

Si corremos esta línea de código podemos ver que en la consola se imprime una tabla con filas y columnas, donde cada columna es una variable: primero el número de identificación del sujeto, su sexo y edad, nivel educativo y nivel de ingresos, momento de la evaluación (0 equivale a la evaluación inicial), el nivel de felicidad y la presencia de síntomas depresivos.

Al igual que con los vectores, si queremos poder realizar operaciones sobre estos datos tenemos que asignárselos a un objeto. Para ello elegimos un nombre y utilizamos el operador de asignación.

intervenciones <- read_xlsx("datos/PsicPositiva.xlsx")

intervenciones
## # A tibble: 442 x 9
##       id  sexo edad  educacion ingresos evaluacion intervencion felicidad_AHI
##    <dbl> <dbl> <chr>     <dbl> <chr>         <dbl>        <dbl>         <dbl>
##  1     1     2 35            5 Altos             0            4            63
##  2     1     2 35            5 Altos             1            4            73
##  3     2     1 59            1 Bajos             0            1            73
##  4     2     1 59            1 Bajos             1            1            89
##  5     3     1 51            4 Altos             0            4            77
##  6     4     1 50            5 Medios            0            3            60
##  7     4     1 50            5 Medios            1            3            67
##  8     5     2 58            5 Medios            0            2            41
##  9     5     2 58            5 Medios            1            2            41
## 10     6     1 31            5 Bajos             0            1            62
## # ... with 432 more rows, and 1 more variable: depresion_CESD <dbl>

Revisá el tipo de cada columna. La columna edad es de tipo character (texto) cuando debería ser de tipo double o numérica. Esto se debe a que alguno de los valores de la columna es texto.

##   [1] "35"    "35"    "59"    "59"    "51"    "50"    "50"    "58"    "58"   
##  [10] "31"    "44"    "57"    "57"    "36"    "45"    "56"    "56"    "46"   
##  [19] "46"    "34"    "34"    "41"    "41"    "27"    "31"    "44"    "Falta"
##  [28] "Falta" "37"    "37"    "21"    "42"    "29"    "Falta" "22"    "51"   
##  [37] "51"    "46"    "35"    "34"    "34"    "62"    "62"    "45"    "50"   
##  [46] "58"    "58"    "45"    "40"    "40"    "43"    "29"    "45"    "45"   
##  [55] "47"    "47"    "50"    "50"    "49"    "53"    "53"    "50"    "50"   
##  [64] "46"    "46"    "24"    "24"    "36"    "36"    "36"    "36"    "35"   
##  [73] "32"    "32"    "42"    "42"    "36"    "39"    "39"    "83"    "52"   
##  [82] "52"    "40"    "40"    "39"    "27"    "56"    "56"    "45"    "45"   
##  [91] "60"    "50"    "61"    "43"    "43"    "27"    "27"    "45"    "39"   
## [100] "39"    "50"    "50"    "51"    "51"    "65"    "65"    "28"    "24"   
## [109] "45"    "45"    "37"    "37"    "50"    "54"    "54"    "41"    "48"   
## [118] "37"    "37"    "28"    "28"    "54"    "54"    "33"    "33"    "47"   
## [127] "39"    "71"    "71"    "54"    "54"    "38"    "58"    "53"    "59"   
## [136] "33"    "35"    "43"    "60"    "60"    "68"    "24"    "56"    "56"   
## [145] "58"    "52"    "65"    "65"    "25"    "32"    "32"    "60"    "60"   
## [154] "61"    "42"    "51"    "57"    "28"    "44"    "59"    "59"    "35"   
## [163] "30"    "63"    "63"    "52"    "42"    "42"    "71"    "71"    "52"   
## [172] "55"    "51"    "61"    "61"    "38"    "38"    "51"    "26"    "26"   
## [181] "23"    "56"    "62"    "62"    "56"    "56"    "40"    "40"    "42"   
## [190] "42"    "46"    "46"    "60"    "21"    "21"    "48"    "48"    "33"   
## [199] "33"    "26"    "52"    "52"    "59"    "52"    "52"    "47"    "47"   
## [208] "23"    "51"    "51"    "31"    "67"    "67"    "42"    "48"    "48"   
## [217] "57"    "57"    "56"    "56"    "36"    "36"    "36"    "34"    "59"   
## [226] "44"    "50"    "31"    "48"    "48"    "27"    "71"    "71"    "26"   
## [235] "41"    "34"    "34"    "44"    "44"    "40"    "43"    "37"    "40"   
## [244] "30"    "30"    "30"    "56"    "56"    "34"    "34"    "42"    "42"   
## [253] "52"    "52"    "50"    "64"    "49"    "48"    "61"    "46"    "46"   
## [262] "Falta" "53"    "53"    "31"    "31"    "44"    "44"    "57"    "45"   
## [271] "55"    "55"    "50"    "50"    "60"    "60"    "41"    "46"    "46"   
## [280] "52"    "52"    "59"    "59"    "47"    "47"    "57"    "57"    "53"   
## [289] "53"    "63"    "63"    "25"    "41"    "41"    "37"    "37"    "44"   
## [298] "29"    "52"    "28"    "28"    "58"    "51"    "51"    "45"    "54"   
## [307] "54"    "32"    "32"    "41"    "41"    "33"    "33"    "50"    "50"   
## [316] "33"    "32"    "28"    "50"    "50"    "43"    "37"    "35"    "35"   
## [325] "75"    "75"    "30"    "46"    "46"    "29"    "46"    "46"    "49"   
## [334] "51"    "51"    "58"    "58"    "24"    "58"    "36"    "42"    "42"   
## [343] "46"    "46"    "54"    "48"    "48"    "21"    "21"    "45"    "43"   
## [352] "47"    "33"    "18"    "18"    "27"    "33"    "33"    "30"    "30"   
## [361] "49"    "49"    "49"    "49"    "40"    "40"    "30"    "30"    "26"   
## [370] "26"    "77"    "77"    "29"    "29"    "52"    "23"    "29"    "29"   
## [379] "30"    "30"    "60"    "31"    "31"    "27"    "64"    "27"    "27"   
## [388] "34"    "53"    "53"    "62"    "62"    "36"    "36"    "54"    "54"   
## [397] "63"    "55"    "24"    "32"    "27"    "52"    "52"    "36"    "19"   
## [406] "36"    "23"    "30"    "30"    "47"    "55"    "55"    "55"    "28"   
## [415] "34"    "37"    "37"    "36"    "56"    "56"    "58"    "37"    "67"   
## [424] "67"    "43"    "43"    "39"    "39"    "19"    "45"    "41"    "43"   
## [433] "43"    "26"    "49"    "30"    "39"    "47"    "47"    "52"    "59"   
## [442] "28"

Parece que quienes armaron la base, utilizaron la palabra “Falta” para indicar cuando no cuentan con la información necesaria, la edad del participante. ¿Cómo podemos solucionar esto?. A la función read_xlsx() también podemos indicarle como se indicaron o codificaron los datos faltantes (na).

intervenciones <- read_xlsx("datos/PsicPositiva.xlsx", na = "Falta")

¿Qué es un data frame?

La estructura de datos que utiliza R para representar datos en formato de tabla (con filas y columnas) es el data frame. Se puede crear a mano combinando vectores, o se pueden crear al importar una hoja de cálculo cómo la que levantamos antes.

En los data frames las columnas son vectores que tienen igual longitud, por lo tanto cada columna debe contener un solo tipo de dato (caracteres, numéricos, etc).

Podemos inspeccionar que tipo de datos tiene nuestro data frame con la función glimpse() del paquete dplyr.

glimpse(intervenciones)
## Rows: 442
## Columns: 9
## $ id             <dbl> 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, 10, 11, 11...
## $ sexo           <dbl> 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1...
## $ edad           <dbl> 35, 35, 59, 59, 51, 50, 50, 58, 58, 31, 44, 57, 57, ...
## $ educacion      <dbl> 5, 5, 1, 1, 4, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 5, 5, 4...
## $ ingresos       <chr> "Altos", "Altos", "Bajos", "Bajos", "Altos", "Medios...
## $ evaluacion     <dbl> 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0...
## $ intervencion   <dbl> 4, 4, 1, 1, 4, 3, 3, 2, 2, 1, 3, 2, 2, 1, 2, 2, 2, 2...
## $ felicidad_AHI  <dbl> 63, 73, 73, 89, 77, 60, 67, 41, 41, 62, 67, 59, 45, ...
## $ depresion_CESD <dbl> 14, 6, 7, 10, 3, 31, 31, 27, 32, 25, 2, 30, 45, 25, ...

Esta función nos muestra que el df cuenta con 442 filas y 9 columnas. Debajo podemos ver el nombre de cada una de las columnas, seguido del tipo de dato (dbl = double, chr = character) y luego los primeros valores de cada uno.

La variable id es de tipo double (numérica) y las primeros cuatro valores son 1, 1, 2, 2.

Otras funciones para conocer los datos:

dim(intervenciones)
## [1] 442   9
str(intervenciones)
## tibble [442 x 9] (S3: tbl_df/tbl/data.frame)
##  $ id            : num [1:442] 1 1 2 2 3 4 4 5 5 6 ...
##  $ sexo          : num [1:442] 2 2 1 1 1 1 1 2 2 1 ...
##  $ edad          : num [1:442] 35 35 59 59 51 50 50 58 58 31 ...
##  $ educacion     : num [1:442] 5 5 1 1 4 5 5 5 5 5 ...
##  $ ingresos      : chr [1:442] "Altos" "Altos" "Bajos" "Bajos" ...
##  $ evaluacion    : num [1:442] 0 1 0 1 0 0 1 0 1 0 ...
##  $ intervencion  : num [1:442] 4 4 1 1 4 3 3 2 2 1 ...
##  $ felicidad_AHI : num [1:442] 63 73 73 89 77 60 67 41 41 62 ...
##  $ depresion_CESD: num [1:442] 14 6 7 10 3 31 31 27 32 25 ...
head(intervenciones)
## # A tibble: 6 x 9
##      id  sexo  edad educacion ingresos evaluacion intervencion felicidad_AHI
##   <dbl> <dbl> <dbl>     <dbl> <chr>         <dbl>        <dbl>         <dbl>
## 1     1     2    35         5 Altos             0            4            63
## 2     1     2    35         5 Altos             1            4            73
## 3     2     1    59         1 Bajos             0            1            73
## 4     2     1    59         1 Bajos             1            1            89
## 5     3     1    51         4 Altos             0            4            77
## 6     4     1    50         5 Medios            0            3            60
## # ... with 1 more variable: depresion_CESD <dbl>
tail(intervenciones)
## # A tibble: 6 x 9
##      id  sexo  edad educacion ingresos evaluacion intervencion felicidad_AHI
##   <dbl> <dbl> <dbl>     <dbl> <chr>         <dbl>        <dbl>         <dbl>
## 1   291     1    39         5 Altos             0            2            80
## 2   292     1    47         4 Medios            0            4            50
## 3   292     1    47         4 Medios            1            4            70
## 4   293     2    52         4 Altos             0            2            47
## 5   294     1    59         5 Medios            0            3            70
## 6   295     1    28         4 Medios            0            1            65
## # ... with 1 more variable: depresion_CESD <dbl>
names(intervenciones)
## [1] "id"             "sexo"           "edad"           "educacion"     
## [5] "ingresos"       "evaluacion"     "intervencion"   "felicidad_AHI" 
## [9] "depresion_CESD"
summary(intervenciones)
##        id             sexo            edad         educacion    
##  Min.   :  1.0   Min.   :1.000   Min.   :18.00   Min.   :1.000  
##  1st Qu.: 72.0   1st Qu.:1.000   1st Qu.:35.00   1st Qu.:4.000  
##  Median :146.5   Median :1.000   Median :45.00   Median :4.000  
##  Mean   :146.5   Mean   :1.145   Mean   :44.58   Mean   :3.984  
##  3rd Qu.:219.0   3rd Qu.:1.000   3rd Qu.:53.00   3rd Qu.:5.000  
##  Max.   :295.0   Max.   :2.000   Max.   :83.00   Max.   :5.000  
##                                  NA's   :4                      
##    ingresos           evaluacion      intervencion   felicidad_AHI   
##  Length:442         Min.   :0.0000   Min.   :1.000   Min.   : 35.00  
##  Class :character   1st Qu.:0.0000   1st Qu.:2.000   1st Qu.: 61.00  
##  Mode  :character   Median :0.0000   Median :2.000   Median : 71.00  
##                     Mean   :0.3326   Mean   :2.525   Mean   : 70.62  
##                     3rd Qu.:1.0000   3rd Qu.:4.000   3rd Qu.: 80.00  
##                     Max.   :1.0000   Max.   :4.000   Max.   :106.00  
##                                                      NA's   :1       
##  depresion_CESD  
##  Min.   :  0.00  
##  1st Qu.:  6.00  
##  Median : 11.50  
##  Mean   : 16.63  
##  3rd Qu.: 21.00  
##  Max.   :999.00  
## 

Con summary podemos ver los valores mínimos y máximos de las columnas numéricas, el promedio (mean), la mediana (median), el primer y tercer cuartíl (1st Qu y 3rd Qu). Nos muestra las variables que no son numéricas, como es el caso de ingresos, y también cuantos datos faltantes tiene cada columna. En el caso de felicidad_AHI tiene un dato faltante, indicado por el NA’s: 1.

Segmentar o subsetear data frames

Como vimos en la clase anterior, el vector tiene una única dimensión, su largo (cantidad total de elementos).

x <- c(2, 5, 1, 9, 0)
length(x)
## [1] 5

Cada elemento dentro del vector tiene una posición determinada por un único número.

x[4]
## [1] 9

Podemos extraer o mostrar el valor ubicado en la posición 4 del vector x ejecutando el código x[4].

Los data frames, en cambio, poseen dos dimensiones.

dim(intervenciones)
## [1] 442   9

intervenciones es una tabla de 442 filas por 9 columnas, y cada elemento dentro de esa tabla tiene una posición determinada por su número de fila y su número de columna.

Por ejemplo, podemos extraer o mostrar el valor ubicado en la fila 5, columna 7.

intervenciones[5, 7]
## # A tibble: 1 x 1
##   intervencion
##          <dbl>
## 1            4

Cuando queremos extraer o mostrar una columna, podemos hacerlo indicando unicamente la columna o las columnas que nos interesa ver.

intervenciones[7]
## # A tibble: 442 x 1
##    intervencion
##           <dbl>
##  1            4
##  2            4
##  3            1
##  4            1
##  5            4
##  6            3
##  7            3
##  8            2
##  9            2
## 10            1
## # ... with 432 more rows

Pero si queremos extraer filas necesitamos incluir ambos valores (primero la fila y luego la columna), separados por una coma.


Ejercicio 2: Extraé el elemento ubicado en la fila 8, columna 3, del df intervenciones.


Cuando queremos extraer todos los valores ubicados en una fila determinada, escribimos el número de fila y dejamos vacío el espacio de las columnas. Por ejemplo, para obtener todos los valores ubicados en la fila 3 escribimos:

intervenciones[3, ]
## # A tibble: 1 x 9
##      id  sexo  edad educacion ingresos evaluacion intervencion felicidad_AHI
##   <dbl> <dbl> <dbl>     <dbl> <chr>         <dbl>        <dbl>         <dbl>
## 1     2     1    59         1 Bajos             0            1            73
## # ... with 1 more variable: depresion_CESD <dbl>

Cuando queremos extraer más de un elemento de un vector podemos utilizar:

x[1:3]
## [1] 2 5 1
x[c(2, 4)]
## [1] 5 9

Podemos hacer lo mismo con el data frame pero debemos recordar que necesitamos indicar que filas y que columnas queremos extraer.

Para extraer los valores ubicados en las filas 20 y 30 de la columna 2 escribimos:

intervenciones[c(20, 30), 2]
## # A tibble: 2 x 1
##    sexo
##   <dbl>
## 1     1
## 2     1

Ejercicio 3: Escribí el código necesario para:

a. extrer los valores ubicados en la columna 2 entre las filas 20 y 30.

b. extrer los valores ubicados entre las filas 20 y 30 para todas las columnas.

c. extrer los valores ubicados en la fila 5 para las columnas 8 y 9.


Seleccionar una columna específica

Recien vimos que podemos seleccionar una columna utilizando su posición en el df:

intervenciones[4]
## # A tibble: 442 x 1
##    educacion
##        <dbl>
##  1         5
##  2         5
##  3         1
##  4         1
##  5         4
##  6         5
##  7         5
##  8         5
##  9         5
## 10         5
## # ... with 432 more rows

Pero cuando identificamos la columna por nombre y no por posición podemos utilizar otras alternativas. Probá las siguientes para ver que se imprime por consola con cada una:

intervenciones$educacion
##   [1] 5 5 1 1 4 5 5 5 5 5 5 4 4 4 4 5 5 4 4 5 5 1 1 2 1 4 5 5 3 3 4 4 4 4 4 4 4
##  [38] 4 5 4 4 4 4 1 1 4 4 5 5 5 5 4 4 4 5 5 4 4 4 4 4 2 2 4 4 4 4 4 4 4 4 3 3 3
##  [75] 3 3 2 5 5 2 5 5 3 3 1 3 3 3 4 4 5 5 4 4 4 5 5 3 3 3 4 4 5 5 4 4 3 4 4 3 5
## [112] 5 5 4 4 2 3 5 5 4 4 3 3 4 4 4 5 2 2 3 3 5 4 5 3 5 4 4 5 5 1 4 4 4 5 5 3 3
## [149] 5 4 4 5 5 5 1 5 1 4 4 5 5 4 5 5 5 4 4 4 4 4 5 5 4 4 4 5 5 5 3 3 5 4 2 2 4
## [186] 4 5 5 3 3 5 5 5 1 1 5 5 5 5 5 4 4 5 5 5 5 5 2 4 4 3 5 5 5 2 2 5 5 4 4 3 2
## [223] 2 4 4 3 4 4 5 5 4 4 4 3 5 5 5 4 4 5 5 3 5 4 4 3 5 5 5 5 2 2 5 5 4 4 5 5 3
## [260] 3 3 4 4 4 5 5 4 4 3 4 5 5 5 5 5 5 4 1 1 5 5 4 4 5 5 5 5 5 5 5 5 5 1 1 4 4
## [297] 5 5 5 4 4 5 5 5 1 5 5 5 5 4 4 4 4 5 5 3 3 4 4 4 2 5 4 4 3 3 4 2 2 4 5 5 4
## [334] 5 5 5 5 5 4 5 4 4 5 5 5 3 3 2 2 3 5 4 5 2 2 4 3 3 5 5 5 5 2 2 5 5 5 5 4 4
## [371] 3 3 2 2 5 4 4 4 4 4 5 5 5 5 5 5 5 3 3 3 5 5 4 4 4 4 2 4 4 5 4 1 1 3 2 5 4
## [408] 5 5 5 4 5 5 5 5 5 5 2 3 3 3 5 4 4 2 2 4 4 4 5 4 4 4 5 4 5 5 4 4 4 5 4
intervenciones["educacion"]
## # A tibble: 442 x 1
##    educacion
##        <dbl>
##  1         5
##  2         5
##  3         1
##  4         1
##  5         4
##  6         5
##  7         5
##  8         5
##  9         5
## 10         5
## # ... with 432 more rows
intervenciones[["educacion"]]
##   [1] 5 5 1 1 4 5 5 5 5 5 5 4 4 4 4 5 5 4 4 5 5 1 1 2 1 4 5 5 3 3 4 4 4 4 4 4 4
##  [38] 4 5 4 4 4 4 1 1 4 4 5 5 5 5 4 4 4 5 5 4 4 4 4 4 2 2 4 4 4 4 4 4 4 4 3 3 3
##  [75] 3 3 2 5 5 2 5 5 3 3 1 3 3 3 4 4 5 5 4 4 4 5 5 3 3 3 4 4 5 5 4 4 3 4 4 3 5
## [112] 5 5 4 4 2 3 5 5 4 4 3 3 4 4 4 5 2 2 3 3 5 4 5 3 5 4 4 5 5 1 4 4 4 5 5 3 3
## [149] 5 4 4 5 5 5 1 5 1 4 4 5 5 4 5 5 5 4 4 4 4 4 5 5 4 4 4 5 5 5 3 3 5 4 2 2 4
## [186] 4 5 5 3 3 5 5 5 1 1 5 5 5 5 5 4 4 5 5 5 5 5 2 4 4 3 5 5 5 2 2 5 5 4 4 3 2
## [223] 2 4 4 3 4 4 5 5 4 4 4 3 5 5 5 4 4 5 5 3 5 4 4 3 5 5 5 5 2 2 5 5 4 4 5 5 3
## [260] 3 3 4 4 4 5 5 4 4 3 4 5 5 5 5 5 5 4 1 1 5 5 4 4 5 5 5 5 5 5 5 5 5 1 1 4 4
## [297] 5 5 5 4 4 5 5 5 1 5 5 5 5 4 4 4 4 5 5 3 3 4 4 4 2 5 4 4 3 3 4 2 2 4 5 5 4
## [334] 5 5 5 5 5 4 5 4 4 5 5 5 3 3 2 2 3 5 4 5 2 2 4 3 3 5 5 5 5 2 2 5 5 5 5 4 4
## [371] 3 3 2 2 5 4 4 4 4 4 5 5 5 5 5 5 5 3 3 3 5 5 4 4 4 4 2 4 4 5 4 1 1 3 2 5 4
## [408] 5 5 5 4 5 5 5 5 5 5 2 3 3 3 5 4 4 2 2 4 4 4 5 4 4 4 5 4 5 5 4 4 4 5 4

En el caso de intervenciones[“educacion”] lo que se imprime por consola son los valores en forma de columna de un data frame. Con intervenciones[[“educacion”]] (doble corchete) e intervenciones$educacion imprimimos esos mismos valores como un vector. A veces esto es más útil para poder ver con más detalle los valores que forman esa columna, sobre todo para ubicar si hay algún valor extraño.

Extraer los nombres de las columnas

Para ver los nombres de las columnas podemos utilizar la función names().

names(intervenciones)
## [1] "id"             "sexo"           "edad"           "educacion"     
## [5] "ingresos"       "evaluacion"     "intervencion"   "felicidad_AHI" 
## [9] "depresion_CESD"

Lo que se imprime por consola es un vector que tiene todos los nombres de cada una de las columnas ordenados según su ubicación en el data frame.

Si queremos ver el nombre de una columna en una posición específica podemos usar los mismos métodos que para segmentar un vector:

names(intervenciones)[6]
## [1] "evaluacion"

De igual forma, puedo modificar ese valor asignándole otro:

names(intervenciones)[6] <- "tiempo_evaluacion"

Ejercicio 4:

a. Escribí el código necesario para importar la base PsicPositiva.csv. Recordá que la función que necesitamos utilizar es read_csv(). Llamá al nuevo data frame intervenciones_2.

b. Inspeccioná el data frame para saber cuántas observaciones y cuantas columnas tiene.

c. ¿Por qué la variable edad es de tipo character (texto)?. ***

intervenciones_2 <- read_csv("datos/PsicPositiva.csv")
## 
## -- Column specification --------------------------------------------------------
## cols(
##   id = col_double(),
##   sexo = col_double(),
##   edad = col_character(),
##   educacion = col_double(),
##   ingresos = col_character(),
##   intervencion = col_double(),
##   depresion_CESD_0 = col_double(),
##   depresion_CESD_1 = col_double(),
##   felicidad_AHI_0 = col_double(),
##   felicidad_AHI_1 = col_double()
## )
glimpse(intervenciones_2)
## Rows: 299
## Columns: 10
## $ id               <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,...
## $ sexo             <dbl> 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1,...
## $ edad             <chr> "35", "59", "51", "50", "58", "Falta", "44", "57",...
## $ educacion        <dbl> 5, 1, 4, 5, 5, 5, 5, 4, 4, 4, 5, 4, 5, 1, 2, 1, 4,...
## $ ingresos         <chr> "Altos", "Bajos", "no informa", "Medios", "Medios"...
## $ intervencion     <dbl> 4, 1, 4, 3, 2, 1, 3, 2, 1, 2, 2, 2, 4, 4, 4, 4, 3,...
## $ depresion_CESD_0 <dbl> 14, 7, 3, 31, 27, 25, 2, 30, 25, 21, 19, 17, 22, 3...
## $ depresion_CESD_1 <dbl> 6, 10, NA, 31, 32, NA, NA, 45, NA, NA, 19, 31, 16,...
## $ felicidad_AHI_0  <dbl> 63, 73, 77, 60, 41, 62, 67, 59, 48, 58, 62, 45, 51...
## $ felicidad_AHI_1  <dbl> 73, 89, NA, 67, 41, NA, NA, 45, NA, NA, 59, 49, 64...
intervenciones_2[["edad"]]
##   [1] "35"            "59"            "51"            "50"           
##   [5] "58"            "Falta"         "44"            "57"           
##   [9] "36"            "45"            "56"            "46"           
##  [13] "34"            "41"            "27"            "31"           
##  [17] "44"            NA              "37"            "21"           
##  [21] "42"            "29"            NA              "22"           
##  [25] "51"            "46"            "35"            "34"           
##  [29] "62"            "falta"         "50"            "58"           
##  [33] "45"            "40"            "43"            "29"           
##  [37] "45"            "47"            "50"            "49"           
##  [41] "53"            "50"            "46"            "24"           
##  [45] "36"            "36"            "35"            "32"           
##  [49] "42"            "36"            "39"            "83"           
##  [53] "52"            "40"            "39"            "27"           
##  [57] "56"            "45"            "60"            "50"           
##  [61] "61"            "43"            "27"            "45"           
##  [65] "39"            "50"            "51"            "65"           
##  [69] "28"            "24"            "45"            "45"           
##  [73] "37"            "50"            "54"            "41"           
##  [77] "48"            "37"            "28"            "54"           
##  [81] "33"            "47"            "39"            "71"           
##  [85] "54"            "38"            "58"            "53"           
##  [89] "59"            "33"            "35"            "43"           
##  [93] "60"            "68"            "24"            "56"           
##  [97] "58"            "52"            "65"            "No lo informa"
## [101] "32"            "60"            "61"            "42"           
## [105] "51"            "57"            "28"            "44"           
## [109] "59"            "35"            "30"            "63"           
## [113] "52"            "42"            "71"            "52"           
## [117] "55"            "51"            "61"            "38"           
## [121] "51"            "26"            "23"            "56"           
## [125] "62"            "56"            "56"            "40"           
## [129] "42"            "46"            "60"            "21"           
## [133] "48"            "33"            "26"            "52"           
## [137] "52"            "59"            "52"            "47"           
## [141] "23"            "51"            "31"            "67"           
## [145] "42"            "48"            "57"            "56"           
## [149] "36"            "36"            "36"            "34"           
## [153] "59"            "44"            "50"            "31"           
## [157] "48"            "27"            "71"            "26"           
## [161] "41"            "34"            "44"            "40"           
## [165] "43"            "37"            "40"            "30"           
## [169] "30"            "56"            "34"            "42"           
## [173] "52"            "50"            "64"            "49"           
## [177] "48"            "61"            "46"            NA             
## [181] "53"            "31"            "44"            "57"           
## [185] "45"            "55"            "50"            "60"           
## [189] "41"            "46"            "52"            "59"           
## [193] "47"            "57"            "53"            "63"           
## [197] "25"            "41"            "37"            "44"           
## [201] "29"            "52"            "28"            "58"           
## [205] "51"            "45"            "54"            "32"           
## [209] "41"            "33"            "50"            "33"           
## [213] "32"            "28"            "50"            "43"           
## [217] "37"            "35"            "75"            "30"           
## [221] "46"            "29"            "46"            "49"           
## [225] "51"            "58"            "24"            "58"           
## [229] "36"            "42"            "46"            "54"           
## [233] "48"            "21"            "45"            "43"           
## [237] "47"            "33"            "18"            "27"           
## [241] "33"            "30"            "49"            "49"           
## [245] "40"            "30"            "26"            "77"           
## [249] "29"            "52"            "23"            "29"           
## [253] "30"            "60"            "31"            "27"           
## [257] "64"            "27"            "34"            "53"           
## [261] "62"            "36"            "54"            "63"           
## [265] "55"            "24"            "32"            "27"           
## [269] "52"            "36"            "19"            "36"           
## [273] "23"            "30"            "47"            "55"           
## [277] "55"            "28"            "34"            "37"           
## [281] "36"            "56"            "58"            "37"           
## [285] "67"            "43"            "39"            "19"           
## [289] "45"            "41"            "43"            "26"           
## [293] "49"            "30"            "39"            "47"           
## [297] "52"            "59"            "28"

Hay varios valores en la variable que no son numéricos (Falta, falta, No lo informa, NA).

Podemos indicarle a read_csv que esos valores son valores faltantes de la siguiente forma:

intervenciones_2 <- read_csv("datos/PsicPositiva.csv", na = c("Falta", "falta", "No lo informa", "NA"))
## 
## -- Column specification --------------------------------------------------------
## cols(
##   id = col_double(),
##   sexo = col_double(),
##   edad = col_double(),
##   educacion = col_double(),
##   ingresos = col_character(),
##   intervencion = col_double(),
##   depresion_CESD_0 = col_double(),
##   depresion_CESD_1 = col_double(),
##   felicidad_AHI_0 = col_double(),
##   felicidad_AHI_1 = col_double()
## )
glimpse(intervenciones_2)
## Rows: 299
## Columns: 10
## $ id               <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,...
## $ sexo             <dbl> 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1,...
## $ edad             <dbl> 35, 59, 51, 50, 58, NA, 44, 57, 36, 45, 56, 46, 34...
## $ educacion        <dbl> 5, 1, 4, 5, 5, 5, 5, 4, 4, 4, 5, 4, 5, 1, 2, 1, 4,...
## $ ingresos         <chr> "Altos", "Bajos", "no informa", "Medios", "Medios"...
## $ intervencion     <dbl> 4, 1, 4, 3, 2, 1, 3, 2, 1, 2, 2, 2, 4, 4, 4, 4, 3,...
## $ depresion_CESD_0 <dbl> 14, 7, 3, 31, 27, 25, 2, 30, 25, 21, 19, 17, 22, 3...
## $ depresion_CESD_1 <dbl> 6, 10, NA, 31, 32, NA, NA, 45, NA, NA, 19, 31, 16,...
## $ felicidad_AHI_0  <dbl> 63, 73, 77, 60, 41, 62, 67, 59, 48, 58, 62, 45, 51...
## $ felicidad_AHI_1  <dbl> 73, 89, NA, 67, 41, NA, NA, 45, NA, NA, 59, 49, 64...

Si miramos el tipo de dato de la columna edad esta vez es double o numérico.