Manipulación y Análisis de Datos en RStudio

Trabajo final

Author

Kennedy Huerta & Andersson Vargas

TRABAJO FINAL DE LENGUAJE DE PROGRAMACIÓN ESTADÍSTICA

Integrantes:

  • Vargas Magallanes, Andersson

  • Huerta Tiburcio, Kennedy Brayan

Dataframe

I. Manipulación de dataframe

a) Funciones y librerias principales en R

Funciones principales a usar:

head( ) , tail( ) , summary( ) , read.csv( ), na.omit( ) , table( ) , bartplot( ) , pie( ) , hist( ) , boxplot( ) , ggplot( )

Librerías ha usar:

# install.packages("ggplot2")
library(ggplot2)
Warning: package 'ggplot2' was built under R version 4.3.2
# install.packages("dplyr")
library(dplyr)

Attaching package: 'dplyr'
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
# install.packages("DataExplorer")
library(DataExplorer)
Warning: package 'DataExplorer' was built under R version 4.3.2
# install.packages("githubinstall")
# devtools::install_github("ricardo-bion/ggradar", dependencies = TRUE)
library(ggradar)
# install.packages("readr")
library(readr)
Warning: package 'readr' was built under R version 4.3.2
# install.packages("readxl")
library(readxl)
Warning: package 'readxl' was built under R version 4.3.2

b) Dataframe, Manipulación e Introducción al análisis de datos.

En RStudio, un dataframe es una estructura de datos tabular que se utiliza para organizar y almacenar conjuntos de datos.

Es una de las estructuras de datos más comunes y útiles en R para trabajar con datos de manera eficiente.

Un dataframe puede verse como una matriz, donde cada columna puede tener un tipo de datos diferente (por ejemplo, números, caracteres, factores, etc.).

Esto lo hace adecuado para representar conjuntos de datos heterogéneos, como los comunes en análisis de datos y estadísticas.

Ejemplo de creacion de dataframe básico

df <- data.frame(id = 11:15, 
                 genero = c("F", "F", "M", "M", "F"), 
                 masa = c(17, 18, 18, 21, 20))
df
  id genero masa
1 11      F   17
2 12      F   18
3 13      M   18
4 14      M   21
5 15      F   20

Para hacer uso de las diversas funciones que tiene y que se le pueden aplicar a un dataframe, usaremos de ejemplo la data iris que nos proporciona el mismo R.

Un poco sobre el dataframe iris
La base de datos Iris es un conjunto de datos ampliamente conocido y utilizado en el campo de la estadística y el aprendizaje automático. Introducida por el biólogo y estadístico británico Ronald A. Fisher en 1936, esta base de datos proporciona mediciones detalladas de cuatro características botánicas de flores pertenecientes a tres especies diferentes de iris: setosa, versicolor y virginica. Las características medidas incluyen la longitud y el ancho del sépalo, así como la longitud y el ancho del pétalo, todas expresadas en milímetros.

Mostrar datos

Si queremos ver la cabezera de los datos, usaremos la función head() , por defecto esta función mostrará los 6 primeros datos del archivo.

head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
# Para especificar la cantidad de datos a mostrar
# head(iris, n= x), x=cantidad a elección para mostrar 

En caso, queramos ver los ultimos datos del archivo, usaremos la función tail()

tail(iris)
    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
145          6.7         3.3          5.7         2.5 virginica
146          6.7         3.0          5.2         2.3 virginica
147          6.3         2.5          5.0         1.9 virginica
148          6.5         3.0          5.2         2.0 virginica
149          6.2         3.4          5.4         2.3 virginica
150          5.9         3.0          5.1         1.8 virginica

Conocer la dimensión de nuestro dato

# 150 = N° Filas, 5 = N° Columnas
dim(iris)
[1] 150   5

Conocer los nombres de las columnas de un dataframe

colnames(iris)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     
names(iris)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     

Podemos cambiar el nombre de las columnas, para fines prácticos o específicos

colnames(iris) <- c("Longitud del sepalo", "Ancho del sepalo", "Longitud del petalo", "Ancho del petalo", "Especie")
# Otra forma
# names(iris) <- c("Longitud del sepalo", "Ancho del sepalo", "Longitud del petalo", "Ancho del petalo", "Especie")

Verificamos el cambio de nombre de las columnas

colnames(iris)
[1] "Longitud del sepalo" "Ancho del sepalo"    "Longitud del petalo"
[4] "Ancho del petalo"    "Especie"            

Conocer la estructura de un dataframe

str(iris) 
'data.frame':   150 obs. of  5 variables:
 $ Longitud del sepalo: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Ancho del sepalo   : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Longitud del petalo: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Ancho del petalo   : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Especie            : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

Acceder a las columnas del dataframe

# Una columna, en específico
iris$"Ancho del sepalo"
  [1] 3.5 3.0 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 3.7 3.4 3.0 3.0 4.0 4.4 3.9 3.5
 [19] 3.8 3.8 3.4 3.7 3.6 3.3 3.4 3.0 3.4 3.5 3.4 3.2 3.1 3.4 4.1 4.2 3.1 3.2
 [37] 3.5 3.6 3.0 3.4 3.5 2.3 3.2 3.5 3.8 3.0 3.8 3.2 3.7 3.3 3.2 3.2 3.1 2.3
 [55] 2.8 2.8 3.3 2.4 2.9 2.7 2.0 3.0 2.2 2.9 2.9 3.1 3.0 2.7 2.2 2.5 3.2 2.8
 [73] 2.5 2.8 2.9 3.0 2.8 3.0 2.9 2.6 2.4 2.4 2.7 2.7 3.0 3.4 3.1 2.3 3.0 2.5
 [91] 2.6 3.0 2.6 2.3 2.7 3.0 2.9 2.9 2.5 2.8 3.3 2.7 3.0 2.9 3.0 3.0 2.5 2.9
[109] 2.5 3.6 3.2 2.7 3.0 2.5 2.8 3.2 3.0 3.8 2.6 2.2 3.2 2.8 2.8 2.7 3.3 3.2
[127] 2.8 3.0 2.8 3.0 2.8 3.8 2.8 2.8 2.6 3.0 3.4 3.1 3.0 3.1 3.1 3.1 2.7 3.2
[145] 3.3 3.0 2.5 3.0 3.4 3.0
# Varias columnas
head(iris[c("Ancho del sepalo","Longitud del sepalo")])
  Ancho del sepalo Longitud del sepalo
1              3.5                 5.1
2              3.0                 4.9
3              3.2                 4.7
4              3.1                 4.6
5              3.6                 5.0
6              3.9                 5.4

Accerder a las filas del dataframe

# Una fila
iris[1,]
  Longitud del sepalo Ancho del sepalo Longitud del petalo Ancho del petalo
