Cargar Datos en R

En R, puedes cargar datos desde archivos externos como .csv, .txt, .xls o .xlsx. Para cargar un archivo .csv, puedes usar la función read.csv() o read.csv2().

Vamos a cargar los datos de tres archivos que utilizaremos en este documento:

  1. diabetes.csv: Datos de una población de mujeres de la etnia Pima en Arizona.
# Cargar datos desde archivo .csv
diabetes <- read.csv("diabetes.csv")
head(diabetes)
##   Pregnancies Glucose BloodPressure SkinThickness Insulin  BMI
## 1           6     148            72            35       0 33.6
## 2           1      85            66            29       0 26.6
## 3           8     183            64             0       0 23.3
## 4           1      89            66            23      94 28.1
## 5           0     137            40            35     168 43.1
## 6           5     116            74             0       0 25.6
##   DiabetesPedigreeFunction Age Outcome
## 1                    0.627  50       1
## 2                    0.351  31       0
## 3                    0.672  32       1
## 4                    0.167  21       0
## 5                    2.288  33       1
## 6                    0.201  30       0
  1. calcio-ratas.csv: Datos de un estudio sobre el efecto de estrógenos sobre el calcio plasmático en ratas.
# Cargar datos desde archivo .csv
calcio_ratas <- read.csv("calcio-ratas.csv")
head(calcio_ratas)
##   caplasma hormona   sexo
## 1     16.3      no hembra
## 2     20.4      no hembra
## 3     12.4      no hembra
## 4     15.8      no hembra
## 5      9.5      no hembra
## 6     15.3      no  macho
  1. melocactus.xlsx: Datos de un estudio sobre una población de Melocactus intortus en Guánica, Puerto Rico.
# Cargar datos desde archivo .xlsx
library(readxl)
melocactus <- read_excel("melocactus.xlsx", sheet = "2019")
head(melocactus)
## # A tibble: 6 × 7
##   grupo planta_id azimuto distancia altura_planta long_inflo estado
##   <chr>     <dbl>   <dbl>     <dbl>         <dbl>      <dbl> <chr> 
## 1 N             1      35      6.22            51         17 E     
## 2 N             2      35      6.22            24         10 X     
## 3 N             3      35      6.22             3          0 E     
## 4 N             4      25      6.67            20         20 X     
## 5 N             5      25      4.53            36          9 S     
## 6 N             6      24      4.53             8          0 E

Manejo del archivo diabetes.csv

Utilizaremos el paquete tidyverse para limpiar, seleccionar, filtrar y transformar los datos del archivo diabetes.csv. Permite el uso de funciones como select(), filter(), mutate(), rename(), entre otras y la concatenación de operaciones con el operador %>%.

Cambio de nombres de columnas

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# Cambiar nombres de columnas
diabetes1 <- diabetes %>%
  rename(
    edad = Age,
    embarazos = Pregnancies,
    glucosa = Glucose,
    presion = BloodPressure,
    pliegues = SkinThickness,
    insulina = Insulin,
    imc = BMI,
    gen_diabetes = DiabetesPedigreeFunction,
    edad_diagnostico = Age,
    diabetes = Outcome
  )

head(diabetes1)
##   embarazos glucosa presion pliegues insulina  imc gen_diabetes
## 1         6     148      72       35        0 33.6        0.627
## 2         1      85      66       29        0 26.6        0.351
## 3         8     183      64        0        0 23.3        0.672
## 4         1      89      66       23       94 28.1        0.167
## 5         0     137      40       35      168 43.1        2.288
## 6         5     116      74        0        0 25.6        0.201
##   edad_diagnostico diabetes
## 1               50        1
## 2               31        0
## 3               32        1
## 4               21        0
## 5               33        1
## 6               30        0

Seleccionar columnas

Vamos a seleccionar las columnas que tengan información sobre glucosa, insulina, pedigree de diabetes y diagnóstico.

# Seleccionar columnas
diabetes2 <- diabetes1 %>%
  select(glucosa, insulina, gen_diabetes, diabetes)

