Sobre R

Column 1

¿Qué es R?

  • R es un lenguaje de programación open-source desarrollado por los laboratorios Bell en los años 70’s.
  • Es la versión libre del lenguaje de programación S plus.
  • Es un lenguaje de programación tipo script por lo que es sencillo y directo.
  • R es un interprete ya que puedes escribir scripts y guardarlos como archivos.
  • Por lo tanto ….. ¡R es un lenguaje de programación, no un programa estadístico que se maneja con clics!

¿Porqué es tan utilizado R?

  • Porque es libre y cada usuario puede agregar sus propias librerías sin necesidad de esperar futuras versiones.
  • Porque nos ayuda a automatizar, hacer mas efectivo y óptimo el análisis de datos.
  • A pesar de ser un lenguaje de programación no requiere gran conocimiento para poder trabajar con el, es muy amigable y facil de usar.
  • Uno de los elementos más robustos que tiene el lenguaje de programación R es la gran variedad de funciones que ofrece los paquetes de terceros (especializados en algún tema en particular).

Ventajas y desventajas

Ventajas

  • Es gratuito, libre y multiplataforma (se encuentra en los 3 sistemas operativos)
  • Facilidad para el manejo y almacenamiento de datos.
  • Una colección extensa e integrada de herramientas para el análisis de datos. (paquetes)
  • R es utilizado por los mejores científicos del mundo y a tenido una gran acogida en su uso y enseñanza por los académicos.
  • R dispone de una comunidad de desarrolladores/usuarios detrás que se dedican constantemente a la mejora y a la ampliación de las funcionalidades y capacidades del programa. Nosotros mismos podemos ser desarrolladores de R.

Desventajas

¿Cual o cualés creen que pueda ser una desventaja?

   library(dismo)
Warning: package 'raster' was built under R version 3.4.2
Warning: package 'sp' was built under R version 3.4.4

¿Qué es Rstudio?

Es una interfaz de usuario muy amigable utilizado para trabajar con R con la ventaja que se encuentra en las 3 plataformas.

Tipos de datos

Column 1

Numéricos

   x<- 5   # Entero
   y<- 5.0 # Flotante
   z<- 3.141516786654 #double
   x
[1] 5
   y
[1] 5
   z
[1] 3.141517

Booleanos

   bol1<- TRUE
   bol2<- T
   bol3<- FALSE
   bol4<- F
   bol1
[1] TRUE
   bol2
[1] TRUE
   bol3
[1] FALSE
   bol4
[1] FALSE

Cadenas y caracteres

  cad1<- 'Esto es una cadena'
  cad2<- "Esto tambien es una cadena"
  car1<- 'a' #esto es un caracter
  car2<- '5.0' #esto es un caracter
  car3<- '5'   #esto es un caracter
  cad1
[1] "Esto es una cadena"
  cad2
[1] "Esto tambien es una cadena"
  car1
[1] "a"
  car2
[1] "5.0"

Faltantes

   df1<- NA
   df2<- NaN
   df1
[1] NA
   df2
[1] NaN

Primeras nociones

Comenzando con R

R distingue entre mayusculas y minúsculas
  A<- 3
  a<- 2
Los comentarios en R se realiza mediante el simbolo # que significa que puedo colocar texto sin que el lenguaje lo tome en cuenta y no marque error
   A<- 3.141516 #Este es el valor de pi
R se basa en paquetes donde vienen las funciones que se requieren trabajar. Por lo tanto debemos descargarlas y llamarlas cuando la necesitemos.
   library(car)
   library(raster)

Hay dos tipos de comandos: expresiones y asignaciones

Expresión. El resultado se muestra por pantalla y no se pone en memoria
   rnorm(10)
 [1]  0.005066953  0.072356988 -0.781699710  1.145624744 -0.709462337
 [6]  2.973707583 -1.127597781  0.045199197  1.368240693 -0.497109508
Asignación: no se muestra nada
  v <- rnorm(10)

Las entidades que R crea se llaman objetos y estos objetos pueden ser números(enteros, punto flotante), cadenas, lógicos(booleanos) funciones, vectores, matrices, listas, dataframe. Dichos objetos se guardan en el workspace, en una sesión de R todos los objetos están en memoria, si se quiere guardar en disco se requieren funciones.

Los comandos se separan por ";" o por un salto de línea. Un comando se puede escribir en más de una línea. Los comandos se agrupan con "{" y "}"

Comandos separados por ";"
   a <- 3; b <- 5 
Comando escrito en más de una línea
   a <- 3
   b<- 5 

Ejecutar comandos desde un archivo de texto

  source("Clase1.R") 

Directorio Activo

Para ubicarnos en una carpeta específica
  setwd('/Users/epacheco/Google Drive/UNAM 2020/Docencia/Semestre 2021-1/Nichos Ecológicos/Introducción a R')   #importante la comilla simple o doble
Para saber en que ubicación o ruta estamos actualmente
   getwd()  #muestra la ruta donde se tiene el directorio activo
[1] "/Users/epacheco/Google Drive/UNAM 2020/Docencia/Semestre 2021-1/Nichos Ecológicos/Introducción a R"

Por defecto R busca los archivos en el directorio activo. Para verlo/cambiarlo de manera permanente ir al Menú->tools->Global options.

Si queremos referenciar archivos mediante su ruta completa tenemos que utilizar los caracteres "\" o "/".

Hacemos un source poniendo la ruta completa del archivo
    # source("c:\\programas\\Clase1.R") #Manera 1
    # source("c:/programas/Clase1.R") #Manera 2  

Guardar archivo con los resultados de la consola

La función sink guarda la salida(resultado) de nuestras variables siempre y cuando estos se visualizen en la consola es decir por expresión.
   #Inicio de volcado 
   sink("resultado.txt") 
      #Fin de volcado 
      A<- 4
      B<- 8.4
      val<- rnorm(10)
      A+B   # Se realiza la suma de dos variables en memoria pero no se asigna a nada y se muestra en la consola
[1] 12.4
      val   # Se visualiza el contenido de la variable en la consola
 [1]  0.644304199  0.415827770  0.888240909 -1.633311839 -0.001128031
 [6]  0.121352112  0.438245698 -0.858038193 -0.618161507  0.879696265
   sink()  # Al finalizar el sink() se crea el archivo de texti en el directorio activo 

Vectores

Colum1

Tipos de vectores

Un vector es un conjunto de datos agrupados que pueden ser numéricos, cadenas, na, lógicos o cualquier combinación de ellos.

Vector numérico

   c(1,5,3,2) #Crea un vector numérico de 4 elementos
[1] 1 5 3 2

Vector lógico

  c(T,F,T,T,F) #Crea un vector lógico de 5 elementos
[1]  TRUE FALSE  TRUE  TRUE FALSE

Vector de cadenas

   c("Mérida","Sisal","San crisanto","Telchac") #crea un vector de cadenas
[1] "Mérida"       "Sisal"        "San crisanto" "Telchac"     

Vector combinado

   c('si','no',NA, NaN,1,0) #Vector combinado (tener en cuenta que puede convertirse en cadenas)
[1] "si"  "no"  NA    "NaN" "1"   "0"  

Concatenar

La letra c significa "concatenar", y de hecho es un acrónimo para dicha palabra. Vamos a crear y a concatenar dos vectores:

   x<-c(1,3,5)
   y<-c(2,4,6)
   c(x,y)
[1] 1 3 5 2 4 6

Otras maneras de asignar menos utilizadas

   assign("x1", c(1.3, 2.5, 4.2, 9.7, 8.1)) #Instrucción assign
   x1
[1] 1.3 2.5 4.2 9.7 8.1
   c(1.3, 2.5, 4.2, 9.7, 8.1) -> x2 #Asignación en la otra dirección
   x2
[1] 1.3 2.5 4.2 9.7 8.1

Accediendo a los elementos del vector

   x1[3]
[1] 4.2
   x2[1]
[1] 1.3
   x[0] #No puedes acceder al elemento 0
numeric(0)
   x1[6]  #No puedes acceder a elementos mayores que la longitud de la matriz
[1] NA

Nombres a los elementos del vector

  y <- c(5,18,7,13) 
  names(y) <- c("uno","dos","tres","cuatro") #Añadimos los nombres a los elementos del vector.
  y[c("dos","tres")] #Seleccionamos mediante los nombres 
 dos tres 
  18    7 

Extracción y sustitución de elementos