1                 5.1              3.5                 1.4              0.2
  Especie
1  setosa
# Varias filas
iris[75:80,]
   Longitud del sepalo Ancho del sepalo Longitud del petalo Ancho del petalo
75                 6.4              2.9                 4.3              1.3
76                 6.6              3.0                 4.4              1.4
77                 6.8              2.8                 4.8              1.4
78                 6.7              3.0                 5.0              1.7
79                 6.0              2.9                 4.5              1.5
80                 5.7              2.6                 3.5              1.0
      Especie
75 versicolor
76 versicolor
77 versicolor
78 versicolor
79 versicolor
80 versicolor

Accerder a los elementos del dataframe

# Un elemento
iris[10,"Especie"]
[1] setosa
Levels: setosa versicolor virginica
# Varios elementos
iris[30:37, c("Longitud del petalo", "Ancho del petalo")]
   Longitud del petalo Ancho del petalo
30                 1.6              0.2
31                 1.6              0.2
32                 1.5              0.4
33                 1.5              0.1
34                 1.4              0.2
35                 1.5              0.2
36                 1.2              0.2
37                 1.3              0.2

Añadir una columna al dataframe

iris$id <- c(1:150)
head(iris)
  Longitud del sepalo Ancho del sepalo Longitud del petalo Ancho del petalo
1                 5.1              3.5                 1.4              0.2
2                 4.9              3.0                 1.4              0.2
3                 4.7              3.2                 1.3              0.2
4                 4.6              3.1                 1.5              0.2
5                 5.0              3.6                 1.4              0.2
6                 5.4              3.9                 1.7              0.4
  Especie id
1  setosa  1
2  setosa  2
3  setosa  3
4  setosa  4
5  setosa  5
6  setosa  6

Eliminar una columna del dataframe

iris$id <- NULL
# Eliminando la columna que agregamos
head(iris)
  Longitud del sepalo Ancho del sepalo Longitud del petalo Ancho del petalo
1                 5.1              3.5                 1.4              0.2
2                 4.9              3.0                 1.4              0.2
3                 4.7              3.2                 1.3              0.2
4                 4.6              3.1                 1.5              0.2
5                 5.0              3.6                 1.4              0.2
6                 5.4              3.9                 1.7              0.4
  Especie
1  setosa
2  setosa
3  setosa
4  setosa
5  setosa
6  setosa

Añadir filas al dataframe

nuevafila <- c(3.5, 2.5, 2.2, 1.5, "setosa")
iris1 <- rbind(iris, nuevafila)
# La nueva fila se coloca al final
tail(iris1)
    Longitud del sepalo Ancho del sepalo Longitud del petalo Ancho del petalo
146                 6.7                3                 5.2              2.3
147                 6.3              2.5                   5              1.9
148                 6.5                3                 5.2                2
149                 6.2              3.4                 5.4              2.3
150                 5.9                3                 5.1              1.8
151                 3.5              2.5                 2.2              1.5
      Especie
146 virginica
147 virginica
148 virginica
149 virginica
150 virginica
151    setosa

Eliminar filas del dataframe

# Eliminando la fila que agregamos
tail(iris1[-151,])
    Longitud del sepalo Ancho del sepalo Longitud del petalo Ancho del petalo
145                 6.7              3.3                 5.7              2.5
146                 6.7                3                 5.2              2.3
147                 6.3              2.5                   5              1.9
148                 6.5                3                 5.2                2
149                 6.2              3.4                 5.4              2.3
150                 5.9                3                 5.1              1.8
      Especie
145 virginica
146 virginica
147 virginica
148 virginica
149 virginica
150 virginica

Ver el resumen de todo el dataframe

summary(iris)
 Longitud del sepalo Ancho del sepalo Longitud del petalo Ancho del petalo
 Min.   :4.300       Min.   :2.000    Min.   :1.000       Min.   :0.100   
 1st Qu.:5.100       1st Qu.:2.800    1st Qu.:1.600       1st Qu.:0.300   
 Median :5.800       Median :3.000    Median :4.350       Median :1.300   
 Mean   :5.843       Mean   :3.057    Mean   :3.758       Mean   :1.199   
 3rd Qu.:6.400       3rd Qu.:3.300    3rd Qu.:5.100       3rd Qu.:1.800   
 Max.   :7.900       Max.   :4.400    Max.   :6.900       Max.   :2.500   
       Especie  
 setosa    :50  
 versicolor:50  
 virginica :50  
                
                
                

En caso que nuestro dato a trabajar tenga las clases incorrectas o se hayan cambiado, podemos arreglarlo de la siguiente manera

iris$`Longitud del sepalo` <- as.numeric(iris$`Longitud del sepalo`)
iris$`Ancho del sepalo` <- as.numeric(iris$`Ancho del sepalo`)
iris$`Longitud del petalo` <- as.numeric(iris$`Longitud del petalo`)
iris$`Ancho del petalo` <- as.numeric(iris$`Ancho del petalo`)

Verificamos cambios

summary(iris)
 Longitud del sepalo Ancho del sepalo Longitud del petalo Ancho del petalo
 Min.   :4.300       Min.   :2.000    Min.   :1.000       Min.   :0.100   
 1st Qu.:5.100       1st Qu.:2.800    1st Qu.:1.600       1st Qu.:0.300   
 Median :5.800       Median :3.000    Median :4.350       Median :1.300   
 Mean   :5.843       Mean   :3.057    Mean   :3.758       Mean   :1.199   
 3rd Qu.:6.400       3rd Qu.:3.300    3rd Qu.:5.100       3rd Qu.:1.800   
 Max.   :7.900       Max.   :4.400    Max.   :6.900       Max.   :2.500   
       Especie  
 setosa    :50  
 versicolor:50  
 virginica :50  
                
                
                

c) Flujo del proceso de análisis de datos.

d) Importación de datos.