head(diabetes2)
##   glucosa insulina gen_diabetes diabetes
## 1     148        0        0.627        1
## 2      85        0        0.351        0
## 3     183        0        0.672        1
## 4      89       94        0.167        0
## 5     137      168        2.288        1
## 6     116        0        0.201        0
Ejercicio: selecciona las variables físicas (edad, presión, imc) y el diagnóstico de diabetes.

Filtrar datos

Vamos a crear dos nuevos conjuntos de datos: uno de las diagnosticadas con diabetes y otro de las no diagnosticadas.

# Filtrar datos de acuerdo al diagnóstico de diabetes
diabetes_diagnosticadas <- diabetes1 %>%
  filter(diabetes == 1)

diabetes_no_diagnosticadas <- diabetes1 %>%
  filter(diabetes == 0)

# guardar en archivos .csv sin numero de fila
write.csv(diabetes_diagnosticadas, "diabetes_diagnosticadas.csv", row.names = FALSE)
write.csv(diabetes_no_diagnosticadas, "diabetes_no_diagnosticadas.csv", row.names = FALSE)
Ejercicio: filtra los datos de las mujeres con más de 30 años y guarda en un archivo .csv sin número de fila.

Crear nueva variable

Vamos a crear la variable índice glucosa/insulina.

# Crear nueva variable sin tomar en cuenta valores de insulina y glucosa iguales a 0
diabetes3 <- diabetes1 %>%
  filter(insulina != 0 & glucosa != 0) %>%
  mutate(indice_gi = glucosa / insulina)

head(diabetes3)
##   embarazos glucosa presion pliegues insulina  imc gen_diabetes
## 1         1      89      66       23       94 28.1        0.167
## 2         0     137      40       35      168 43.1        2.288
## 3         3      78      50       32       88 31.0        0.248
## 4         2     197      70       45      543 30.5        0.158
## 5         1     189      60       23      846 30.1        0.398
## 6         5     166      72       19      175 25.8        0.587
##   edad_diagnostico diabetes indice_gi
## 1               21        0 0.9468085
## 2               33        1 0.8154762
## 3               26        1 0.8863636
## 4               53        1 0.3627993
## 5               59        1 0.2234043
## 6               51        1 0.9485714

Ejercicio: crea una nueva variable con el índice imc/presión. Filtra los datos para que no tengan valores de presión o imc iguales a 0.

Estadísticas descriptivas de diabetes.csv

Estadísticas por grupos

Vamos a calcular las estadísticas descriptivas - media y desviación estándar - de las variables glucosa e insulina agrupadas por el diagnóstico de diabetes. En cada caso vamos a filtrar los datos que sean ceros.

# Estadísticas descriptivas de glucosa e insulina por diagnóstico de diabetes
estadisticas_diabetes <- diabetes1 %>%
  filter(glucosa != 0 & insulina != 0) %>%
  group_by(diabetes) %>%
  summarise(
    media_glucosa = mean(glucosa),
    desviacion_glucosa = sd(glucosa),
    media_insulina = mean(insulina),
    desviacion_insulina = round(sd(insulina),1)
  )
estadisticas_diabetes
## # A tibble: 2 × 5
##   diabetes media_glucosa desviacion_glucosa media_insulina desviacion_insulina
##      <int>         <dbl>              <dbl>          <dbl>               <dbl>
## 1        0          111.               24.6           131.                102.
## 2        1          145.               29.8           207.                133.

Vamos a crear una tabla gt con los resultados

# tabla con gt cambiando los nombres
library(gt)

estadisticas_diabetes %>%
  gt() %>%
  tab_header(
    title = "Tabla 1.  Estadísticas de Glucosa e Insulina por Diagnóstico de Diabetes. Datos de mujeres de la etnia Pima en Arizona"
  ) %>%
  cols_label(
    diabetes = "Diagnóstico",
    media_glucosa = "Media Glucosa",
    desviacion_glucosa = "D. E. Glucosa",
    media_insulina = "Media Insulina",
    desviacion_insulina = "D. E. Insulina"
  )
