Introducción

  • En R todos las variables son objetos.
  • Las asignaciones en R se hacen con <-
  • Los comentarios se hacen con #
x<-2 #Esto es un comentario

Ctrl+Shift+C #comentarios de mas de una linea
  • Directorio de trabajo actual: getwd()
  • Cambiar directorio: setwd(“C:\otro_directorio”)
# Ver archivos
list.files()

# Ver directorios
list.dirs()
  • Revisar archivos guardados en memoria ls()
  • Instalar paquetes y librerías
install.packages("readr") #Instalacion (Solo se hace una vez)
library(readr) # Cargue de la libreria (Siempre que se vaya a usar)
update.packages() #Actualizar paquetes R
#3.6.1 
  • Factores: Agrupación especial de datos. Ejemplo: podemos tener dos tipos de valores en la variable sexo: 1 y 2. A las cuales le podemos asignar unas etiquetas o niveles. Hombres (1) y Mujeres (2). Esto es muy útil para el tratamiento de datos. OJO: los factores siempre quedan guardados como numeros con etiquetas en texto
  • En R, usamos NA para representar datos perdidos, mientras que NULL representa la ausencia de datos. La diferencia entre las dos es que un dato NULL aparece sólo cuando R intenta recuperar un dato y no encuentra nada, mientras que NA es usado para representar explícitamente datos perdidos, omitidos o que por alguna razón son faltantes. NA además puede aparecer como resultado de una operación realizada, pero no tuvo éxito en su ejecución.
  • A diferencia de la mayoría de los lenguajes de programación, los índices en R empiezan en 1, no en 0.
  • Funciones basicas
#Limpiar datos
rm(list=ls())

#Promedio
mean()
#Desviacion estandar
sd()
#Coeficiente de correlacion
cor()
#Resumen estadistico
summary()
#Mirar los primeros 10 datos
head()
#Leer datos CSV paquete base
bcancer <- read.csv("breast-cancer-wis.csv")
bcancer <- read.table(file = "breast-cancer-wis.csv", header = TRUE, sep = ",",
                      col.names = nombres)
#Exportar datos paquete base
write.csv(x = iris, file = "iris.csv", row.names = FALSE)

#OJO NOTA: Se recomiendas usar data table para leer y escribir dado que es mas 
#rapido que el paquete base

#Uso formato .Rds
saveRDS(object = mi_lista, file = "mi_lista.rds")
mi_lista_importado <- readRDS(file = "mi_lista.rds")

#Usar un script R desde otro archivo
source("MyScript.R")

Directorios de trabajo

getwd() #Directorio actual de trabajo
setwd("C:\otro_directorio") #Cambiar el directorio

Organizar codigo. Rstudio automaticamente organiza nuestro codigo para que sea mas legible

Contorl +I 
Control+shift (Mayus) +A

Verificar si las librerias estan y instalarlas

#Verificar librerias
list.of.packages <- c("shiny","shinydashboard","ggplot2","data.table","lubridate")
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)

Acomodar ceros a la derecha y a la izquierda

Simula la funcion right de excel
right = function(text, num_char) {
  substr(text, nchar(text) - (num_char-1), nchar(text))
}

cron[,cantidad.requerida.mix:=round((sum.mix/fc.m.kg)*1000,4),]
#Numeros a la derecha
cron[,cantidad.requerida.mix:=sprintf("%f",cantidad.requerida.mix),]
#Numeros a la izquierda
cron[,cantidad.requerida.mix:=paste0("000000000",cantidad.requerida.mix)]
cron[,cantidad.requerida.mix:=right(cantidad.requerida.mix,16)]

Tipos de datos

  • Conversión (Coercion). Cuando estas funciones tienen éxito en la coerción, nos devuelven datos del tipo pedido. Si fallan, obtenemos NA como resultado.
as.integer()	#Conversion a Entero
as.numeric()	#Conversion a decimal
as.character()	#Conversion a Cadena de texto
as.factor()	#Conversion a Factor 
as.logical()	#Conversion a Lógico
as.null()	#Conversion a NULL