Existen diversas maneras de importar datos en R, dependiendo del formato en el que estén almacenados. Algunas de las funciones más comunes para importar datos son las siguientes:

  1. CSV:

    CSV son las siglas de “Comma-Separated Values” (Valores Separados por Comas). Es un formato de archivo de texto simple utilizado para almacenar datos tabulares. En un archivo CSV, cada línea representa una fila de datos, y los valores de cada fila están separados por comas (u otro delimitador, como punto y coma).

    Importar

    Para importar datos desde un archivo CSV, puedes usar la función read.csv o read.csv2 si el archivo utiliza coma como separador decimal.

    data_csv <- read.csv("ruta/del/archivo.csv")

    En caso que la data este separado en puntos, podemos usar lo siguiente:

    data_csv2 <- read.csv2("ruta/del/archivo.csv")

    Para otros tipos de separador, hacer la conversión a comas.

  2. Excel:

    Si los datos están en un archivo de Excel, utilizar la biblioteca readxl o openxlsx.

    data_excel <- read_xlsx("ruta/del/archivo.xlsx")

  3. Otros formatos:

    Para la importacion de datos con otros formatos, como archivos de texto plano, JSON, HDF5, entre otros, hay funciones específicas según la extensión y el formato del archivo.

    # Para archivos de texto plano
    # data_tp <- read.table("ruta/del/archivo.txt", header = TRUE)
    
    # Para archivos JSON
    # install.packages("jsonlite")
    # library(jsonlite)
    # data_JSON <- fromJSON("ruta/del/archivo.json")
    
    # Para archivos HDF5
    # install.packages("hdf5")
    # library(hdf5)
    # data_HDF5 <- h5read("ruta/del/archivo.h5", "/dataset")

Si nuestro dato se encuentra en un página web, como Github, podemos hacer lo siguiente:

Cuando tengamos definido la data a utilizar, para el caso de archivo.csv, dar click en raw y obtener el url.

Posteriormente, verificar si tenemos instalado la libreria readr

# install.packages("readr")
# library(readr)

Para la importación, hacer lo siguiente:

url <- "https://raw.githubusercontent.com/jmcastagnetto/covid-19-peru-data/main/datos/covid-19-peru-test-results.csv"

dataGithub_csv <- read_csv(url)
Rows: 608 Columns: 4
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr  (2): resultado, tipo_prueba
dbl  (1): personas
date (1): fecha

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

II. Manejo de datos

a) Identificación y manejo de datos missing

Concepto: Los datos faltantes (missing data) se refieren a la ausencia de valores en una variable o columna. Pueden surgir por diversas razones, como errores en la recolección de datos, pérdida de información o simplemente porque ciertos datos no están disponibles.

Manejo: - Identificación: Verificar la presencia de datos faltantes en el conjunto de datos. - Estrategias de manejo: Eliminar filas o columnas con datos faltantes, imputar valores (por ejemplo, reemplazarlos con la media o la mediana), o utilizar técnicas más avanzadas dependiendo del contexto.

Ejemplo

# Verificar si hay datos faltantes en el dataframe
missing_values <- any(is.na(df))
print(paste("¿Hay datos faltantes en el dataframe? ", missing_values))
[1] "¿Hay datos faltantes en el dataframe?  FALSE"

En esta parte, se está verificando si hay algún valor faltante (missing) en el dataframe df. La función is.na() se utiliza para detectar valores faltantes, y any() devuelve TRUE si al menos uno de esos valores es TRUE. El resultado se almacena en la variable missing_values y luego se imprime un mensaje indicando si hay o no datos faltantes.

# Contar la cantidad de datos faltantes por columna
missing_count <- colSums(is.na(df))
print("Cantidad de datos faltantes por columna:")
[1] "Cantidad de datos faltantes por columna:"
print(missing_count)
    id genero   masa 
     0      0      0 

Aquí, se cuenta la cantidad de datos faltantes por columna utilizando la función colSums(). Esta función suma los valores en cada columna, y como los valores faltantes son codificados como NA, la suma de NA da como resultado la cantidad de datos faltantes en cada columna. Luego, se imprime esta información.

# Eliminar filas con datos faltantes
df_sin_missing <- na.omit(df)
print("Dataframe sin datos faltantes:")
[1] "Dataframe sin datos faltantes:"
print(df_sin_missing)
  id genero masa
1 11      F   17
2 12      F   18
3 13      M   18
4 14      M   21
5 15      F   20

En esta sección, se eliminan las filas que contienen datos faltantes utilizando la función na.omit(). El nuevo dataframe sin datos faltantes se almacena en la variable df_sin_missing y se imprime.

# Imputar valores faltantes (por ejemplo, usando la media)
df_imputado <- df
df_imputado$masa[is.na(df_imputado$masa)] <- mean(df_imputado$masa, na.rm = TRUE)
print("Dataframe con valores imputados:")
[1] "Dataframe con valores imputados:"
print(df_imputado)
  id genero masa
1 11      F   17
2 12      F   18
3 13      M   18
4 14      M   21
5 15      F   20

Aquí, se imputan los valores faltantes en la columna “masa” utilizando la media de esa columna. Primero, se crea una copia del dataframe original llamada df_imputado. Luego, se utiliza la función mean() para calcular la media de la columna “masa” (ignorando los valores faltantes con na.rm = TRUE) y se asigna esa media a los valores faltantes en esa columna. Finalmente, se imprime el dataframe resultante.

EJEMPLO En este ejemplo vamos a cargar datos y trabajar con ellos con los diferentes requerimientos del primer punto.

# Carga el paquete
library(readr)

# Especifica la URL del archivo CSV
url_2 <- "https://raw.githubusercontent.com/raulvalerio/statistics-test-and-exploration/master/fast_food.csv"

# Lee el archivo CSV y almacena los datos en un data frame llamado 'datos'
datos <- read_csv(url_2)
New names:
Rows: 515 Columns: 18
── Column specification
──────────────────────────────────────────────────────── Delimiter: "," chr
(3): restaurant, item, salad dbl (15): ...1, calories, cal_fat, total_fat,
sat_fat, trans_fat, cholestero...
ℹ Use `spec()` to retrieve the full column specification for this data. ℹ
Specify the column types or set `show_col_types = FALSE` to quiet this message.
• `` -> `...1`
# Muestra las primeras filas del data frame
head(datos)
# A tibble: 6 × 18
   ...1 restaurant item             calories cal_fat total_fat sat_fat trans_fat
  <dbl> <chr>      <chr>               <dbl>   <dbl>     <dbl>   <dbl>     <dbl>
1     1 Mcdonalds  Artisan Grilled…      380      60         7       2       0  
2     2 Mcdonalds  Single Bacon Sm…      840     410        45      17       1.5
3     3 Mcdonalds  Double Bacon Sm…     1130     600        67      27       3  
4     4 Mcdonalds  Grilled Bacon S…      750     280        31      10       0.5
5     5 Mcdonalds  Crispy Bacon Sm…      920     410        45      12       0.5
6     6 Mcdonalds  Big Mac               540     250        28      10       1  
# ℹ 10 more variables: cholesterol <dbl>, sodium <dbl>, total_carb <dbl>,
#   fiber <dbl>, sugar <dbl>, protein <dbl>, vit_a <dbl>, vit_c <dbl>,
#   calcium <dbl>, salad <chr>

Primero, vamos a verificar si hay datos faltantes en tu dataframe data y luego aplicaremos estrategias para manejarlos.