Hay tres maneras para la extracción de elementos en un vector:

  1. Especificar los índices de los elementos a extraer:
  x<-c(18,11,12,10,7,6,17)
  x[c(1,3,6)]
[1] 18 12  6

La orden anterior extrae los elementos 1, 3 y 6 del vector. Un número negativo precediendo al índice significa exclusión.

  1. Eliminando los que no necesites.

Con el vector x creado anteriormente:

  x[-3]
[1] 18 11 10  7  6 17
  x[-c(1,2)]
[1] 12 10  7  6 17
  1. Especificar una condición lógica.
En el caso del vector x creado arriba:
  x>10
[1]  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE
  x[x>10]
[1] 18 11 12 17

Sustitución de valores en un vector

    x <- c(1:5,NA,6:8,NA,9,10)
    x[3]<- -1
  x[is.na(x)] <- 0 #Substituimos los NA por 0
  x
 [1]  1  2 -1  4  5  0  6  7  8  0  9 10
  x[x>5] <- -x[x>5] #A los valores del vector superiores a 5 les cambiamos el signo. 
  x
 [1]   1   2  -1   4   5   0  -6  -7  -8   0  -9 -10

Creación de patrones

Hay varias órdenes para crear vectores de modo automático:
* from:to
* seq
* rep

  1:5
[1] 1 2 3 4 5
Genera números enteros entre 1 y 6
  seq(1,6)