Tabla 1. Estadísticas de Glucosa e Insulina por Diagnóstico de Diabetes. Datos de mujeres de la etnia Pima en Arizona
Diagnóstico Media Glucosa D. E. Glucosa Media Insulina D. E. Insulina
0 111.4563 24.59840 130.6958 102.5
1 145.1923 29.83939 206.8462 132.7
Ejercicio: calcula las estadísticas descriptivas de las variables físicas (edad, presión, imc) por diagnóstico de diabetes. Filtra los datos para que no tengan valores de presión o imc iguales a 0.
Ejercicio: redondea los valores a una cifra decimal y vuelve a crear las tablas con gt.

Estadísticas descriptivas en calcio-ratas.csv

Vamos a crear una tabla agrupando por hormona y sexo y calculando la media y desviación estándar del calcio plasmático.

# Estadísticas descriptivas de calcio plasmático por hormona y sexo
estadisticas_calcio <- calcio_ratas %>%
  group_by(hormona, sexo) %>%
  summarise(
    media_calcio = mean(caplasma),
    desviacion_calcio = sd(caplasma)
) %>%
  ungroup()
## `summarise()` has grouped output by 'hormona'. You can override using the
## `.groups` argument.
estadisticas_calcio
## # A tibble: 4 × 4
##   hormona sexo   media_calcio desviacion_calcio
##   <chr>   <chr>         <dbl>             <dbl>
## 1 no      hembra         14.9              4.14
## 2 no      macho          12.1              4.25
## 3 si      hembra         32.5              4.67
## 4 si      macho          27.8              4.29

Crear una tabla gt con los resultados

# tabla con gt cambiando los nombres
estadisticas_calcio %>%
  gt() %>%
  tab_header(
    title = "Tabla 2.  Estadísticas de Calcio Plasmático por Hormona y Sexo. Datos de un estudio sobre el efecto de estrógenos sobre el calcio plasmático en ratas"
  ) %>%
  cols_label(
    sexo = "Sexo",
    hormona = "Hormona",
    media_calcio = "Media Calcio",
    desviacion_calcio = "D. E. Calcio"
  )
Tabla 2. Estadísticas de Calcio Plasmático por Hormona y Sexo. Datos de un estudio sobre el efecto de estrógenos sobre el calcio plasmático en ratas
Hormona Sexo Media Calcio D. E. Calcio
no hembra 14.88 4.136061
no macho 12.12 4.247588
si hembra 32.52 4.670867
si macho 27.78 4.287423
Ejercicio: calcula el error estándar de la media y vuelve a crear la tabla con gt. La fórmula para el error estándar de la media es sd(caplasma) / sqrt(n()).

Manejo de datos en melocactus.xlsx

Creación de nuevas variables

Vamos a crear las variables coordX y coordY a partir de la variables azimuto y distancia, utilizando las fórmulas:

  • coordX = distancia * sin(azimuto)
  • coordY = distancia * cos(azimuto)

El azimuto está en grados, por lo que debemos convertirlo a radianes mediante la fórmula:

  • radianes = grados * pi / 180

También vamos a sumar 100 a las coordenadas para que no sean negativas.

# Crear nuevas variables coordX y coordY
melocactus1 <- melocactus %>%
  mutate(
    radianes = azimuto * pi / 180,
    coordX = distancia * sin(radianes) + 100,
    coordY = distancia * cos(radianes) + 100
  )

head(melocactus1)
## # A tibble: 6 × 10
##   grupo planta_id azimuto distancia altura_planta long_inflo estado radianes
##   <chr>     <dbl>   <dbl>     <dbl>         <dbl>      <dbl> <chr>     <dbl>
## 1 N             1      35      6.22            51         17 E         0.611
## 2 N             2      35      6.22            24         10 X         0.611
## 3 N             3      35      6.22             3          0 E         0.611
## 4 N             4      25      6.67            20         20 X         0.436
## 5 N             5      25      4.53            36          9 S         0.436
## 6 N             6      24      4.53             8          0 E         0.419
## # ℹ 2 more variables: coordX <dbl>, coordY <dbl>

Filtrar datos

Vamos a filtrar los datos para que solo incluyan las plantas que tienen inflorescencia con longitud mayor que 0.