# Identificación de datos faltantes
any_missing <- any(is.na(datos))
print(paste("¿Hay datos faltantes en el dataframe? ", any_missing))
[1] "¿Hay datos faltantes en el dataframe?  TRUE"
# Cantidad de datos faltantes por columna
missing_count <- sapply(datos, function(x) sum(is.na(x)))
print("Cantidad de datos faltantes por columna:")
[1] "Cantidad de datos faltantes por columna:"
print(missing_count)
       ...1  restaurant        item    calories     cal_fat   total_fat 
          0           0           0           0           0           0 
    sat_fat   trans_fat cholesterol      sodium  total_carb       fiber 
          0           0           0           0           0          12 
      sugar     protein       vit_a       vit_c     calcium       salad 
          0           1         214         210         210           0 

Este código verifica si hay datos faltantes en tu dataframe datos. Si la respuesta es sí, obtenemos la cantidad de datos faltantes por columna. Ahora, veamos algunas estrategias de manejo.


Supongamos que decidimos eliminar las filas que tienen datos faltantes en lugar de imputar valores.

# Eliminar filas con datos faltantes
datos_no_missing <- na.omit(datos)
print("Dataframe sin datos faltantes:")
[1] "Dataframe sin datos faltantes:"
print(datos_no_missing)
# A tibble: 301 × 18
    ...1 restaurant item            calories cal_fat total_fat sat_fat trans_fat
   <dbl> <chr>      <chr>              <dbl>   <dbl>     <dbl>   <dbl>     <dbl>
 1     1 Mcdonalds  Artisan Grille…      380      60         7       2       0  
 2     2 Mcdonalds  Single Bacon S…      840     410        45      17       1.5
 3     3 Mcdonalds  Double Bacon S…     1130     600        67      27       3  
 4     4 Mcdonalds  Grilled Bacon …      750     280        31      10       0.5
 5     5 Mcdonalds  Crispy Bacon S…      920     410        45      12       0.5
 6     6 Mcdonalds  Big Mac              540     250        28      10       1  
 7     7 Mcdonalds  Cheeseburger         300     100        12       5       0.5
 8     8 Mcdonalds  Classic Chicke…      510     210        24       4       0  
 9     9 Mcdonalds  Double Cheeseb…      430     190        21      11       1  
10    10 Mcdonalds  Double Quarter…      770     400        45      21       2.5
# ℹ 291 more rows
# ℹ 10 more variables: cholesterol <dbl>, sodium <dbl>, total_carb <dbl>,
#   fiber <dbl>, sugar <dbl>, protein <dbl>, vit_a <dbl>, vit_c <dbl>,
#   calcium <dbl>, salad <chr>

Este código utiliza la función na.omit() para eliminar las filas que contienen al menos un valor faltante. data_sin_missing es el nuevo dataframe resultante.

Ahora, consideremos la imputación de valores usando la media de cada columna para los datos faltantes.

# Imputar valores faltantes con la media
data_imputado <- datos
for (col in colnames(data_imputado)) {
  if (any(is.na(data_imputado[[col]]))) {
    data_imputado[[col]][is.na(data_imputado[[col]])] <- mean(data_imputado[[col]], na.rm = TRUE)
  }
}
print("Dataframe con valores imputados:")
[1] "Dataframe con valores imputados:"
print(data_imputado)
# A tibble: 515 × 18
    ...1 restaurant item            calories cal_fat total_fat sat_fat trans_fat
   <dbl> <chr>      <chr>              <dbl>   <dbl>     <dbl>   <dbl>     <dbl>
 1     1 Mcdonalds  Artisan Grille…      380      60         7       2       0  
 2     2 Mcdonalds  Single Bacon S…      840     410        45      17       1.5
 3     3 Mcdonalds  Double Bacon S…     1130     600        67      27       3  
 4     4 Mcdonalds  Grilled Bacon …      750     280        31      10       0.5
 5     5 Mcdonalds  Crispy Bacon S…      920     410        45      12       0.5
 6     6 Mcdonalds  Big Mac              540     250        28      10       1  
 7     7 Mcdonalds  Cheeseburger         300     100        12       5       0.5
 8     8 Mcdonalds  Classic Chicke…      510     210        24       4       0  
 9     9 Mcdonalds  Double Cheeseb…      430     190        21      11       1  
10    10 Mcdonalds  Double Quarter…      770     400        45      21       2.5
# ℹ 505 more rows
# ℹ 10 more variables: cholesterol <dbl>, sodium <dbl>, total_carb <dbl>,
#   fiber <dbl>, sugar <dbl>, protein <dbl>, vit_a <dbl>, vit_c <dbl>,
#   calcium <dbl>, salad <chr>

Este código itera sobre todas las columnas de tu dataframe y, si encuentra datos faltantes, los imputa con la media de la respectiva columna.

b) Identificación y manejo de datos outlier e inconsistentes

Concepto: Los outliers son observaciones que se desvían significativamente de la tendencia general de los datos. Pueden indicar errores en la recolección de datos o patrones interesantes en los datos. Inconsistencias se refieren a datos que no cumplen con las expectativas o reglas definidas para el conjunto de datos.

Manejo: - Identificación: Utilizar métodos estadísticos como el rango intercuartílico (IQR) para detectar valores atípicos. - Estrategias de manejo: Eliminar outliers si se consideran errores, transformar los datos, o ajustar los valores atípicos según el contexto del análisis.

Ejemplo

# Identificar outliers en la columna "masa" usando el método de IQR
masa_iqr <- df$masa
q1 <- quantile(masa_iqr, 0.25)
q3 <- quantile(masa_iqr, 0.75)
iqr <- q3 - q1
lower_bound <- q1 - 1.5 * iqr
upper_bound <- q3 + 1.5 * iqr
outliers <- masa_iqr[masa_iqr < lower_bound | masa_iqr > upper_bound]
print("Valores considerados como outliers:")
[1] "Valores considerados como outliers:"
print(outliers)
numeric(0)

En esta sección, se identifican outliers en la columna “masa” utilizando el método del rango intercuartílico (IQR). Se calculan los cuartiles (q1 y q3), el IQR, y se definen límites inferior y superior. Los valores fuera de estos límites se consideran outliers y se almacenan en la variable outliers, que luego se imprime.

# Eliminar outliers en la columna "masa"
df_sin_outliers <- df[!(df$masa %in% outliers), ]
print("Dataframe sin outliers:")
[1] "Dataframe sin outliers:"
print(df_sin_outliers)
  id genero masa
1 11      F   17
2 12      F   18
3 13      M   18
4 14      M   21
5 15      F   20

Aquí, se eliminan las filas que contienen outliers en la columna “masa”. Se crea un nuevo dataframe llamado df_sin_outliers que excluye las filas con valores en la columna “masa” que están en la lista de outliers. Luego, se imprime el nuevo dataframe.