[1] 1 2 3 4 5 6
  seq(1,6,by=0.5)
 [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0
  seq(1,6,length=10)
 [1] 1.000000 1.555556 2.111111 2.666667 3.222222 3.777778 4.333333
 [8] 4.888889 5.444444 6.000000

Hemos generado números entre 1 y 6 en los tres casos. En el segundo se va sumando al número anterior 0.5 hasta que se llega a 6. En el tercer caso hemos ordenado generar una secuencia de 10 números entre 1 y 6.

   rep(1,5)
[1] 1 1 1 1 1
   rep(c(1,2),5)
 [1] 1 2 1 2 1 2 1 2 1 2
   rep(1:4,2)
[1] 1 2 3 4 1 2 3 4
   rep(1:3,c(1,4,5))
 [1] 1 2 2 2 2 3 3 3 3 3

En el primer caso se ha repetido el 1 cinco veces. En el segundo, se ha repetido el patrón (1,2) cinco veces. En el tercer caso, la secuencia 1,2,3 ha sido repetida de acuerdo al vector (1,4,5), esto es, 1 vez el 1, 4 veces el 2 y 5 veces el 3.

Valores faltantes

El símbolo de valor faltante es NA (significa Not Available). Cualquier operación aritmética que involucre a un NA da por resultado un NA. Esto se aplica también a los operadores lógicos tales como <, <=, >, >=, = =, !=(= = es para comprobar si dos objetos son iguales, y != comprueba si dos objetos son distintos).

Vector con NA

   x<-c(1,2,3,NA,4,5)
   x
[1]  1  2  3 NA  4  5
   is.na(x) #is.na(x) pregunta qué elementos de x son faltantes, solo da valor cierto para el cuarto.
[1] FALSE FALSE FALSE  TRUE FALSE FALSE

La expresión x==NA no funciona

 x==NA
[1] NA NA NA NA NA NA
Verificando el NA
  x[x>2] #La siguiente orden pregunta qué valores de x son mayores a 2.
[1]  3 NA  4  5
  x*2    #La última multiplica cada elemento de x por 2
[1]  2  4  6 NA  8 10
Eliminar los NA o NaNs
 x<- x[!is.na(x)]  #El símbolo ! significa lo contrario (signo de negación en valores lógicos)
 x
[1] 1 2 3 4 5

Nota Importante: La función is.na retorna TRUE tanto para los NA como para los NaN. En cambio, la función is.nan sólo retorna TRUE para los NaN.

Vectores lógicos

R permite la manipulación de cantidades lógicas. Los valores de un vector lógico pueden ser TRUE o T (cierto), FALSE o F (falso) y NA/NaN.

Los vectores lógicos se generan mediante condiciones

  #Generamos un vector de 1 a 10 
  x <- 1:10 
#cond1 vector lógico, de la misma longitud que x, donde cada casilla #nos dice si la correspondiente casilla de x cumple la condición x>7
 cond1 <- x > 7
 cond1 
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE

En R los vectores lógicos se pueden utilizar en aritmética ordinaria, siendo sustituido (coercionado) el FALSE por 0 y el TRUE por 1.

   cond2 <- x >= 9 #Generamos otra condición
   cond1 & cond2 #Hacemos una and lógica de las dos condiciones
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE
   !cond1 #Negación lógica del vector
 [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE

Los operadores que se pueden utilizar para las condiciones se puede ver en el siguiente enlace.

Aritmética de vectores

Al contrario de la mayoría de lenguajes de programación, R tiene una aritmética vectorial peculiar, por lo que los vectores pueden aparecer en las expresiones que generamos.

En caso que los vectores que aparecen en una expresión no sean de la misma longitud, el más corto se "recicla" hasta que alcanza la longitud del más largo.

  #Generamos dos vectores. 
  x <- c(1.3, 2.5, 4.2, 9.7, 8.1) 
  y <- c(x,0,x) 

Reciclaje

#Utilizamos x e y en una nueva expresión. Como x es más corto #que y, se reciclará para adquirir su misma longitud. R nos avisa #de este hecho porqué los dos vectores no tienen una longitud #múltiple. El 1 en este caso también se recicla y pasa a ser un #vector de once unoss. 
 v <- 2*x + y + 1 
 v 
 [1]  4.9  8.5 13.6 30.1 25.3  3.6  7.3 11.9 24.6 26.9 11.7

Los simbolos, funciones y operadores que realiza R se puede ver en el siguiente enlace.

Vectores cadena

Los vectores de cadenas de caracteres se usan a menudo en R, principalmente para guardar etiquetas.

Los caracteres pueden ser entrados utilizando comillas simples ('') o dobles (""), aunque después R los muestra normalmente rodeados de comillas dobles. Como en C, utilizan el carácter "" como carácter de escape. Algunos caracteres útiles son el salto de linea () y tabulador ().

La función principal paste toma un número arbitrario de argumentos y los concatena uno a uno para transformarlos después en caracteres

   #Concatenamos un vector de dos letras y otro de dos números posición a posición 
   paste(c("X","Y"),1:2,sep="") 
[1] "X1" "Y2"
  #Ahora concatenamos vectores de diferente longitud y hacemos que el separador de la concatenación sea un #punto ".". Nótese el reciclaje del vector corto. 
  paste(c("X","Y"),1:4,sep=".") 
[1] "X.1" "Y.2" "X.3" "Y.4"
  #La función paste tiene otro argumento, llamado collapse, que fusiona todos los strings que genera para dar #una única cadena de caracteres de salida. El valor de collapse es lo que se coloca en medio de las #diferentes cadenas de caracteres que se unen.
paste(c("X","Y"),1:4,sep=".",collapse="-") 
[1] "X.1-Y.2-X.3-Y.4"

Coerción de tipos

R, como la mayoría de lenguajes de programación, dispone de funciones para realizar la coerción (transformación) de tipos. Para que la coerción tenga lugar no se ha de dar ninguna incompatibilidad entre el tipo origen y el tipo destino. Así como las funciones de coerción, que suelen comenzar con la palabra as seguida de un punto (as.integer) y el tipo de destino, también existen las funciones de verificación de tipos, que se componen de is seguido de un punto y el tipo a verificar (is.integer).

Coerción correcta

  a <- c("1","2","3") 
  b <- as.numeric(a) 

Coerción incorrecta

   a <- c("1","2","x") 
   b <- as.numeric(a) #Se introducen NA's.
   b  
[1]  1  2 NA

Los distintos tipos de coerción de R se los dejo en el siguiente enlace.

Matrices

Colum 1

Funciones básicas

Una matriz en R es un conjunto de objetos indizados por filas y columnas. Un array en R es lo mismo, salvo que puede tener más de dos dimensiones.

La sintaxis general de la orden para crear una matriz es la siguiente:
matrix(data, nrow, ncol, byrow=F)
donde:
data: datos que forman la matriz
nrow: número de filas de la matriz
ncol: número de columnas de la matriz
byrow: Los datos se colocan por filas o por columnas según se van leyendo. Por defecto se colocan por columnas.

  x<-matrix(1:6,nrow=3) # Creamos una matriz 3 x 2
  datos<-matrix(c(20,65,174,22,70,180,19,68,170),nrow=3,byrow=T)
  length(x)# Número de elementos de x
[1] 6
  mode(x) # Tipo de datos de la matriz x
[1] "numeric"
  dim(x)# Dimensiones de la matriz x
[1] 3 2
  dimnames(x)# Nombre de las dimensiones de la matriz
NULL
  rownames(x)# Nombre de las filas de la matriz
NULL
  colnames(x)# Nombre de las columnas de la matriz
NULL
  is.matrix(x)# El objeto x, ¿es una matriz?
[1] TRUE
  y<-c("blanco","negro")# Creamos un vector de dos palabras
  is.matrix(y)# El objeto y, ¿es una matriz?
[1] FALSE
  x[]# Se muestran todos los elementos de x
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6
  rownames(datos)<-c("paco","pepe","kiko")
  colnames(datos)<-  c("edad","peso","altura")
  datos
     edad peso altura
paco   20   65    174
pepe   22   70    180
kiko   19   68    170

Acceder a los elementos

Existen dos formas de acceder a los elementos de una matriz, estas son:

  1. Numéricamente
   x[1,2] # Se muestra el elemento 1,2 de x
[1] 4
   x[1,] # Se muestra la primera fila de x
[1] 1 4
   x[,2] # Se muestra la segunda columna de x
[1] 4 5 6
  1. Por su nombre
  datos[,"edad"] # Edades de todas las personas
paco pepe kiko 
  20   22   19 
  datos["pepe",] # Variables del individuo 
  edad   peso altura 
    22     70    180 
  datos[,c("edad","altura")] # Edad y altura de todas las personas 
     edad altura
paco   20    174
pepe   22    180
kiko   19    170
   dimnames(datos) # Muestra los nombres de filas y columnas
[[1]]
[1] "paco" "pepe" "kiko"

[[2]]
[1] "edad"   "peso"   "altura"

Operaciones con una matriz

Distintas operaciones se pueden realizar unicamente con una matriz estas son:

  #Crear una matriz
  M<- matrix(c(1, 2, 3, 0, 4, 8, 5, 9, 6,7,-1,0),4,3,byrow = T)
  M
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    0    4    8
[3,]    5    9    6
[4,]    7   -1    0
Sustracción
   #Substraer una submatriz de una matriz
   submatriz1<- M[c(2,4),2:3]
   submatriz1
     [,1] [,2]
[1,]    4    8
[2,]   -1    0
   submatriz2<- M[2:4,2:3]
   submatriz2
     [,1] [,2]
[1,]    4    8
[2,]    9    6
[3,]   -1    0
Borrado
   #Borrar la fila 3 y columna 2
   C<- M[-3,-2]
   C
     [,1] [,2]
[1,]    1    3
[2,]    0    8
[3,]    7    0
Intercambio
  #intercambiar fila 4 por fila 2
  E<- M
  E[c(2,4),]<- E[c(4,2),]
  E
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    7   -1    0
[3,]    5    9    6
[4,]    0    4    8
  #intercambiar columna 3 por 1
  M[,c(1,3)]<- M[,c(3,1)]
  M
     [,1] [,2] [,3]
[1,]    3    2    1
[2,]    8    4    0
[3,]    6    9    5
[4,]    0   -1    7
Nombrar
  #poner nombres a las filas y las columnas
  rownames(M)<- c('Tratamiento A','Tratamiento B','Tratamiento C','Tratamiento D')
  colnames(M)<- c('Oxigeno','Presion','Salinidad')
  M
              Oxigeno Presion Salinidad
Tratamiento A       3       2         1
Tratamiento B       8       4         0
Tratamiento C       6       9         5
Tratamiento D       0      -1         7
Encontrar valores
    #encontrar los indices donde M<1 y luego ver los valores
    pos<- which(M<1) #posiciones donde se cumple la condición
    M[pos]<- NA       #los valores de la matriz que cumplen la condición
    M
              Oxigeno Presion Salinidad
Tratamiento A       3       2         1
Tratamiento B       8       4        NA
Tratamiento C       6       9         5
Tratamiento D      NA      NA         7
    #cambiar el valor de -1 a NA
    posneg<- which(M==-1)
    M[posneg]<- NA
    M
              Oxigeno Presion Salinidad
Tratamiento A       3       2         1
Tratamiento B       8       4        NA
Tratamiento C       6       9         5
Tratamiento D      NA      NA         7
   #Otra manera que se vio previamente
   M[M==-1]<- NA 
   M
              Oxigeno Presion Salinidad
Tratamiento A       3       2         1
Tratamiento B       8       4        NA
Tratamiento C       6       9         5
Tratamiento D      NA      NA         7
Sumar
  #como realizar la suma de las filas o las columnas
sumacolumnas<- colSums(M,na.rm = T)
sumacolumnas
  Oxigeno   Presion Salinidad 
       17        15        13 
sumafilas<- rowSums(M,na.rm=T)
sumafilas
Tratamiento A Tratamiento B Tratamiento C Tratamiento D 
            6            12            20             7 
mediacolumnas<- colMeans(M,na.rm=T)
mediacolumnas
  Oxigeno   Presion Salinidad 
 5.666667  5.000000  4.333333 
mediafilas<- rowMeans(M,na.rm=T)
mediafilas
Tratamiento A Tratamiento B Tratamiento C Tratamiento D 
     2.000000      6.000000      6.666667      7.000000 
Encontrar máximos y mínimos
  #maximos y minimos de la matriz
maxmatriz<- max(M,na.rm=T)
maxmatriz
[1] 9
minmatriz<- min(M,na.rm=T)
minmatriz
[1] 1
Ordenar
  #ordenar una matriz
  sort(M)
[1] 1 2 3 4 5 6 7 8 9
Aplicar funciones
  apply(datos,2,mean) #Hallamos la media de las variables por columnas
     edad      peso    altura 
 20.33333  67.66667 174.66667 
  apply(datos,1, sd) #Hallamos la desviación estandar de las variables por filas
    paco     pepe     kiko 
79.18544 81.00206 77.03462 
Redimensionar
  #Agregar filas y/o columnas 
rbind(M,1:3) #al final
              Oxigeno Presion Salinidad
Tratamiento A       3       2         1
Tratamiento B       8       4        NA
Tratamiento C       6       9         5
Tratamiento D      NA      NA         7
                    1       2         3
cbind(1:4,M) #al inicio
                Oxigeno Presion Salinidad
Tratamiento A 1       3       2         1
Tratamiento B 2       8       4        NA
Tratamiento C 3       6       9         5
Tratamiento D 4      NA      NA         7
rbind(M[1:2,],c(3,4,5),M[3:4,]) #en medio
              Oxigeno Presion Salinidad
Tratamiento A       3       2         1
Tratamiento B       8       4        NA
                    3       4         5
Tratamiento C       6       9         5
Tratamiento D      NA      NA         7
   #Cambiar un valor numérico por un character
M[4,3]<- -1 #Cambiamos un valor
M[4,3]<- 'x' #cambia todo a character

Operaciones Matriciales

La forma de realizar las operaciones matriciales en R son:

Suma
   M1<- matrix(c(8,5,9,3,1,0,7,4,5),3,3)
   M2<- matrix(sample(0:100,9),3,3)  # toma 9 valores entre o y 100 y lo coloca en una matriz de 3x3
   #suma de matrices
  SM<- M1 + M2   #La característica principal es que tienen que ser de las mismas dimensiones
  SM
     [,1] [,2] [,3]
[1,]   20    7   44
[2,]   77   39   26
[3,]   40   58   49
Resta
  #resta de matrices 
SM<- M1 - M2 #La característica principal es que tienen que ser de las mismas dimensiones
SM
     [,1] [,2] [,3]
[1,]   -4   -1  -30
[2,]  -67  -37  -18
[3,]  -22  -58  -39
Producto puntual
  #producto puntual de matrices
  PP<- M1 * M2  #La característica principal es que tienen que ser de las mismas dimensiones
  PP
     [,1] [,2] [,3]
[1,]   96   12  259
[2,]  360   38   88
[3,]  279    0  220
Producto escalar
  #Producto escalar
  PE<- 5*M1
  PE
     [,1] [,2] [,3]
[1,]   40   15   35
[2,]   25    5   20
[3,]   45    0   25
Producto matricial
  #Producto matricial
  PM<- M1 %*% M2  #La característica principal es que el numero de columnas de la primera matriz debe ser igual al número de filas de la segunda matriz
Determinante
  # determinante de una matriz
  det(M1)
[1] 10
Inversa
   #inversa de una matriz
   solve(M1)
     [,1] [,2] [,3]
[1,]  0.5 -1.5  0.5
[2,]  1.1 -2.3  0.3
[3,] -0.9  2.7 -0.7

Factores

Column 1

Creación

Un factor es un vector que se usa para especificar una clasificación discreta de los componentes de otros vectores de la misma longitud.

Supongamos que tenemos un vector con la población de origen de 15 estudiantes, y que este vector se ha creado así:

  estudiantes.origen<-c("Sisal","Celestun","San Crisanto","San Crisanto","Celestun","Progreso","Sisal","Progreso","San Crisanto","Celestun","Chelem","Telchac","Celestun","Sisal","Progreso")
estudiantes.origen
 [1] "Sisal"        "Celestun"     "San Crisanto" "San Crisanto"
 [5] "Celestun"     "Progreso"     "Sisal"        "Progreso"    
 [9] "San Crisanto" "Celestun"     "Chelem"       "Telchac"     
[13] "Celestun"     "Sisal"        "Progreso"    
  length(estudiantes.origen)
[1] 15
Ahora creamos una variable de tipo factor, a partir de la existente
  festudiantes<-as.factor(estudiantes.origen)
  festudiantes
 [1] Sisal        Celestun     San Crisanto San Crisanto Celestun    
 [6] Progreso     Sisal        Progreso     San Crisanto Celestun    
[11] Chelem       Telchac      Celestun     Sisal        Progreso    
Levels: Celestun Chelem Progreso San Crisanto Sisal Telchac
Encontramos los niveles del factor
   levels(festudiantes)
[1] "Celestun"     "Chelem"       "Progreso"     "San Crisanto"
[5] "Sisal"        "Telchac"     
Encontramos las cantidades de los distintos niveles del factor
  summary(festudiantes)  #Al pedir el resumen de la variable de tipo factor 'festudiantes', el resultado es una tabla que nos muestra los niveles del factor (las poblaciones de origen), junto con el número de estudiantes correspondiente a tales niveles.
    Celestun       Chelem     Progreso San Crisanto        Sisal 
           4            1            3            3            3 
     Telchac 
           1 

Cálculo de valores

Supongamos ahora que disponemos de las estaturas de cada uno de los estudiantes del ejemplo anterior:
  estudiantes.estaturas <- c(1.83, 1.71, 1.79, 1.64, 1.74, 1.81, 1.62, 1.84, 1.68, 1.81, 1.82, 1.74, 1.84, 1.61, 1.84)
  estudiantes.estaturas
 [1] 1.83 1.71 1.79 1.64 1.74 1.81 1.62 1.84 1.68 1.81 1.82 1.74 1.84 1.61
[15] 1.84

Vamos a calcular ahora la estatura promedio de los estudiantes de cada población a partir de la muestra de la que disponemos:

  tapply(estudiantes.estaturas,festudiantes,mean) # La función tapply() se utiliza para aplicar una función, en este caso mean() para cada grupo de componentes del primer argumento, definidos por los niveles de la segunda componente, en este caso, festudiantes.
    Celestun       Chelem     Progreso San Crisanto        Sisal 
    1.775000     1.820000     1.830000     1.703333     1.686667 
     Telchac 
    1.740000 

Ordenar

Supongamos ahora que tenemos un vector con el nivel de inglés de 10 estudiantes
  nivel.ingles<-c("medio", "medio", "bajo", "medio", "bajo","medio", "alto","alto","bajo", "bajo" )
nivel.ingles
 [1] "medio" "medio" "bajo"  "medio" "bajo"  "medio" "alto"  "alto" 
 [9] "bajo"  "bajo" 
Ahora creamos un factor ordenado con el nivel de inglés de los estudiantes
  fnivel.ingles<-ordered(nivel.ingles,levels=c("bajo","medio","alto"))
fnivel.ingles
 [1] medio medio bajo  medio bajo  medio alto  alto  bajo  bajo 
Levels: bajo < medio < alto
Si ahora queremos saber qué estudiantes tienen un nivel de inglés por debajo de "medio"
  fnivel.ingles<"medio"
 [1] FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE

Cambiar el nombre de los niveles

Los levels contienen las distintas etiquetas. A cada etiqueta diferente R le asigna un número identificador por orden alfabético. De esta manera, podríamos redefinir los factores como etiquetas de texto que tienen asociado un código interno.
  Sexo<- factor(c('H','M','H','M'))
  Sexo
[1] H M H M
Levels: H M
Podemos cambiar tambien las cadenas de los niveles con el parámetro labels
  Sexo<- factor(Sexo, labels = c('Masculino','Femenino'))
  Sexo
[1] Masculino Femenino  Masculino Femenino 
Levels: Masculino Femenino
Para ver los levels de una variable factor utilizaremos la instrucción levels.
  levels(Sexo)
[1] "Masculino" "Femenino" 

Reordenar niveles

Si queremos reordenar los niveles del factor utilizaremos la instrucción relevel
  relevel(Sexo,2) #Le decimos que el 2o factor pase a la 1a posición.
[1] Masculino Femenino  Masculino Femenino 
Levels: Femenino Masculino

Dataframes

Column 1

Creación

Los data frames son una estructura de datos que generaliza a las matrices, en el sentido en que las columnas (variables a menudo) pueden ser de diferente tipo entre sí (no todas numéricas, por ejemplo). Sin embargo, todos los elementos de una misma columna deben ser del mismo tipo. Al igual que las filas y columnas de una matriz, todos los elementos de un data frame deben ser de la misma longitud. De este modo, pueden usarse funciones tales como dimnames, dim, nrow sobre un data frame comosi se tratara de una matriz. Los datos de un data frame pueden ser accedidos como elementos de una matriz o de una lista.

La creación de un dataframe puede ser manualmente o por la lectura de un archivo (normalmente)

#creamos un dataframe
df <- data.frame(Nombre=c("Pedro","Maria","Jose","Marta"), 
                 Edad=c(27,34,40,39), 
                 Poblacion=c("Mérida","Valladolid","Tizimín","Ticul"),
                 Sexo=c("H","M","H","M"),
                 Casado=c(F,T,T,F))
df
  Nombre Edad  Poblacion Sexo Casado
1  Pedro   27     Mérida    H  FALSE
2  Maria   34 Valladolid    M   TRUE
3   Jose   40    Tizimín    H   TRUE
4  Marta   39      Ticul    M  FALSE
Ajuste de tipo de datos de las variables del dataframe
  #Ajustar las variables a sus respectivos tipos
df$Nombre<- as.character(df$Nombre)
df$Poblacion<- as.character(df$Poblacion)
df$Casado<- factor(df$Casado)
df$Sexo<- factor(df$Sexo)

Acceder a los elementos

La forma de acceder a los elementos de un dataframe es como sigue

Forma elemental
  #Acceder a los elementos de un dataframe
df$Nombre
[1] "Pedro" "Maria" "Jose"  "Marta"
df$Casado[2]
[1] TRUE
Levels: FALSE TRUE
df$Nombre     #Obtenemos los nombres del dataframe
[1] "Pedro" "Maria" "Jose"  "Marta"
df$Nombre[2]  #Obtengo el segundo nombre esto es María
[1] "Maria"
df$Poblacion     # Obtengo las poblaciones del dataframe
[1] "Mérida"     "Valladolid" "Tizimín"    "Ticul"     
Edades<- df$Edad    #Asigno a la variable edades lo que contiene el dataframe en edad
Edades
[1] 27 34 40 39
Forma tipo matriz
  # tambien el dataframe puede ser visto como una matriz
col3<- df[,3]
col3
[1] "Mérida"     "Valladolid" "Tizimín"    "Ticul"     
fila2<- df[2,]
fila2
  Nombre Edad  Poblacion Sexo Casado
2  Maria   34 Valladolid    M   TRUE
sm<- df[4,4]
sm
[1] M
Levels: H M

Modificaciones

Las modificaciones a un dataframe son similares a una matriz, incluso se pueden utilizar los mismos métodos y funciones, aqui algunos ejemplos.

Agregar una fila al dataframe
  #conociendo el valor del siguiente
df[5,]<- c('Eduardo',35,'Merida','H',T)

#no es necesario darle el numero del siguiente
df<- rbind(df,c('Pablo',39,'Merida','H',F))
Agregar columnas a un dataframe
  #agregar columnas
df$codigopostal<- c('97144','97173','97143','97173','97143','97144')
df$tipo.sangre<- factor(c('A','B+','A','O+','O-','O+'))
df
   Nombre Edad  Poblacion Sexo Casado codigopostal tipo.sangre
1   Pedro   27     Mérida    H  FALSE        97144           A
2   Maria   34 Valladolid    M   TRUE        97173          B+
3    Jose   40    Tizimín    H   TRUE        97143           A
4   Marta   39      Ticul    M  FALSE        97173          O+
5 Eduardo   35     Merida    H   TRUE        97143          O-
6   Pablo   39     Merida    H  FALSE        97144          O+
Cambiar valores en un dataframe
df$Nombre[4]<- "Martha"
df$Edad[4]<- 49
df
   Nombre Edad  Poblacion Sexo Casado codigopostal tipo.sangre
1   Pedro   27     Mérida    H  FALSE        97144           A
2   Maria   34 Valladolid    M   TRUE        97173          B+
3    Jose   40    Tizimín    H   TRUE        97143           A
4  Martha   49      Ticul    M  FALSE        97173          O+
5 Eduardo   35     Merida    H   TRUE        97143          O-
6   Pablo   39     Merida    H  FALSE        97144          O+
Borrar una fila o columna completa
  #Borrar una fila de un dataframe
  df<- df[-3,]
  #Borrar una columna del dataframe
  df<- df[,-5]
  df
   Nombre Edad  Poblacion Sexo codigopostal tipo.sangre
1   Pedro   27     Mérida    H        97144           A
2   Maria   34 Valladolid    M        97173          B+
4  Martha   49      Ticul    M        97173          O+
5 Eduardo   35     Merida    H        97143          O-
6   Pablo   39     Merida    H        97144          O+

Adjuntar

A veces puede ser engorroso trabajar con data frames, debido a que para acceder a las variables hemos de escribir el nombre del data frame seguido del simbolo de peso y del nombre de la variable. R nos permite hacer visible el contenido de un data frame o de una lista, de manera que no hemos de escribir su nombre cada vez que queremos acceder a una de sus variables. Esto lo hacemos con la instrucción attach. Para volver a hacer "invisible" el data frame utilizaremos detach.

  attach(df)
  Nombre
[1] "Pedro"   "Maria"   "Martha"  "Eduardo" "Pablo"  
  detach(df)

Listas

Column 1

Creación

Una lista es un objeto que consiste en una colección ordenada de objetos, llamados componentes. Estos componentes no tienen que ser necesariamente del mismo tipo, pueden ser vectores, matrices, factores o inclusive una lista.
Las listas sirven para concatenar objetos donde cada uno puede tener una estructura distinta.
Una lista tiene una serie de componentes, a los que deberemos asignar un nombre.
Muchas funciones devuelven como resultado una lista de objetos.

  #creamos la lista
lst <- list(padre="Juan", madre="Maria", num.hijos=3,
            edad.hijos=c(4,7,9), nombre.hijos=c('Luis','Carlos','Eva'),
            ciudad='Mérida')
lst
$padre
[1] "Juan"

$madre
[1] "Maria"

$num.hijos
[1] 3

$edad.hijos
[1] 4 7 9

$nombre.hijos
[1] "Luis"   "Carlos" "Eva"   

$ciudad
[1] "Mérida"

Acceso a los valores

Los elementos de una lista siempre estan siempre numerados, y pueden ser accedidos mediante esos números. En este caso los elementos de la lista se indexan mediante dobles corchetes ([[]]). Si lst[[4]] es un vector, entonces lst[[4]][1] es su primer elemento. Los componentes de las listas también pueden tener nombres. En este caso, también nos podremos referir a ellos por su nombre además por su posición, ayudados del símbolo de peso. Esto es útil para no tener que recordar en qué posición está cada componente de la lista.

   #llamar a los valores de la lista
   lst[[2]]
[1] "Maria"
   lst[[4]]
[1] 4 7 9
   #Otra forma para llamarlos
   lst$edad.hijos  # Como un dataframe por medio del simbolo de pesos
[1] 4 7 9
   lst[[5]][3]     # Numericamente por medio de los doble corchete (indicando variable) y corchete solo(indicando valor)
[1] "Eva"
   lst$nombre.hijos[3]  #Mezclando ambos
[1] "Eva"

Importante: Hay que distinguir entre lst[1] y lst[[1]]. El primer comando devuelve una sublista. Mientras que el segundo devuelve el primer componente de la lista.

Longitud.
La función length, aplicada a una lista, devuelve el número de componentes "de primer nivel" que contiene.
  #la longitud de la lista
  length(lst)
[1] 6
  #Longitud de los nombres de los hijos
  length(lst$nombre.hijos)
[1] 3

Modificaciones

Entre las modificaciones a la lista pueden ser agregar, cambiar y borrar.

1. Agregar una variable
  #Agregar un nuevo elemento de la lista (si conozco el total de la lista agrego el siguiente)
  lst[[7]] <- c("Juan", "Pedro", "Ana",'Roberto')
  names(lst)[7] <- "nombre.primos"

  #otra forma de hacerlo (sin necesidad de saber cuantas variables tiene la lista)
  lst$nietos <- c("Pepe", "Pablo", "Juanita")
  lst
$padre
[1] "Juan"

$madre
[1] "Maria"

$num.hijos
[1] 3

$edad.hijos
[1] 4 7 9

$nombre.hijos
[1] "Luis"   "Carlos" "Eva"   

$ciudad
[1] "Mérida"

$nombre.primos
[1] "Juan"    "Pedro"   "Ana"     "Roberto"

$nietos
[1] "Pepe"    "Pablo"   "Juanita"
2. Cambiar o actualizar
  #Cambiar el tercer nombre del vector de nombres
  lst$nombre.hijos[3]<- 'Sofia'
  lst[[5]][3]<- 'sofia'
  lst
$padre
[1] "Juan"

$madre
[1] "Maria"

$num.hijos
[1] 3

$edad.hijos
[1] 4 7 9

$nombre.hijos
[1] "Luis"   "Carlos" "sofia" 

$ciudad
[1] "Mérida"

$nombre.primos
[1] "Juan"    "Pedro"   "Ana"     "Roberto"

$nietos
[1] "Pepe"    "Pablo"   "Juanita"
3. Borrar
  #borramos toda la variable de la lista
  lst$num.hijos<- NULL

  #Borramos al tercer nieto
  lst$nietos<- lst$nietos[-3]
  lst
$padre
[1] "Juan"

$madre
[1] "Maria"

$edad.hijos
[1] 4 7 9

$nombre.hijos
[1] "Luis"   "Carlos" "sofia" 

$ciudad
[1] "Mérida"

$nombre.primos
[1] "Juan"    "Pedro"   "Ana"     "Roberto"

$nietos
[1] "Pepe"  "Pablo"

Union

En las listas, por su estructura es muy fácil unirlas, porque se agregan como variables adicionales y no como filas de una matriz como seria en el caso de las matrices o dataframes.

  #creamos otra lista
lst2<- list('UNAM','R',20)
names(lst2)<- c('Escuela','Materia','alumnos')

#concatenamos listas
lst3<- c(lst,lst2)

lst3
$padre
[1] "Juan"

$madre
[1] "Maria"

$edad.hijos
[1] 4 7 9

$nombre.hijos
[1] "Luis"   "Carlos" "sofia" 

$ciudad
[1] "Mérida"

$nombre.primos
[1] "Juan"    "Pedro"   "Ana"     "Roberto"

$nietos
[1] "Pepe"  "Pablo"

$Escuela
[1] "UNAM"

$Materia
[1] "R"

$alumnos
[1] 20

Tablas

Column 1

Creación

Las tablas son una extensión de las matrices en R con la particularidad de que estas pueden generar resultados de manera rápida y óptima de sus marginales y proporciones de sus filas o columnas.

   library(ISwR) 
   data(juul)
   head(juul)
   age menarche sex igf1 tanner testvol
1   NA       NA  NA   90     NA      NA
2   NA       NA  NA   88     NA      NA
3   NA       NA  NA  164     NA      NA
4   NA       NA  NA  166     NA      NA
5   NA       NA  NA  131     NA      NA
6 0.17       NA   1  101      1      NA
   summary(juul)
      age            menarche          sex             igf1      
 Min.   : 0.170   Min.   :1.000   Min.   :1.000   Min.   : 25.0  
 1st Qu.: 9.053   1st Qu.:1.000   1st Qu.:1.000   1st Qu.:202.2  
 Median :12.560   Median :1.000   Median :2.000   Median :313.5  
 Mean   :15.095   Mean   :1.476   Mean   :1.534   Mean   :340.2  
 3rd Qu.:16.855   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:462.8  
 Max.   :83.000   Max.   :2.000   Max.   :2.000   Max.   :915.0  
 NA's   :5        NA's   :635     NA's   :5       NA's   :321    
     tanner        testvol      
 Min.   :1.00   Min.   : 1.000  
 1st Qu.:1.00   1st Qu.: 1.000  
 Median :2.00   Median : 3.000  
 Mean   :2.64   Mean   : 7.896  
 3rd Qu.:5.00   3rd Qu.:15.000  
 Max.   :5.00   Max.   :30.000  
 NA's   :240    NA's   :859     
Generamos los factores
  juul$sex<-factor(juul$sex,labels=c("M","F"))
  juul$menarche<-factor(juul$menarche,labels=c("No","Yes"))
  juul$tanner<- factor(juul$tanner,labels=c("I","II","III","IV","V"))
  summary(juul)
      age         menarche     sex           igf1        tanner   
 Min.   : 0.170   No  :369   M   :621   Min.   : 25.0   I   :515  
 1st Qu.: 9.053   Yes :335   F   :713   1st Qu.:202.2   II  :103  
 Median :12.560   NA's:635   NA's:  5   Median :313.5   III : 72  
 Mean   :15.095                         Mean   :340.2   IV  : 81  
 3rd Qu.:16.855                         3rd Qu.:462.8   V   :328  
 Max.   :83.000                         Max.   :915.0   NA's:240  
 NA's   :5                              NA's   :321               
    testvol      
 Min.   : 1.000  
 1st Qu.: 1.000  
 Median : 3.000  
 Mean   : 7.896  
 3rd Qu.:15.000  
 Max.   :30.000  
 NA's   :859     
Generamos la tabla
  table.men<- table(juul$sex,juul$menarche)
  table.men
   
     No Yes
  M   0   0
  F 369 335
  table.tan<- table(juul$sex,juul$tanner)
  table.tan
   
      I  II III  IV   V
  M 291  55  34  41 124
  F 224  48  38  40 204

Cálculo de marginales

La base fundamental de las tablas es la obtensión de sus marginales

  #marginales por fila
  margin.table(table.men,1)

  M   F 
  0 704 
  #marginales por columnas
  margin.table(table.men,2)

 No Yes 
369 335 
  #marginales por fila
  margin.table(table.tan,1)

  M   F 
545 554 
  #marginales por columnas
  margin.table(table.tan,2)

  I  II III  IV   V 
515 103  72  81 328 

Cálculo de proporciones

Otra parte importante de las tablas es el cálculo de sus proporciones

  #por filas las proporciones
  pt1<- prop.table(table.men,1)*100
  pt1
   
          No      Yes
  M                  
  F 52.41477 47.58523
  #Comprobación
  margin.table(pt1,1)

  M   F 
    100 
  #por columnas las proporciones
  pt2<- prop.table(table.men,2)*100
  pt2
   
     No Yes
  M   0   0
  F 100 100
  #Comprobación
  margin.table(pt2,2)

 No Yes 
100 100 

Otras operaciones

Tambien se pueden realizar otras operaciones como esta:

  #otras operaciones (division de cada uno entre la suma total)
  table.tan
   
      I  II III  IV   V
  M 291  55  34  41 124
  F 224  48  38  40 204
  (table.tan/sum(table.tan))*100
   
            I        II       III        IV         V
  M 26.478617  5.004550  3.093722  3.730664 11.282985
  F 20.382166  4.367607  3.457689  3.639672 18.562329

Manejo de archivos

Antes de comenzar a ver la forma de leer o escribir archivos es importante conocer como R realiza el manejo de sus archivos ya que puede ser muy útil para ustedes.

Listar un conjunto de archivos de un directorio

  Lista.Archivos<- list.files('ArchivosParaLeer/',full.names=T, patter='*.csv')
  Lista.Archivos
[1] "ArchivosParaLeer//experimentalcsv.csv"
[2] "ArchivosParaLeer//Resultcsv.csv"      
[3] "ArchivosParaLeer//routes.csv"         

Donde:
Primer parámetro: Es la ruta del directorio a leer los archivos.
Segundo parámetro: Es verdadero si quieres la ruta completa con su nombre del archivo o falso si solo quieres ver solo nombre del archivo.
Tercer parámetro: Es el patron de archivos a buscar en este caso le estamos diciendo que solo queremos archivos .csv

Elegir por medio de la interfaz un determinado archivo o directorio

  #Archivo<- file.choose()  # Funciona para mac y windows
  
  # En windows existe otro llamado
  #Archivo<- choose.files()
  #Directorio<- choose.dir()

Crear un directorio

   dir.create('ArchivosParaLeer/Prueba')

Donde: Primer parámetro: Es la ruta donde se va a crear el directorio

Copiar un archivo

  file.copy('ArchivosParaleer/Grillos.txt','ArchivosParaleer/Prueba/')
[1] TRUE

Donde:
Primer parámetro: Ruta donde se encuentra el archivo a copiar.
Segundo parámetro: Ruta donde se va a copiar el archivo

Saber si un directorio o un archivo existe

   dir.exists('ArchivosParaleer/Prueba/')             # Para saber si existe un directorio
[1] TRUE
   file.exists('ArchivosParaleer/Prueba/Grillos.txt') # Para saber si existe un archivo
[1] TRUE

Donde:
Parámetro: Ruta donde se encuentra el archivo o directorio a borrar.

Borrar un archivo o un directorio

  unlink('ArchivosParaleer/Prueba/Grillos.txt') # De esta forma solo borra el archivo indicado.

  unlink('ArchivosParaleer/Prueba/', recursive = T) #Al agregar recursive=T le estamos diciendo que borre todo el directorio incluyendo lo de adentro.

Donde:
Primer parámetro: Ruta donde se encuentra el archivo o directorio a borrar.

Borrar una variable en memoria o todas las variables

  rm(Lista.Archivos) #Borra la variable Lista.Archivos
  rm(list=ls())  #Borra todo el workspace

Excel

Lectura/Escritura de archivos .xlsx (Excel)

Nota importante: Tener instalado el java(jdk) ya que todas las librerias que leen y escriben archivos de Excel lo requieren para trabajar.

Es importante que los que usan mac tengan que agregar a su codigo la siguiente linea
   dyn.load('/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/server/libjvm.dylib')  # los numero .8.0.131 es la versión de jdk de java por lo que dependiendo de la versión que tengan es el número que deben poner alli.

Esto es debido a que la mac dejo de integrar en sus maquinas la direccion de java y debemos ponerselo manualmente. Esta linea va antes de ejecutar las librerias. Para el caso de windows omitir esta línea.

Existen varias librerias que son útiles para leer y escribir archivos de excel entre ellos estan:

Primera forma

Leer/Cargar
  library(XLConnect)
  Datosxlsx1<- readWorksheetFromFile('ArchivosParaLeer/experimental.xlsx',1)
  Datosxlsx1$Acido<- as.factor(Datosxlsx1$Acido)

Donde:
Primer parámetro: Es el nombre o ruta del archivo a leer.
Segundo parámetro: Es el número de hoja del excel a leer.

Escribir/Guardar
  writeWorksheetToFile('ArchivosParaLeer/Resultxlsx.xlsx',Datosxlsx1,'Muestreo-1')

Donde:
Primer parámetro: Es el nombre o ruta del archivo donde se va a guardar.
Segundo parámetro: Son los datos a guardar.
Tercer parámetro: Es el nombre de la hoja, puedes omitirlo si no quieres ponerle un nombre.

Segunda forma

Leer/Cargar
   library(xlsx)
   Datosxlsx2<- read.xlsx('ArchivosParaLeer/experimental.xlsx',1,header=T)
   Datosxlsx2<- Datosxlsx2[,-7]

Donde:
Primer parámetro: Es el nombre o ruta del archivo a leer.
Segundo parámetro: Es el número de hoja del excel a leer.
Tercer parámetro: Es si la hoja tiene encabezado (nombre de las columnas)

Escribir/Guardar
   write.xlsx(Datosxlsx2,'ArchivosParaLeer/Resultxlsx2.xlsx','1')

Donde:
Primer parámetro: Son los datos a guardar.
Segundo parámetro: Es el nombre o ruta del archivo donde se va a guardar.
Tercer parámetro: Es el nombre de la hoja, puedes omitirlo si no quieres ponerle un nombre.

Tercera forma

Leer/Cargar
  library(readxl)
  Datosxlsx3<- read_excel('ArchivosParaLeer/experimental.xlsx',1)
  Datosxlsx3$Acido<- as.factor(Datosxlsx3$Acido)

Donde:
Primer parámetro: Es el nombre o ruta del archivo a leer.
Segundo parámetro: Es el número de hoja del excel a leer.

Escribir/Guardar

Nota: Esta libreria solo lee un archivo excel y no puede guardarlo

CSV

Column1

Lectura/Escritura de archivos .csv (Archivo separado por comas)

La lectura y escritura de los archivos .csv en R no necesita de alguna libreria extra por lo que es más fácil de cargar que los archivos de Excel.

Tip: Para evitar lo complicado que es leer los archivos Excel, recomiendo guardarlo como .csv y la lectura es mucho más ágil y fácil

Leer/Cargar
   Datoscsv<- read.csv('ArchivosParaLeer/experimentalcsv.csv',header=T)

Donde:
Primer parámetro: Nombre o ruta del archivo a leer.
Segundo parámetro: Si es TRUE, toma la primera fila como nombre de las variables.

Escribir/Guardar
   write.csv(Datoscsv,'ArchivosParaLeer/Resultcsv.csv',row.names = F)

Donde:
Primer parámetro: Datos a guardar.
Segundo parámetro: Nombre o ruta del archivo como se guardará.
Tercer parámetro: Si es FALSE, evita poner una columna de numeros consecutivo como nombre de las filas

Texto

Column1

Lectura/Escritura de archivos .txt (Texto)

Al igual que la lectura y escritura en .csv los archivos de texto en R no necesitan de librerias extras, la forma de hacerlo es la siguiente:

Leer/Cargar
  # archivo<- file.choose() #para evitarse escribir la dirección pueden utilizar esta función
  # Datostxt<- read.table(archivo,header=T)
   Datostxt<- read.table('ArchivosParaLeer/Grillos2.txt',header=T) # En caso de no tener el nombre de la columna poner el header=F

Donde:
Primer parámetro: Nombre o ruta del archivo a leer.
Segundo parámetro: Si es TRUE, toma la primera fila como nombre de las variables.

Escribir/Guardar
  write.table(Datostxt,'ArchivosParaLeer/Resultxt.txt',row.names = F)

Donde:
Primer parámetro: Datos a guardar.
Segundo parámetro: Nombre o ruta del archivo como se guardará.
Tercer parámetro: Si es FALSE, evita poner una columna de numeros consecutivo como nombre de las filas

Rdata

Column1

Lectura/Escritura de archivos .Rdata (Archivo propio de R)

Estos son los archivos propios de R que a lo mejor no lo utilicen en el curso pero que puede servir cuando tengamos un resultado que nos llevo mucho tiempo obtenerlo y no queremos volver a correrlo.

Leer/Cargar
   load('ArchivosParaLeer/Datos.Rdata')

Donde:
Primer parámetro: Es el nombre o ruta del archivo a cargar en R.

Escribir/Guardar
  save(Datosxlsx1,file='ArchivosParaLeer/Datos.Rdata')

Donde:
Primer parámetro: Datos a guardar.
Segundo parámetro: Nombre del archivo o ruta donde se guardaran los datos

Base de datos precargados en R

Existen muchas bases de datos que ya estan precargados en R o incluyendo alguna libreria se agregan a R. La forma de cargarlos a nuestro entorno de trabajo o workspace como un dataframe es mediante la función data(Nombre_base_Datos).

  data(cars)
  summary(cars)
     speed           dist       
 Min.   : 4.0   Min.   :  2.00  
 1st Qu.:12.0   1st Qu.: 26.00  
 Median :15.0   Median : 36.00  
 Mean   :15.4   Mean   : 42.98  
 3rd Qu.:19.0   3rd Qu.: 56.00  
 Max.   :25.0   Max.   :120.00  
  data(iris)
  summary(iris)
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
 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  
       Species  
 setosa    :50  
 versicolor:50  
 virginica :50  
                
                
                

Principales conceptos

Existen tres tipos de gráficas en R:

La función principal plot

La función básica para traficar en alto nivel es plot (x,y,type, ….)

donde: x: valores del eje x y: valores del eje y type: controla el tipo de gráfico. Los principales son: "p": puntos (por defecto) "l": líneas "b": puntos y líneas "h": histograma "s": escalones "n": no dibuja nada xlab, ylab: etiquetas de los ejes. xlim, ylim: modifica los límites de los ejes main: título del gráfico (parte superior de la ventana). sub: subtítulo del gráfico (parte inferior de la ventana). log: pone los ejes en escala logarítmica: "x", "y", "xy". axes: para activar/suprimir el dibujo de los ejes (activo por defecto). Adj.- Controla la justificación del texto con respecto al borde izquierdo. 0 corresponde a justificado a la izquierda, 0.5 a centrado, 1 a justificado a la derecha y valores mayores a 1 mueven el texto más a la izquierda. Si se dan dos valores, por ejemplo c(0,1), el segundo controla la justificación vertical.

Existen varios formatos para guardar una gráfica estos son: * png * bmp * jpeg * pdf

  png("Prueba_de_guardado.png",520,680) # Primero es el nombre o ruta y luego las dimensiones del gráfico, estos dos ultimos puedes omitirlo y te lo guarda con los valores por default
plot(1:10,type="p",main="Gráfica",sub="para guardar",xlab="Etiqueta eje x",ylab="Etiqueta eje y",xlim=c(1,10))
dev.off()
pdf 
  2 

Gráficas básicas de R

column

Gráfica general

Esta es una gráfica general con ciertos parámetros

a <- rnorm(10)
plot(a,type="p",main="Título (tipo p)",sub="Subtítulo",xlab="Etiqueta eje x",ylab="Etiqueta eje y",xlim=c(1,10))

Gráfica de barras

Esta es una gráfica de barras con barras juntas

m <- matrix(1:10,2,5,byrow=T)
barplot(m,horiz=F,beside=TRUE, col=c("blue","gray"))

Histrograma

Esta es una grafica de histograma con división de breaks y en terminos de probabilidad

a <- rnorm(1000)
hist(a,col="blue",border="white",prob=TRUE,breaks=25)
lines(density(a),col="orange",lwd=3)

Boxplot

d <- data.frame(norm=rnorm(10),unif=runif(10), expo=rexp(10))
boxplot(d,col="lightgray")

Pay

pie(c(5,3,14,7,9,24),labels=paste("Grupo",1:6),main="Pie chart")

Por pares

La gráfica por pares se realiza mediante un dataframe de los datos.

 m <- cbind(norm=rnorm(10),unif=runif(10), exp=rexp(10), beta=rbeta(10,shape1=1,shape2=2), gam=rgamma(10,2))
pairs(m)

Bajo nivel

Las gráficas de bajo nivel se agregan a una gráfica de alto nivel como muestra el siguiente ejemplo

plot(1:10,1:10,axes=FALSE,xlab="",ylab="")
points(runif(5,1,10),runif(5,1,10),cex=1.5,col="red")
points(runif(5,1,10),runif(5,1,10),pch="+",cex=1.7,col="green")
lines(1:10,runif(10,1,10),lty=2,lwd=2)
text(runif(5,1,10),runif(5,1,10),labels=c("uno","dos","tres","cuatro","cinco"),cex=1.7,col=rainbow(5))
abline(h=5,lty=4)
polygon(runif(4,1,10),runif(4,1,10),col="blue")
title("Gráfico inventado")
axis(1,labels=c("uno","tres","cinco","siete","nueve"),at=seq(1,10,by=2))
axis(2,labels=1:10,at=1:10)
legend(8,2.3,lty=c(1:3),col=rainbow(3),legend=c("uno","dos","tres"))

ggplot2

ggplot2 es una libreria especializada en gráficas, donde estas gráficas son mas vistosas, dinámicas y de una forma peculiar de realizarlas.

La estructura principal de ggplot es un dataframe (datos), una estética (nombre de los ejes, titulo) y una geometria (lineas, puntos, histogramas etc.)

column

Gráfica de puntos

  library(ggplot2)
  ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width)) +
  geom_point(
    color='red', # el color de los puntos
    fill='red', # es la agrupación
    shape=3, # es la forma
    alpha=0.5, # es la opacidad o brillo
    size=4, # es el tamaño del punto
    stroke=2) #es el trazado