#La conversion se da en el siguiente sentido y nunca en el sentido contrario
lógico -> entero -> numérico -> cadena de texto 
(logical -> integer -> numeric -> character)
  • Verficar el tipo de dato
str(a) #Me indica que tipo de dato es
class(a) #Me indica que tipo de dato es

is.integer()	#Verificar si es Entero
is.numeric()	#Verificar si es decimal
is.character()	#Verificar si es Cadena de texto
is.factor()	#Verificar si es Factor 
is.logical()	#Verificar si es Lógico
is.null()	#Verificar si es NULL

Operadores

Relacionales

OperadorComparación
<menor que
<=menor que
>mayor que
>=mayor que
==igual que
!=No es igual que

Lógicos

OperadorComparación
x | yx O y es verdadero
x & yx Y y es verdadero
!xx no es verdadero (negación)

Si se comparan dos cadenas de texto con < o > se usa como criterio el orden alfabético

Estructuras de datos

Vectores

Un vector es una colección de uno o más datos del mismo tipo.

vector=c(1,2,3) #La c indica concatenar
vector + 2  ===> 3,4,5
vector * 2  ===> 2,4,6
vector[1] #Seleccionar el elemento 1 del vector
vector[c(1,3)] #Seleccionar el elemento 1 y 3 del vector
vector[1:2] #Seleccionar los elementos del 1 al 2

Matrices y arrays

Son vectores multidimensionales. Al igual que un vector, únicamente pueden contener datos de un sólo tipo, pero además de largo, tienen más dimensiones. Cuentan con dos dimensiones, un “largo”" y un “alto”. Las matrices son, por lo tanto, una estructura con forma rectangular, con renglones y columnas.