Ejemplo

Para nuestro data frame (datos)

Primero, vamos a identificar los posibles outliers de una columna del dataframe datos utilizando el método del rango intercuartílico (IQR).

# Identificación de outliers con el método del IQR
total_carb_iqr <- datos_no_missing$total_carb # Columna de ejemplo
q1 <- quantile(total_carb_iqr, 0.25)
q3 <- quantile(total_carb_iqr, 0.75)
iqr <- q3 - q1
lower_bound <- q1 - 1.5 * iqr
upper_bound <- q3 + 1.5 * iqr
outliers <- total_carb_iqr[total_carb_iqr < lower_bound | total_carb_iqr > upper_bound]
print("Valores considerados como outliers:")
[1] "Valores considerados como outliers:"
print(outliers)
[1] 156 109 118 126 121 118 118 112

Este código identificará las filas que contienen valores atípicos en al menos una columna utilizando el método del IQR. Si queremos identificas los outliers de las demás columnas, repetir el procedimiento con la columnas respectiva.

Ahora, si consideremos eliminar los outliers de la columna, debemos hacer lo siguiente

# Eliminar filas con outliers
Datos_sin_outliers <- datos_no_missing[!(datos_no_missing$total_carb %in% outliers), ]
print("Dataframe sin filas que contienen outliers:")
[1] "Dataframe sin filas que contienen outliers:"
print(Datos_sin_outliers)
# A tibble: 293 × 18
    ...1 restaurant item            calories cal_fat total_fat sat_fat trans_fat
   <dbl> <chr>      <chr>              <dbl>   <dbl>     <dbl>   <dbl>     <dbl>
 1     1 Mcdonalds  Artisan Grille…      380      60         7       2       0  
 2     2 Mcdonalds  Single Bacon S…      840     410        45      17       1.5
 3     3 Mcdonalds  Double Bacon S…     1130     600        67      27       3  
 4     4 Mcdonalds  Grilled Bacon …      750     280        31      10       0.5
 5     5 Mcdonalds  Crispy Bacon S…      920     410        45      12       0.5
 6     6 Mcdonalds  Big Mac              540     250        28      10       1  
 7     7 Mcdonalds  Cheeseburger         300     100        12       5       0.5
 8     8 Mcdonalds  Classic Chicke…      510     210        24       4       0  
 9     9 Mcdonalds  Double Cheeseb…      430     190        21      11       1  
10    10 Mcdonalds  Double Quarter…      770     400        45      21       2.5
# ℹ 283 more rows
# ℹ 10 more variables: cholesterol <dbl>, sodium <dbl>, total_carb <dbl>,
#   fiber <dbl>, sugar <dbl>, protein <dbl>, vit_a <dbl>, vit_c <dbl>,
#   calcium <dbl>, salad <chr>

Este código crea un nuevo dataframe llamado Datos_sin_outliers que excluye las filas que contienen valores atípicos en al menos una columna.


Estas son solo estrategias iniciales y la elección de cómo manejar los outliers dependerá de tu conocimiento del dominio y del contexto específico de tus datos. Puedes ajustar estas estrategias según tus necesidades y objetivos analíticos.

c) Limpieza y preparación de datos

Concepto: La limpieza y preparación de datos es el proceso de acondicionar el conjunto de datos para su análisis. Involucra la identificación y corrección de errores, la transformación de datos en el formato adecuado, la gestión de datos faltantes, la creación de nuevas variables derivadas, y otras acciones que permitan trabajar con los datos de manera efectiva.

Manejo: - Identificación de errores y problemas en los datos. - Transformación de datos según las necesidades del análisis. - Manejo de datos faltantes, outliers, y valores inconsistentes. - Creación de nuevas variables o características que puedan ser relevantes para el análisis.

En resumen, estos conceptos son fundamentales en el proceso de análisis de datos para garantizar la calidad y confiabilidad de los resultados obtenidos.

Ejemplo

  1. Renombrar columnas: Aquí, estamos cambiando los nombres de las columnas del dataframe df para que en lugar de “id”, “genero”, y “masa”, tengan los nombres “ID”, “Género”, y “Masa”, respectivamente. Esto se hace mediante la asignación de un nuevo vector de nombres a colnames(df).
# Renombrar columnas
colnames(df) <- c("ID", "Género", "Masa")
  1. Convertir la columna “Género” a factor: La columna “Género” originalmente podría ser de tipo caracter o factor. Aquí, aseguramos que sea tratada como un factor utilizando la función as.factor().
# Convertir la columna "Género" a factor
df$Género <- as.factor(df$Género)
  1. Agregar una columna de Altura: Se agrega una nueva columna llamada “Altura” al dataframe df con valores de altura de ejemplo (160, 165, 170, 175, 180). Esta columna es necesaria para calcular el Índice de Masa Corporal (IMC) más adelante.
# Agregamos una columna de Altura para poder calcular el IMC
df$Altura <- c(160, 165, 170, 175, 180)
  1. Crear una nueva columna calculada (IMC): Se calcula el IMC utilizando la fórmula estándar: IMC = Masa / (Altura^2), donde la altura se expresa en metros. Dado que nuestros datos de altura están en centímetros, dividimos por 100 para convertirlos a metros. El resultado se almacena en la nueva columna “IMC”.
# Crear una nueva columna calculada a partir de otras columnas
df$IMC <- df$Masa / ((df$Altura/100)^2)
  1. Seleccionar filas con IMC mayor que 25: Creamos un nuevo dataframe llamado df_sobrepeso que contiene solo las filas donde el IMC es mayor que 25. Este paso es solo un ejemplo y puedes ajustar el umbral según tus necesidades. Finalmente, se imprime este nuevo dataframe, mostrando las personas con IMC mayor que 25.
# Seleccionar solo las filas donde el IMC es mayor que 25
df_sobrepeso <- df[df$IMC > 25, ]
print("Personas con sobrepeso:")
[1] "Personas con sobrepeso:"
print(df_sobrepeso)
[1] ID     Género Masa   Altura IMC   
<0 rows> (or 0-length row.names)

Ejemplo Para nuestro date frame (datos)

Identificación de errores y problemas en los datos