Gráficas agrupadas

 ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width, color=Species, shape=Species)) +
  geom_point(size=4, alpha=0.6)

Gráfica de barras

  ggplot(mtcars, aes(x=as.factor(cyl))) + geom_bar()

Boxplots

ggplot(iris, aes(x=Species, y=Sepal.Width, fill=Species)) +
  geom_boxplot(alpha=0.4) +
  geom_point() +
  stat_summary(fun.y=mean, geom="point", shape=20, size=10, color="red", fill="red") +
  theme(legend.position="none") +
  scale_fill_brewer(palette="Set3")

Regresión

data=data.frame(cond = rep(c("condition_1", "condition_2"), each=10), my_x = 1:100 + rnorm(100,sd=9), my_y = 1:100 + rnorm(100,sd=16))
  ggplot(data, aes(x=my_x, y=my_y)) +    geom_point(shape=1) +  geom_smooth(method=lm , color="red", se=TRUE)  # Add linear regression line

Faceting

specie=c(rep("sorgho" , 3) , rep("poacee" , 3) , rep("banana" , 3) , rep("triticum" , 3) )
condition=rep(c("normal" , "stress" , "Nitrogen") , 4)
value=abs(rnorm(12 , 0 , 15))
data=data.frame(specie,condition,value)
  ggplot(data, aes(y=value, x=specie, color=specie, fill=specie)) +
  geom_bar( stat="identity") +
  facet_wrap(~condition)