matrix(1:12, nrow = 3, ncol = 4) #Crear matrices con 3 filas y 4 columnas
#Se van organizando de arriba hacia abajo por columnas
      [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

cbind() #para unir vectores, usando cada uno como una columna.
rbind() #para unir vectores, usando cada uno como un renglón.
dim() # para la dimension de una matriz
t(matriz) # Trasponer una matriz

Se puede sumar, multiplicar y elevar por un escalar una matriz.
Esto afecta todos los valores que existen en ella

matriz[filas, columnas] #Seleccion de datos 

Las matrices siempre serán rectangulares. Cuando intentamos acomodar un número diferente de elementos y celdas, ocurren dos cosas diferentes. Si el número de elementos es mayor al número de celdas, se acomodarán todos los datos que sean posibles y los demás se omitirán. Si, por el contrario, el número de celdas es mayor que el número de elementos, estos se repetirán.

Dataframes

Los data frames son estructuras de datos que pueden contener datos de diferentes tipos. los renglones en un data frame representan casos, individuos u observaciones, mientras que las columnas representan atributos, rasgos o variables. Un data frame está compuesto por vectores.

mi_df <- data.frame(
  "entero" = 1:4, 
  "factor" = c("a", "b", "c", "d"), 
  "numero" = c(1.2, 3.4, 4.5, 5.6),
  "cadena" = as.character(c("a", "b", "c", "d"))
)

dim(mi_df) #Conocer dimensiones dataframe
names(mi_df) #Conocer el nombre de las columnas dataFrame
as.data.frame() #Convertir a data frame
data.frame[indice_filas, indice_columnas] #Seleccion de datos 
data.frame["name_column"] #Seleccion de datos
data.frame$name_column #Seleccion de datos
mi_df$c("nombre", "edad") #Seleccionar datos. 
iris[iris$Sepal.Length > 7.5, ] #Seleccion con validacion
#Otra forma de seleccion
#Data, condicion, seleccion de columnas
subset(x = iris, subset = Sepal.Length > 7.5, select = c("Sepal.Length", "Species"))

Listas

Las listas, al igual que los vectores, son estructuras de datos unidimensionales, sólo tienen largo, pero a diferencia de los vectores cada uno de sus elementos puede ser de diferente tipo o incluso de diferente clase. Al igual que con un data frame, tenemos la opción de poner nombre a cada elemento de una lista.

mi_matriz <- matrix(1:4, nrow = 2)
mi_df     <- data.frame("num" = 1:3, "let" = c("a", "b", "c"))

mi_lista <- list("un_vector" = mi_vector, "una_matriz" = mi_matriz, "un_df" = mi_df)

mi_lista

Coerción

FunciónCoerciona aCoersionar exitosamente a
as.vector()vectormatrices
as.matrix()matricesvectores, data frames
as.data.frame()data framevectores, matrices
as.list()listavectores, matrices, data frames

Funciones

#Definicion
nombre <- function(argumento1,argumento2,etc) {
  operaciones
}
#Ejemplo
area_cuad <- function(lado1, lado2) {
  lado1 * lado2
}
#Forma de llamado 1 
area_cuad(lado1 = 4, lado2 = 6)
#Forma de llamado 2 
area_cuad(4,6)

Estructuras de control

If-Else

if(condición) {
  operaciones_si_la_condición_es_TRUE
} else {
  operaciones_si_la_condición_es_FALSE
}

#Ejemplo
if(media >= 6) {
    print(paste0(texto, "aprobado"))
  } else {
    print(paste0(texto, "reprobado"))
  }

#Otra forma
ifelse(vector, valor_si_TRUE, valor_si_FALSE)

#Ejemplo
ifelse(num %% 2 == 0 & num %% 3, "Divisible", "No divisible")

For

Este ciclo no es el mas recomendado, existe otras alternativas en R mas potenciales para ejecutar estas tareas.

for(elemento in objeto) {
  operacion_con_elemento
}

#Ejemplo
dado <- 1:6
for(cara in dado) {
  dado ^ 2 
}

For para añadir filas a una data table

v<-colores$cod.ext.2
n<-1
list<-as.list(NULL)

for (i in v){
  a<-conector
  a$ext.2<-paste0(i)
  list[[n]]<-a
  conector1<-rbindlist(list)
  n<-n+1
}

Para imprimir imagenes de un ggplot

data_g<-data[maquina==i,]

p<-ggplot(data=data_g, aes(x=mes, y=metros, fill=metodo)) +
  geom_bar(stat="identity", position=position_dodge())+
  geom_text(aes(label=metros), vjust=1.6, color="white",
            position = position_dodge(0.9), size=2.8)+
  scale_fill_brewer(palette="Paired")+
  theme_minimal()+ labs(title=paste0(i))+theme(plot.title = element_text(hjust = 0.5))
ggsave(paste0(i,".png"))
print(p)

While

while(condicion) {
  operaciones
}

#Ejemplo
while(i < 10) {
  print("Presiona ESC para detener")
}

Next y Break

#Next (Salta parte de un cilo)
for(i in 1:4) {
  if(i == 3) {
    next
  }
  print(i)
}

#Break (Rompe un ciclo)
for(i in 1:10) {
  if(i == 3) {
    break
  }
  print(i)
}

Repeat

repeat {
  operaciones
  
  un_break_para_detener
}
#Ejemplo
repeat{
  valor <- valor + 1
  if(valor == 5) {
    break
  }
}

Si no incluimos un break, el bucle se repetirá indefinidamente y sólo lo podremos detener pulsando la tecla ESC, así que hay que tener cuidado al usar esta estructura de control

Data table

Librería mas veloz y flexible para el manejo de tablas en R.

Siempre que tengas datos para analizar en computador, trata de tenerlos en formato largo, es mucho más fácil de trabajar con ellos. Para convertir una tabla ancha en una larga, usa data.table::melt.

Siempre que tengas que generar datos para interpretación por humanos, considera ponerlos en formato ancho, son más fáciles de entender. Podes lograrlo con data.table::dcast.

#Actualizar todos los paquetes
update.packages(ask = FALSE)

#Instalar paquete
install.packages("data.table")
install.packages("tidyverse", dependencies = TRUE)

#Cargar libreria
library(data.table)

#Crear data table
mi_df <- data.table(
  "entero" = 1:4, 
  "factor" = c("a", "b", "c", "d"), 
  "numero" = c(1.2, 3.4, 4.5, 5.6),
  "cadena" = as.character(c("a", "b", "c", "d"))
)

#leer datos
data <- fread("data/item_julio.csv")
#Se recomienda usa r col class para idnicar que tipo de datos son y ahorrar tiempo de carga
tipo<-c("character","character","character")#Permite cargar mas rapido y evitar errores
conector <- fread("data/conector_ref.csv", colClasses = tipo)

#Escribir datos
fwrite(x =conector, file = "exit/testing.csv", sep = ",", dec = ".")

#eliminar duplicados
unique(Item)

#Estructura
data table[i,j,by=k]

#i sirve para filtrar
irisDT[Species == "setosa", ]
irisDT[Petal.Width > 2, ]
irisDT[Petal.Width <= 0.3 & Sepal.Length > 5,]
irisDT[c(1, 4),]
irisDT[c("color","altura"),]

#La j sirve para operar (¿que queremos hacer con los datos?)
irisDT[Species == "versicolor", mean(Sepal.Length)]
irisDT[Species == "versicolor", .(promedio = mean(Sepal.Length), mediana = median(Sepal.Length))]   #varias operaciones al mismo tiempo
irisDT[Species == "versicolor", hist(Sepal.Length)]

#La k sirve para agrupar
irisDT[ , mean(Sepal.Length), by = Species]
irisDT[Sepal.Width >= 3, mean(Sepal.Length), by = Species]
irisDT[, mean(Sepal.Length), by = .(Species, petaloPequeno = Petal.Width < .3)]

#Contar el número de registros.
.N 

#Cambiar nombres a las variables
names (DatosTdoPeso) = c("Tratamiento", "Variedad", "Parcela", "Peso46a60")

#Cambiar NA por otros valores
my_data[is.na(my_data)] <- 0

#Cambiar solo un nombre de una columna
names (DatosTdoPeso)[3] = "Parcela"

#Cambiar el orden de las columnas, se recomienda hacerlo por nombres
DatosTdoPeso1 = DatosTdoPeso [ , c(3,2,1,7,6,5,4)]
DatosTdoPeso1 = DatosTdoPeso [ , c("name","fecha","key")]

#cambiar el orden del eje x en ggplot2
equiposDeslizadores1$month <- factor(equiposDeslizadores1$month,levels = c(0,1,2,3,4,5,6,7,8,9,10,11,12,13),labels = c("YTD18", "1","2","3","4","5","6","7","8","9","10","11","12","YTD19"))

#Funciones especiales

#Entre
irisDT[Sepal.Length %between% c(5.1, 5.2)]
#Como 
irisDT[Species %like% "v.*",]

#Tabla ancha a larga
dfLarga_2 <- melt(dfAncha, id.vars = "item",  #id=datos que no vamos a cambiar
                  variable.name = "region",  #var.name= nombre encabezados a poner largos
                  value.name = "valor",  #value= valores de los var.name
                  variable.factor = FALSE)

#Tabla larga a ancha
dfAncha_2 <- dcast(dfLarga, 
                   item ~ region, # x ~ y (filas ~ columnas)
                   value.var = "valor")

#Contar el numero de elementos por filas. Se uso en lista de materiales
col.base<-col.base[ , index := 1:.N , by = c("cod.ext.2.col") ]

#Convierte , en .
epoxica$produccion.und<-gsub(",", ".", epoxica$produccion.und)

#Nueva forma buscarv
nominalesEnsamble <- fread("files/nominales/nominales_ensamble.csv")
setkeyv(ensamble, c("maquina", "proceso"))
setkeyv(nominalesEnsamble, c("maquina", "proceso"))
ensamble[nominalesEnsamble, nominal := nominal]

Excel

library("writexl")
library("readxl")

data<- read_excel("data/data.xlsx")
data<-as.data.table(data)

write_xlsx(comision, "exits/comisiones.xlsx")