# Identificación de errores y problemas en los datos
summary(datos)
      ...1        restaurant            item              calories     
 Min.   :  1.0   Length:515         Length:515         Min.   :  20.0  
 1st Qu.:129.5   Class :character   Class :character   1st Qu.: 330.0  
 Median :258.0   Mode  :character   Mode  :character   Median : 490.0  
 Mean   :258.0                                         Mean   : 530.9  
 3rd Qu.:386.5                                         3rd Qu.: 690.0  
 Max.   :515.0                                         Max.   :2430.0  
                                                                       
    cal_fat         total_fat         sat_fat         trans_fat    
 Min.   :   0.0   Min.   :  0.00   Min.   : 0.000   Min.   :0.000  
 1st Qu.: 120.0   1st Qu.: 14.00   1st Qu.: 4.000   1st Qu.:0.000  
 Median : 210.0   Median : 23.00   Median : 7.000   Median :0.000  
 Mean   : 238.8   Mean   : 26.59   Mean   : 8.153   Mean   :0.465  
 3rd Qu.: 310.0   3rd Qu.: 35.00   3rd Qu.:11.000   3rd Qu.:1.000  
 Max.   :1270.0   Max.   :141.00   Max.   :47.000   Max.   :8.000  
                                                                   
  cholesterol         sodium       total_carb         fiber       
 Min.   :  0.00   Min.   :  15   Min.   :  0.00   Min.   : 0.000  
 1st Qu.: 35.00   1st Qu.: 800   1st Qu.: 28.50   1st Qu.: 2.000  
 Median : 60.00   Median :1110   Median : 44.00   Median : 3.000  
 Mean   : 72.46   Mean   :1247   Mean   : 45.66   Mean   : 4.137  
 3rd Qu.: 95.00   3rd Qu.:1550   3rd Qu.: 57.00   3rd Qu.: 5.000  
 Max.   :805.00   Max.   :6080   Max.   :156.00   Max.   :17.000  
                                                  NA's   :12      
     sugar           protein           vit_a            vit_c       
 Min.   : 0.000   Min.   :  1.00   Min.   :  0.00   Min.   :  0.00  
 1st Qu.: 3.000   1st Qu.: 16.00   1st Qu.:  4.00   1st Qu.:  4.00  
 Median : 6.000   Median : 24.50   Median : 10.00   Median : 10.00  
 Mean   : 7.262   Mean   : 27.89   Mean   : 18.86   Mean   : 20.17  
 3rd Qu.: 9.000   3rd Qu.: 36.00   3rd Qu.: 20.00   3rd Qu.: 30.00  
 Max.   :87.000   Max.   :186.00   Max.   :180.00   Max.   :400.00  
                  NA's   :1        NA's   :214      NA's   :210     
    calcium          salad          
 Min.   :  0.00   Length:515        
 1st Qu.:  8.00   Class :character  
 Median : 20.00   Mode  :character  
 Mean   : 24.85                     
 3rd Qu.: 30.00                     
 Max.   :290.00                     
 NA's   :210                        

La función summary() proporciona un resumen estadístico de las variables en el dataframe datos. Muestra la media, mediana, mínimo, máximo y otros estadísticos para las variables numéricas, así como la frecuencia para las variables categóricas.

Resultado: El resultado será un resumen de todas las variables en datos.

Transformación de datos según las necesidades del análisis

# Transformación de datos según las necesidades del análisis
datos$calories <- as.numeric(datos$calories)
datos$total_fat <- as.numeric(datos$total_fat)

En este caso, estamos convirtiendo las variables “calories” y “total_fat” a formato numérico utilizando as.numeric(). Esto se hace para asegurarnos de que estas variables sean tratadas como numéricas en lugar de caracteres.

Resultado: Los datos en las columnas “calories” y “total_fat” se transformarán a formato numérico.

Creación de nuevas variables o características

# Creación de nuevas variables o características
datos$cal_per_protein <- datos$calories / datos$total_fat

Aquí estamos creando una nueva variable llamada “cal_per_protein” que representa calorías por gramo de proteína. Esta operación se realiza dividiendo la columna “calories” entre la columna “total_fat”.

Resultado: Se añadirá una nueva columna llamada “cal_per_protein” al dataframe datos.

Mostrar el dataframe después de las transformaciones

# Mostrar el dataframe después de las transformaciones
print("Dataframe después de la limpieza y preparación:")
[1] "Dataframe después de la limpieza y preparación:"
print(datos)
# A tibble: 515 × 19
    ...1 restaurant item            calories cal_fat total_fat sat_fat trans_fat
   <dbl> <chr>      <chr>              <dbl>   <dbl>     <dbl>   <dbl>     <dbl>
 1     1 Mcdonalds  Artisan Grille…      380      60         7       2       0  
 2     2 Mcdonalds  Single Bacon S…      840     410        45      17       1.5
 3     3 Mcdonalds  Double Bacon S…     1130     600        67      27       3  
 4     4 Mcdonalds  Grilled Bacon …      750     280        31      10       0.5
 5     5 Mcdonalds  Crispy Bacon S…      920     410        45      12       0.5
 6     6 Mcdonalds  Big Mac              540     250        28      10       1  
 7     7 Mcdonalds  Cheeseburger         300     100        12       5       0.5
 8     8 Mcdonalds  Classic Chicke…      510     210        24       4       0  
 9     9 Mcdonalds  Double Cheeseb…      430     190        21      11       1  
10    10 Mcdonalds  Double Quarter…      770     400        45      21       2.5
# ℹ 505 more rows
# ℹ 11 more variables: cholesterol <dbl>, sodium <dbl>, total_carb <dbl>,
#   fiber <dbl>, sugar <dbl>, protein <dbl>, vit_a <dbl>, vit_c <dbl>,
#   calcium <dbl>, salad <chr>, cal_per_protein <dbl>

Este código imprime el dataframe datos después de todas las transformaciones y la creación de nuevas variables.

Resultado: Verás el dataframe datos modificado con las transformaciones y la nueva variable.

III. Visualización de datos

a) Visualización de datos univariados.

Para el trabajo de visualización de datos univariados tomaremos en cuenta el dataframe ya preparado, en este caso sin valores nulos.

datos_no_missing$...1 <- NULL
datos_no_missing$salad <-  NULL
Data <- datos_no_missing
colnames(Data)
 [1] "restaurant"  "item"        "calories"    "cal_fat"     "total_fat"  
 [6] "sat_fat"     "trans_fat"   "cholesterol" "sodium"      "total_carb" 
[11] "fiber"       "sugar"       "protein"     "vit_a"       "vit_c"      
[16] "calcium"    

Ya que tenemos 18 columnas, usaremos algunas para la visualización univariado.

Variable cualitativa

Para analizar en la columna “restaurant”, cuantos tipos de restaurantes hay, haremos lo siguiente

table(Data$restaurant)

      Arbys Chick Fil-A Dairy Queen   Mcdonalds       Sonic      Subway 
         25          21          27          57          49          96 
  Taco Bell 
         26 

Haciendo una gráfica de barras para variable caulitativa

barplot(table(Data$restaurant))

Gráfica de circular

pie(table(Data$restaurant))

Variable cuantitativa

Gráfica para variable cuantitativa

hist(Data$calories)