Programación

column 1

Estructuras condicionales

R dispone de una expresión condicional llamada if, que se construye de la forma:

if (expr_1 &/|[expr_2] …)
{
sentencias que se ejecutan si se cumple la condición
}else{
sentencias que se ejecutan si no se cumple la condición
}

Nota importante: Los operadores && (and) y || (or) son habitualmente utilizados en las expresiones condicionales. Ademas que la expresión if puede incluir otros if a esto se le llama anidación.

R dispone de otra expresión condicional llamada switch, que se construye de la forma:

switch (expr, sentencia1,sentencia2, …)

Donde: expr, debe tener como resultado un valor numérico o cadena. Cuando expr es numérico acude al equivalente numero comenzando con la sentencia1, si es cadena compara con los siguientes quien tiene esa cadena y acude directamente a el).

Ejemplos

if
    a <- 5
    if (a < 10)
    {
       b<-a+3
    }else{
       b<-a-3
    }
    b
[1] 8
if anidado
  #Dado dos números determinar el mayor o igual
  a<- 3
  b<- 6
  if (a<b)
  {
      paste(b,' es mayor a ',a, sep='')
  }else{
    if (a>b)
    {
       paste(a,' es mayor a ',b, sep='')
    }else{
      paste(b,' es igual a ',a, sep='')
    }
  }
