Ventajas
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
Es una interfaz de usuario muy amigable utilizado para trabajar con R con la ventaja que se encuentra en las 3 plataformas.
x<- 5 # Entero
y<- 5.0 # Flotante
z<- 3.141516786654 #double
x
[1] 5
y
[1] 5
z
[1] 3.141517
bol1<- TRUE
bol2<- T
bol3<- FALSE
bol4<- F
bol1
[1] TRUE
bol2
[1] TRUE
bol3
[1] FALSE
bol4
[1] FALSE
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"
df1<- NA
df2<- NaN
df1
[1] NA
df2
[1] NaN
Comenzando con R
R distingue entre mayusculas y minúsculas A<- 3
a<- 2
A<- 3.141516 #Este es el valor de pi
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
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
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
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
Hay tres maneras para la extracción de elementos en un vector:
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.
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
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
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.
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.
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.
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.
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"
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.
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
Existen dos formas de acceder a los elementos de una matriz, estas son:
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
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"
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
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 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
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
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
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
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"
relevel(Sexo,2) #Le decimos que el 2o factor pase a la 1a posición.
[1] Masculino Femenino Masculino Femenino
Levels: Femenino Masculino
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)
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
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
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+
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)
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"
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.
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
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"
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
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
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
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
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
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
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.
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)
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
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.
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
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.
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
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.
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
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
Existen tres tipos de gráficas en R:
Bajo nivel: añaden más información al gráfico de alto nivel como son puntos, lineas, leyendas etc. Ejemplos: line, points, abline, etc.
Interactivos. permiten añadir o extraer información del gráfico de manera interactiva, usando un dispositivo apuntador como podría ser el ratón. Ejemplos: locator, identify
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
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))
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"))
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)
d <- data.frame(norm=rnorm(10),unif=runif(10), expo=rexp(10))
boxplot(d,col="lightgray")
pie(c(5,3,14,7,9,24),labels=paste("Grupo",1:6),main="Pie chart")
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)
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 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.)
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
ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width, color=Species, shape=Species)) +
geom_point(size=4, alpha=0.6)
ggplot(mtcars, aes(x=as.factor(cyl))) + geom_bar()
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")
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
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)
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
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
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