hist(Data$trans_fat)

boxplot(Data$calories)

boxplot(Data$trans_fat)

b) Visualización de datos bivariados

Cualitativa vs Cuantitativa

Tabla usando las columnas “restaurant” y “sugar” por media en agrupación

Data %>% group_by(restaurant) %>% summarise( media_azucar= mean(sugar))
# A tibble: 7 × 2
  restaurant  media_azucar
  <chr>              <dbl>
1 Arbys               7.24
2 Chick Fil-A         3.48
3 Dairy Queen         6.59
4 Mcdonalds          11.1 
5 Sonic               6.61
6 Subway             10.1 
7 Taco Bell           4.04

Gráfica

grafico_barras <- ggplot(Data, aes(x = Data$restaurant, y = Data$sugar)) +
  geom_bar(stat = "summary", fun = "mean", fill = "skyblue") +
  labs(title = "Gráfico de Barras Restaurante vs Azucar", x = "Restaurante", y = "Azucar")
grafico_barras
Warning: Use of `Data$restaurant` is discouraged.
ℹ Use `restaurant` instead.
Warning: Use of `Data$sugar` is discouraged.
ℹ Use `sugar` instead.

Grafica de Caja y bigotes

# Crear el gráfico de caja y bigotes usando ggplot2
grafico_caja_bigotes <- ggplot(Data, aes(x = Data$restaurant, y = Data$sugar, fill = Data$restaurant)) +
  geom_boxplot() +
  labs(title = "Gráfico de Caja y Bigotes Bivariado", x = "Restaurante", y = "Media azucar") +
  theme_minimal()

# Mostrar el gráfico
print(grafico_caja_bigotes)
Warning: Use of `Data$restaurant` is discouraged.
ℹ Use `restaurant` instead.
Warning: Use of `Data$sugar` is discouraged.
ℹ Use `sugar` instead.
Warning: Use of `Data$restaurant` is discouraged.
ℹ Use `restaurant` instead.

Tambien podemos hacer un histograma sin agrupar por media

ggplot(Data, mapping = aes(x= Data$sugar)) + geom_histogram( aes(fill= Data$restaurant)) + facet_grid(vars(Data$restaurant))
Warning: Use of `Data$restaurant` is discouraged.
ℹ Use `restaurant` instead.
Warning: Use of `Data$sugar` is discouraged.
ℹ Use `sugar` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Variables cuantitativas vs cuantitativas

plot(x=Data$cal_fat, y=Data$sat_fat)

plot(x=Data$total_carb, y=Data$fiber)

c) Visualización de datos bivariados multivariados.

Tabla usando las columnas “restaurant” y otras columnas mediante la media

Data_media <- as.data.frame(Data %>% group_by(restaurant) %>% summarise( media_azucar= mean(sugar), media_sat_fat = mean(sat_fat)))
Data_media
   restaurant media_azucar media_sat_fat
1       Arbys     7.240000      6.560000
2 Chick Fil-A     3.476190      3.071429
3 Dairy Queen     6.592593     10.222222
4   Mcdonalds    11.070175      8.289474
5       Sonic     6.612245     11.612245
6      Subway    10.093750      6.197917
7   Taco Bell     4.038462      8.519231

Gráfica

# Reorganizar el DataFrame para facilitar la visualización
Data_R <- tidyr::gather(Data_media, key = "Media", value = "Valor", -restaurant)

# Crear el gráfico de barras apiladas usando ggplot2
grafico_barras_apiladas <- ggplot(Data_R, aes(x = Data_R$restaurant, y = Valor, fill = Media)) +
  geom_bar(stat = "identity") +
  labs(title = "Gráfico de Barras Bivariado", x = "Restaurante", y = "Media") +
  theme_minimal()

# Mostrar el gráfico
print(grafico_barras_apiladas)
Warning: Use of `Data_R$restaurant` is discouraged.
ℹ Use `restaurant` instead.

d) Visualización de datos avanzados (imágenes)

Grafica que indica datos perdidios de un dataframe.

# Usando la data original
plot_missing(datos)

# Usando la data sin valores nulos
plot_missing(datos_no_missing)

Multiples graficas de histogramas en una imagen para el dataframe, útil para un análisis rapido.

plot_histogram(Data)

Gráfica de correlación con mapa de calor

plot_correlation(Data)
1 features with more than 20 categories ignored!
item: 298 categories

Normalizar datos con graficas spiderweb