[1] "6 es mayor a 3"
switch numérico
  tipo<- 3
  switch(tipo, a<- 3, a<- 2, a<- 1) # si es numerico
  a
[1] 1
swith cadena
   fun<- "media"
   switch(fun, media={a<- 1:10;mean(a)}, mediana={a<- 1:10; median(a)}) #Si es cadena
[1] 5.5

Estructuras de repetición o ciclos

A menudo es necesario repetir la ejecución de un mismo grupo de instrucciones (p. ej. para cada elemento de un vector, un número determinado de veces o mientras se cumpla una determinada condición).

R nos ofrece tres alternativas:

El ciclo for

for (variable in inicia:incrementa:termina)
{
sentencias
}

El ciclo while

while (condición)
{
sentencias que se ejecutan si la condición es verdadera
}

El ciclo repeat

repeat (condicion)
{
sentencias que se ejecutan hasta que lo interrumpamos con una sentencia break
}

Nota importante: La sentencia break se puede utilizar en cualquier ciclo y significa que interrumpe el ciclo (o se sale) cuando se ejecuta. Asi como las estructuras condicionales tambien en los ciclos existe la anidación.

Ejemplos

Ciclo For
  # Dado un cierto numéro determinar los numeros pares e impares de la sucesión
  n<-10 # Se inicializa n
  pares<-c() # Se crea un vector vacío
  impares<-c() # Idem
  for(i in 1:n)
  { # Se van a procesar los números de 1 a n
     if(i%%2==0)   # Si al dividir por 2 sale 0
       pares<-c(pares,i)
      else # el numero es par, impar en otro caso
       impares<-c(impares,i)
  }
  pares