# Filtrar datos para inflorescencias con longitud mayor que 0
melocactus2 <- melocactus1 %>%
  filter(long_inflo > 0)

head(melocactus2)
## # A tibble: 6 × 10
##   grupo planta_id azimuto distancia altura_planta long_inflo estado radianes
##   <chr>     <dbl>   <dbl>     <dbl>         <dbl>      <dbl> <chr>     <dbl>
## 1 N             1      35      6.22            51         17 E         0.611
## 2 N             2      35      6.22            24         10 X         0.611
## 3 N             4      25      6.67            20         20 X         0.436
## 4 N             5      25      4.53            36          9 S         0.436
## 5 N             9     343      6.54            47         11 E         5.99 
## 6 N            12     344      1.34             6          1 X         6.00 
## # ℹ 2 more variables: coordX <dbl>, coordY <dbl>

Ejercicio: filtrar los datos para tener solo las plantas sanas (S).

Estadísticas descriptivas en melocactus.xlsx

Obtener las proporciones de plantas sanas (S), enfermas (E) y muertas (X) en la población.

# Estadísticas descriptivas de estado de las plantas
estadisticas_melocactus <- melocactus1 %>%
  group_by(estado) %>%
  summarise(
    prop = n() / nrow(melocactus1)
  ) %>%
  ungroup()
estadisticas_melocactus
## # A tibble: 3 × 2
##   estado  prop
##   <chr>  <dbl>
## 1 E      0.256
## 2 S      0.52 
## 3 X      0.224
# cambiar nombres de estado
estadisticas_melocactus <- estadisticas_melocactus %>%
  mutate(
    estado = case_when(
      estado == "E" ~ "Enfermas",
      estado == "S" ~ "Sanas",
      estado == "X" ~ "Muertas"
    )
  )

Crear una tabla gt con los resultados

# tabla con gt cambiando los nombres
estadisticas_melocactus %>%
  gt() %>%
  tab_header(
    title = "Tabla 3.  Proporción de Plantas Sanas, Enfermas y Muertas. Datos de un estudio sobre una población de *Melocactus intortus* en Guánica, Puerto Rico"
  ) %>%
  cols_label(
    estado = "Estado",
    prop = "Proporción"
  )
Tabla 3. Proporción de Plantas Sanas, Enfermas y Muertas. Datos de un estudio sobre una población de *Melocactus intortus* en Guánica, Puerto Rico
Estado Proporción
Enfermas 0.256
Sanas 0.520
Muertas 0.224
Ejercicio: usar table() para contar las plantas por estado.

Visualización de Datos de diabetes.csv

Histogramas

Vamos a crear un histograma para las variables glucosa e insulina. Usaremos el paquete ggplot2 para crear gráficos. El archivo que usaremos es diabetes3 que está filtrado para valores de cero.

Histograma de glucosa

# Histograma de glucosa
library(ggplot2)

hist_gluco <- ggplot(diabetes3, aes(x = glucosa)) +
  geom_histogram(fill = "skyblue", color = "black", bins = 20) +
  labs(
    x = "Glucosa",
    y = "Frecuencia"
  )
hist_gluco

Figura 1. Histograma de glucosa. Datos de mujeres de la etnia Pima en Arizona.

Histograma de insulina

# Histograma de insulina
hist_insulina <- ggplot(diabetes3, aes(x = insulina)) +
  geom_histogram(fill = "lightgreen", color = "black", bins = 20) +
  labs(
    x = "Insulina",
    y = "Frecuencia"
  )
hist_insulina

Figura 2. Histograma de insulina. Datos de mujeres de la etnia Pima en Arizona.

Ejercicio: crea un histograma de la variable índice glucosa/insulina.

Gráfico de dispersión

Vamos a crear un gráfico de dispersión para las variables glucosa e insulina.

# Gráfico de dispersión de glucosa e insulina
scatter_gluco_insulina <- ggplot(diabetes3, aes(x = glucosa, y = insulina)) +
  geom_point(color = "darkred") +
  labs(
    x = "Glucosa",
    y = "Insulina"
  )
scatter_gluco_insulina