# Creamos funcion para normalizar los datos del dataframe
normalizar <- function(x) {
  x = (x - min(x))/(max(x)-min(x))
  return(x)
}
# Aplicando a las diferentes columnas del dataframe
normalizacion_aplicada <- lapply(Data[,-c(1,2)], normalizar)
# Creando rada o spiderweb
radar_Data <- data.frame(Data["restaurant"], normalizacion_aplicada)
ggradar(as.data.frame(radar_Data))
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, 2] * sin(angles[1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, 2] * cos(angles[1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, 2] * sin(angles[1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, 2] * cos(angles[1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, 2] * sin(angles[1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, 2] * cos(angles[1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, 2] * sin(angles[1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, 2] * cos(angles[1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, 2] * sin(angles[1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, 2] * cos(angles[1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, 2] * sin(angles[1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, 2] * cos(angles[1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, j] * sin(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, j] * cos(angles[j - 1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$x[rowNum] <- pathData[, 2] * sin(angles[1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo
Warning in graphData$y[rowNum] <- pathData[, 2] * cos(angles[1]): número de
items para para sustituir no es un múltiplo de la longitud del reemplazo

IV. Manipulación de datos no estructurados

1. Importación de Datos

  • Flexibilidad en Formatos: RStudio permite importar datos desde diversas fuentes y formatos, como archivos CSV, TXT, Excel o incluso directamente desde bases de datos. La función read.table() es altamente configurable, permitiendo especificar delimitadores, encabezados y otros parámetros para adaptarse a la estructura de los datos.

  • Exploración Preliminar: Antes de la importación, RStudio ofrece herramientas gráficas y de consola para explorar los datos, lo que facilita comprender la estructura y planificar la estrategia de importación.

2. Limpieza y Preprocesamiento

  • Eliminación de Outliers: RStudio proporciona funciones para identificar y tratar valores atípicos o datos anómalos que pueden surgir en el texto, lo que contribuye a la integridad de los resultados del análisis.

  • Normalización de Texto: La normalización, como la conversión de texto a minúsculas, es crucial. RStudio ofrece funciones como tolower() para garantizar consistencia y facilitar la comparación de palabras.

3. Tokenización

  • Personalización de Tokens: La tokenización no se limita solo a palabras. RStudio permite personalizar la tokenización para adaptarse a las necesidades específicas del análisis, incluyendo la tokenización de oraciones o la creación de n-gramas.

  • Manejo de Stop Words: RStudio facilita la eliminación de palabras comunes (stop words) durante la tokenización para centrarse en términos más significativos.

4. Análisis de Texto

  • Matrices de Términos y Documentos (DTM): RStudio, mediante la librería tm, facilita la construcción de DTMs, que son esenciales para representar la frecuencia de palabras en documentos y realizar análisis más avanzados.

  • Análisis de Sentimientos: Paquetes especializados como tidytext permiten realizar análisis de sentimientos, identificando tonalidades positivas, negativas o neutrales en el texto.

5. Extracción de Información

  • Expresiones Regulares Avanzadas: RStudio, con la librería stringr, permite el uso de expresiones regulares avanzadas para una extracción más precisa de patrones específicos en el texto.

  • Análisis de Entidades Nombradas (NER): Paquetes como udpipe ofrecen herramientas para realizar análisis de Entidades Nombradas, identificando automáticamente nombres de personas, lugares, organizaciones, etc.

6. Visualización de Datos

  • Gráficos Interactivos: RStudio facilita la creación de gráficos interactivos utilizando paquetes como plotly, permitiendo explorar visualmente resultados y patrones de manera dinámica.

  • Personalización Estilística: La personalización estilística de gráficos, incluyendo colores, etiquetas y leyendas, es intuitiva en RStudio, proporcionando un control completo sobre la presentación visual de los resultados.

7. Exportación de Resultados

  • Formatos Versátiles: RStudio permite exportar resultados a una variedad de formatos, como CSV, Excel, PDF o imágenes, facilitando la integración con otras herramientas y la presentación de informes.

  • Automatización de Exportación: Con el uso de scripts, es posible automatizar el proceso de exportación, lo que es especialmente útil en análisis recurrentes o en la producción de informes programados.

8. Paquetes Útiles

  • Integración con Tidyverse: RStudio se integra de manera eficiente con el tidyverse, un conjunto de paquetes que siguen principios consistentes, facilitando un análisis más estructurado y limpio.

  • Comunidad Activa: La comunidad de R es amplia y activa. RStudio facilita la instalación y gestión de paquetes, permitiendo acceder a contribuciones continuas y mejoras.

En resumen, RStudio proporciona un entorno completo para la manipulación de datos no estructurados en texto, ofreciendo herramientas versátiles y flexibles para cada fase del proceso, desde la importación hasta la visualización de resultados.

V. Conclusiones

Manipulación de DataFrame - La manipulación de DataFrame es esencial en el análisis de datos en R. Los DataFrames permiten organizar y trabajar con datos de manera estructurada, facilitando la aplicación de operaciones y funciones a conjuntos de datos.

Funciones, Módulos y Librerías Principales en R - El uso eficiente de funciones, módulos y librerías en R es fundamental para simplificar y optimizar el código. Algunas librerías esenciales incluyen dplyr para manipulación de datos, ggplot2 para visualización, y tidyr para la limpieza y preparación de datos.

Flujo del Proceso de Análisis de Datos - El flujo del proceso de análisis de datos generalmente sigue una secuencia lógica que incluye la importación de datos, manipulación, limpieza, análisis exploratorio, modelado y visualización. Este enfoque estructurado ayuda a mantener un orden y facilita la reproducibilidad de los resultados.

Importación de Datos - R ofrece diversas funciones y métodos para importar datos desde diferentes fuentes, como archivos CSV, Excel, bases de datos SQL, entre otros. La habilidad de trabajar con una variedad de formatos de archivos es crucial para el análisis de datos diverso.

Manejo de Datos - Identificar y manejar datos faltantes es crucial para obtener resultados precisos. El manejo de outliers e inconsistencias garantiza la calidad de los datos y mejora la confiabilidad de los análisis.

Limpieza y Preparación de Datos - La limpieza y preparación de datos son pasos críticos para asegurar que los datos estén en un formato adecuado para el análisis. Esto incluye la corrección de errores, estandarización de formatos y la transformación de datos según sea necesario.

Visualización de Datos - La visualización es una herramienta poderosa para comprender patrones, identificar tendencias y comunicar resultados. La capacidad de crear visualizaciones univariadas, bivariadas y multivariadas permite explorar la información desde diferentes perspectivas.

Manipulación de Datos No Estructurados - La manipulación de datos no estructurados, como imágenes, requiere enfoques específicos. Librerías como ‘tidytext’ pueden ser útiles para analizar texto, mientras que librerías como ‘imager’ pueden facilitar la manipulación de imágenes en R.

Referencias

  1. Análisis exploratorio de datos en R:

    Kabacoff, RI (2015). R en Acción: Análisis de datos y gráficos con R. Publicaciones de Manning.

  2. Importación de datos y manejo de datos faltantes en R:

    Hadley, W. (2019). tidyverse: Instale y cargue fácilmente el ‘Tidyverse’. Paquete R versión 1.2.1. URL: https://CRAN.R-project.org/package=tidyverse

  3. Limpieza y preparación de datos en R: Jurečková, J. y Picek, J. (2018). Análisis de datos, aprendizaje automático y descubrimiento de conocimiento. Springer.

  4. Manipulación de datos y análisis en R:

    Wickham, H. y Grolemund, G. (2016). R para ciencia de datos: importar, ordenar, transformar, visualizar y modelar datos. Medios O’Reilly.

  5. Visualización de datos en R:

    Chang, W. (2013). Libro de cocina de gráficos R. Medios O’Reilly.

Diseño de pág (ignorar)

body {
  background-color: #2C3E50; /* Fondo gris oscuro */
  color: #ECF0F1; /* Texto blanco */
  font-family: 'Consolas', monospace; /* Tipo de fuente monoespaciada */
  line-height: 1.6; /* Altura de línea */
}

h1, h2, h3, h4, h5, h6 {
  color: WHITE; /* Azul intenso */
  font-family: 'Inconsolata', monospace; /* Tipo de fuente monoespaciada para encabezados */
  font-weight: bold; /* Negrita para encabezados */
  margin-bottom: 10px; /* Espaciado inferior para encabezados */
}

/* Cambia el color del fondo del bloque de resultados de código */
.output {
  background-color: GREEN; /* Un tono de gris claro */
  color: GREEN; /* Color de texto más oscuro */
}

/* Cambia el color del fondo y del texto dentro de los bloques de código */
pre {
  background-color: #495057; /* Fondo gris claro */
  color: WHITE; /* Color de texto más oscuro */
  padding: 10px; /* Añade un espacio interno para separar el texto del borde del bloque */
  border-radius: 5px; /* Agrega esquinas redondeadas al bloque */
  overflow: auto; /* Añade barras de desplazamiento si el contenido es muy largo */
}