[1]  2  4  6  8 10
  impares
[1] 1 3 5 7 9
Ciclo while
   # Dado un cierto numéro determinar los numeros pares e impares de la sucesión
  n<-10 # Se inicializa n
  pares<-c() # Se crea un vector vacío para colocar los números pares
  impares<-c() # se crea un vector vacío para colocar los números impares
  # Se van a procesar los números de 1 a n
  i=1
  while (i<=10)
  {
    if(i%%2==0)
    {# Si al dividir por 2 sale 0
       pares<-c(pares,i)
     }else{ # el numero es par, impar en otro caso
       impares<-c(impares,i)
     }
     i=i+1# importante hacer el incremento porque sino el programa nunca saldria del ciclo
  }
  pares
[1]  2  4  6  8 10
  impares
[1] 1 3 5 7 9
Ciclo repeat
     # Dado un cierto numéro determinar los numeros pares e impares de la sucesión
  n<-10 # Se inicializa n
  pares<-c() # Se crea un vector vacío para colocar los números pares
  impares<-c() # se crea un vector vacío para colocar los números impares
  # Se van a procesar los números de 1 a n
  i=1
  repeat
  {
    if (i<=10)
    {
        if(i%%2==0)
        {# Si al dividir por 2 sale 0
           pares<-c(pares,i)
        }else{ # el numero es par, impar en otro caso
           impares<-c(impares,i)
        }
         i=i+1  # importante hacer el incremento porque sino el programa nunca saldria del ciclo
    }else
      break
  }
  pares