Figura 3. Gráfico de Dispersión de Glucosa e Insulina. Datos de mujeres de la etnia Pima en Arizona.

Ejercicio: crea un gráfico de dispersión para las variables índice glucosa/insulina.

Visualización de Datos de calcio-ratas.csv

Gráfica de barras separadas

Vamos a crear una gráfica de barras separadas para el calcio plasmático por hormona y sexo. Incluiremos el error estándar de la media.

# Gráfica de barras separadas de calcio plasmático por hormona y sexo usando los datos de calcio-ratas.csv
bar_calcio <- ggplot(estadisticas_calcio, aes(x = hormona, y = media_calcio, fill = sexo)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_errorbar(aes(ymin = media_calcio - desviacion_calcio, ymax = media_calcio + desviacion_calcio), width = 0.2, position = position_dodge(0.9)) +
  labs(
    x = "Hormona",
    y = "Media Calcio"
  ) +
  scale_fill_manual(values = c("darkblue", "darkred"))

bar_calcio

Figura 4. Gráfica de Barras de Calcio Plasmático por Hormona y Sexo. Datos de un estudio sobre el efecto de estrógenos sobre el calcio plasmático en ratas.

Gráfica de cajas

Vamos a crear una gráfica de cajas para el calcio plasmático por hormona y sexo.

# Gráfica de cajas de calcio plasmático por hormona y sexo
box_calcio <- ggplot(calcio_ratas, aes(x = hormona, y = caplasma, fill = sexo)) +
  geom_boxplot() +
  labs(
    x = "Hormona",
    y = "Calcio Plasmático"
  ) +
  scale_fill_manual(values = c("lightblue", "orange"))

box_calcio

Figura 5. Gráfica de Cajas de Calcio Plasmático por Hormona y Sexo. Datos de un estudio sobre el efecto de estrógenos sobre el calcio plasmático en ratas.

Visualización de Datos de melocactus.xlsx

Mapa de ubicación de plantas

Vamos a crear un mapa de ubicación de las plantas de Melocactus intortus en Guánica, Puerto Rico.

melo = ggplot(melocactus1, aes(coordX, coordY, color = estado, size = altura_planta)) +
  geom_point()
melo

Figura 6. Mapa de Ubicación de Plantas de Melocactus intortus en Guánica, Puerto Rico. Incluye información sobre el estado de las plantas y la altura de las plantas.

Gráfico de dispersión

Vamos a crear un gráfico de dispersión para la altura de las plantas y la longitud de la inflorescencia.

scatter_altura_inflo <- ggplot(melocactus2, aes(x = altura_planta, y = long_inflo, color = estado)) +
  geom_point() +
  labs(
    title = "Gráfico de Dispersión de Altura de Plantas y Longitud de Inflorescencia",
    x = "Altura de Planta",
    y = "Longitud de Inflorescencia"
  ) +
  scale_color_manual(values = c("darkgreen", "darkblue", "darkred"))

scatter_altura_inflo

Figura 8. Gráfico de Dispersión de Altura de Plantas y Longitud de Inflorescencia. Datos de un estudio sobre una población de Melocactus intortus en Guánica, Puerto Rico.

Gráfica de barras de altura promedio por estado

Vamos a crear una gráfica de barras para la altura promedio de las plantas por estado y su error estándar.

# Gráfica de barras de altura promedio por estado
bar_altura <- ggplot(melocactus2, aes(x = estado, y = altura_planta, fill = estado)) +
  geom_bar(stat = "summary", fun = "mean", position = "dodge") +
  geom_errorbar(stat = "summary", fun.data = "mean_se", position = position_dodge(0.9)) +
  labs(
    x = "Estado",
    y = "Altura Promedio"
  ) +
  scale_fill_manual(values = c("darkgreen", "darkblue", "darkred"))

bar_altura

Figura 9. Gráfica de Barras de Altura Promedio por Estado. Datos de un estudio sobre una población de Melocactus intortus en Guánica, Puerto Rico.

Ejercicio: crea una gráfica de barras de la longitud promedio de la inflorescencia por estado y su error estándar.