[1]  2  4  6  8 10
  impares
[1] 1 3 5 7 9

Funciones

Hasta ahora hemos visto el lenguaje R como un conjunto de expresiones "sueltas". Ahora bien, muchas veces nos interesará agrupar bajo un determinado nombre y parametrizarlas. Uno de los tipos de objetos que R permite crear son las funciones. Mediante la creación de funciones, el lenguaje gana enormemente en versatilidad, conveniencia y elegancia. Así, aprender a escribir funciones útiles es una de las principales maneras de hacer del uso de R algo confortable y productivo. Como en la mayoría de los otros lenguajes de programación, las asignaciones dentro de funciones son temporales y se pierden cuando acaba su ejecución.

Las funciones se definen o se crean siguiendo el siguiente patrón:

nombre_funcion<- function(arg_1, arg_2, ..., arg_n)
{
sentencias
}

sentencias suelen ser expresiones que usa los argumentos arg_i para un valor.

Las llamadas a funciones suelen tener el siguiente aspecto:

nombre_funcion(arg_1, arg_2, ..., arg_n)

Ejemplo

#Hacer una función que resuelva la ecuación de segundo grado dado sus tres parámetros.
# ax^2+bx+c=0

# Cabecera de la función: le damos un nombre y definimos los tres parámetros
# Como vamos a utilizar más de una instrucción para programar la función,  añadimos las llaves para determinar el inicio y fin de la función.
 ec_grado2 <- function(a, b, c)
{
    # Calculamos el discriminante (b^2 – 4ac)
    disc <- (b^2)-(4*a*c)
    # Primera solución
    sol1 <- (-b + sqrt(disc))/(2*a)
    # Segunda solución
    sol2 <- (-b - sqrt(disc))/(2*a)
    # Devolvemos un vector con las dos soluciones y cerramos la llave para indicar el final del grupo de
    # instrucciones que forman la función
    s<- c(sol1,sol2)
    return(s)
 }

# Una vez hecha la función debemos correrla y luego poderla llamar con el nombre de la función y nos devolvera el resultado.
ec_grado2(1,2,0)
[1]  0 -2