0% encontró este documento útil (0 votos)
46 vistas25 páginas

Tutorial R: Comentarios, Vectores y Matrices

Este documento presenta tres oraciones sobre el uso de código y comentarios en R: 1) Explica cómo los comentarios en R comienzan con el caracter '#' y cómo se asigna un valor a una variable llamada 'x'; 2) Describe cómo se imprime el valor de 'x' de manera explícita e implícita; 3) Muestra cómo realizar una multiplicación de 'x' por 2 y nota que los resultados de las operaciones aparecen como comentarios con una tipografía diferente.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
46 vistas25 páginas

Tutorial R: Comentarios, Vectores y Matrices

Este documento presenta tres oraciones sobre el uso de código y comentarios en R: 1) Explica cómo los comentarios en R comienzan con el caracter '#' y cómo se asigna un valor a una variable llamada 'x'; 2) Describe cómo se imprime el valor de 'x' de manera explícita e implícita; 3) Muestra cómo realizar una multiplicación de 'x' por 2 y nota que los resultados de las operaciones aparecen como comentarios con una tipografía diferente.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

FULTON

#1.3. Formato del código en el texto

# Este es un comentario; en R los comentarios empiezam


# a partir del caracter ‘#’.
#----------------
# En seguida asignaremos mediante codigos de R al valor 2014 a una
# variable llamada ‘x’:
x<- 2014
#Ahora se imprimirá el valor de la variable dos veces, la primera
#vez se hará de manera explíta por medio de la funcion print() ,
#como sigue:
print(x)
##[1]
# … en seguida se imprimirá de manera implícita, simplemente
#’tecleándola’ en la consola
x
##[1] 2014
# Finalmente haremos una multiplicacion de x por 2
2*x
## [1] 4028
#Notemos que las impresiones o resultados de estas operaciones
# apracecen como comentarios, pero iniciados con ‘##’y con
# una tipografia diferente que los comentarios usuales.

#1.5. Ayuda en R

#Una forma abreviada sería


?lm #-- comentario
help(“[[“)
help(‘if’)
[Link](“split”)
# 0 abreviadamente
??”split”

#Los datos numéricos


x<- 2 # se asigna el valor de 2 a x
print(x) # se imprime el valor de x
## [1] “numeric”
x<-6/2 # Se asignará el valor de la operación 6/2 a x
print (x)
##[1] 3
class(x)
## [1] “numeric”
x<- 23L; print(x)
## [1] 23
class(x)
## [1] “integer”
x<- [Link](6/2); print(x)
## [1] 3
class(x)
## [1] “integer”

x<- 21 + 2i
y<- 2i + 21 # El mismo valor de x
z<- -1+0i #corresponde a -1
tt<- sqrt(z) #raiz cuadrada de -1

## [1] 21 + 2i
## [1] 21 + 2i
## [1] -1 + 0i
## [1] 0+1i

class(tt)
## [1] “complex”

x<- 1/0 # División para 0


x

## [1] Inf
#Tambien dividir un numero por Inf da cero:
y<- 1/inf
y
##[1] 0

x<-0/0
x
## [1] NaN

KELLY
# 2.2 Vectores
x<-2 #se ha asigando el valor 2 a la x
print(x) #se imprime el valor de x
-----------------------------------------------------------
#2.2.1 El uso de la función c() para crear verctores
c(4,2,-8) #Creación de un vector sin asignarlo a una variable
##Distintas formas de asignar un vector a una variable
u <-c(4,2,-8) #Usando el operador <-
c(4,2,-8) -> v #Usando el operador ->
#Usando la función assign:
assign("w",c(4,2,-8))
p = c(4,2,-8) #Usando el operador =
print(u);print(v);print(w);print(p)
-----------------------------------------------------------
#2.2.2 Creación de vectores a partir de archivos de texto-la función scan()
vec<-scan("[Link]") #debe haber un archivo con contenido
print(vec)

vec<-scam("nombre-del-archivo-txt",integer())#para indicar el tipo de vector


print(vec); class(vec) #El vector y su clase

#función inversa#
vv<-(5,6.6,-7.7)
write(vv,"[Link]") #para transformar un vector en archivo

v1<-scan("[Link]") #para recuperar el contenido del archivo


v1
-------------------------------------------------------------
#Creación de vectores a partir de secuencias y otros patrones

v<-vector("integer",0)
v #un vector de enteros sin elementos
w<-vector("numeric",3)
w #Un vector de tres ceros
u<-vector("logical",5)
u #Un vector de 5 FALSE

1:3 # El operador " : " permite crear un vector a partir de secuencia


v<- 39:11
print(v); class(v) #El vector y su clase

v<- pi:6 #con números no enteros


print(v);class(v)

v<-seq(from=5,to=15,by=2)
print(v) #secuencia desde 5 hasta 15 de 2 en 2

v<-seq(from=4,by=2,[Link]=8) #determina un vector en base a una longitud


print(v) #secuencia de 8 números iniciando desde 4 y de 2 en 2

v<-c(4,8,-3)
w<-rep(v,times=5)
print(w)#repetir los elementos del vector varias veces en un vector

u<-c(3,4,5)
v<-c(5,4,3)
w<-c(u,v)
print(w) #La concatenación de u y v

--------------------------------------------------------------
#2.2.4. Acceso a los elementos individuales de un vector

v<-c(8,7,-3,2,182)
v[4] #El cuarto elemento
print(v[1]);print(v[3]) #el primero y el tercer elemento
v[4]+v[2] #La suma de cuarto y el segundo elemento de v
v[1]<-v[2]-v[5]
v #El resultado de la operación se guarda en la posición 1

v[8]<-213 #para hacer crecer el vector


v #v tiene ahora 8 elementos con espacios vacíos

#se puede asegnar números a palabras

frutas<-c(15,100,2,30)
frutas
names(frutas)<-c("naranja","pera","manzana","durazno")
frutas

#otra manera de nombrar los elementos de un vector


frutas<-c(naranja=15,pera=100,manzana=2,durazno=30)
frutas["durazno"]

frutas["manzana"] <-8 #para asignar nuevos valores a las palabras


frutas

#El acceso a través de índices sigue permitiendo:


frutas[2]
--------------------------------------------------------------
#Operaciones sencillas con vectores

v<-2+3
v #un vector de longitud uno

v<-c(2,3)-c(5,1)
v # un vector de longitud 2

v<-c(2,3,4)*c(5,1,4)
v # un vector de longitud 3

v<-c(2,3,4)-c(3:1) #Eleva a potencias 3,2,1


v

u<-2:30
v<-c(4,5,6)
w<-c(u,v) #unión de vectores
w
length(w) #mide el tamaño del vector

w<=10 #Prueba elementos menores o iguales a 10

v<-c(4,5,6,7,8,9,10)*c(1,2)
v

v<-c(4,5,6,7,8,9,10)*c(2,2,1,2,3,1,2)
v

options(warn=-1) #indica las diferencias entre las logitudes de los operandos


v<-c(4,5,6,7,8,9,10)*c(1,2)
v

v<-c(4,5,6)
w<-2*(v^2) #dos veces el cuadrado de v
w

#Se desea la raíz cuadrada de los siguientes valores:


v<-c(9,8,31)
sqrt(v)

#El sin de 30,45 y 60 grados: primero de convierte en radianes


ángulos<-c(30,45,60)*(pi/180)
ángulos #en radianes

senos<-sin(ángulos)
senos
---------------------------------------------------------------
#Ejemplo de aplicación

#De un edificio, a una altura de 15m, se ha lanzado con águlo de 50 grados, un proyectil
#a una velocidad de 7m/s ¿Cuáles serán las alturas del proyectil
#a cada 0.5m de distanci horizontal desde donde se lanzó hasta los 11m?

g<-9.81 #aceleración gravedad


x0<-0 #x inicial
y0<-15 #y inicial
vi <-7 #velocidad inicial
alphaD <-50 #ángulo-grados

#Se convierte a radianes


alpha<-(pi/180)*alphaD
vox <-vi*cos(alpha) #componente x de velocidad inicial
vox
voy<-vi*sin(alpha) #componente y de velocidad inicial
voy

#desde 0 hasta 11 de 0.5 en 0.5


las.x <-seq(from=0,to=11,by=0.5)
las.t <-(las.x-x0)/vox

las.y <- -(g/2)*las.t^2+voy*las.t+y0


las.x
las.y
----------------------------------------------------------------
#2.3 Matrices
#2.3.1 Construcción de matrices

(m<-11:30) #Un vector con 20 números

#Para convertir en matriz simplemente se especifica el atributo dim


dim(m)<-c(4,5) #4 renglones y 5 columnas
m
class(m)

dim(m)<-c(5,4) #5 renglones y 4 columnas


m
Y el elemento en el renglon 3 y columna 2 es:
m[3,2]
m[8]#acceso al mismmo elemento, como vector, con un solo índice

#El renglón 3 y la columna 2 de la matriz


m[3,]
m[,2]

#La clase las columnas o renglones:


class(m[3,])

#ASIGNAR NOMBRES A LAS FILAS


(m<-matrix(11:30, nrow=5, ncol=4, byrow=TRUE))

rownames(m) <-c("uno","dos","tres","cuatro","cinco")
colnames(m) <-c("UNO","DOS","TRES","CUATRO")

#Consulta de los nombres de las columnas


colnames(m)
#Una columna:
m[,"DOS"]

m1<-rbind(c(1.5,3.2,-5.5),c(0,-1.1,60))
m1
class(m1[1,])

(m2<-cbind(c(1.5,3.2,-5.5),c(0,-1.1,60)))

PAUL
#MULTIPLICACION DE ELEMENTOS MATRICIALES
#La multiplicacion se hara elemento a elemento
#Se crea la matriz m, asignando un rango y el numero de filas y columnas
(m <- matrix(11:40, nrow = 5, ncol = 3))
(mm <- rbind(11:13, 23:21, c(21, 21, 21), c(22, 22, 22), c(13, 13, 13)))
m * mm
# [,1] [,2] [,3]
#[1,] 11 16 21
#[2,] 12 17 22
#[3,] 13 18 23
#[4,] 14 19 24
#[5,] 15 20 25

#MULTIPLICACION MATRICIAL
#Las matrices se multiplicarán entre sí, de acuerdo con las condiciones del Álgebra Lineal
(A<-matrix(11:16,2,3))
(B <- rbind(2:3, 2:3, 0:1))
#Para este fin, ha de usar el operador %*%
A%*%B
#[,1] [,2]
#[1,] 48 87
#[2,] 52 94

#MULTPLICACIÓN DE UNA MATRIZ POR SU TRANSPUESTA


t(A) #Comando para encontrar la transpuesta de una matriz
A%*%t(A)

#EJEMPLO
#Supóngase ahora, que se tiene un triángulo, cuyos vértices son (1.0, 0.0),
#(2.0, 1.0), y (1.0, 1.0), y se quieren encontrar los vértices del triángulo resultante
#de una rotación de 32º. Tómese en cuenta que el lenguaje R, provee de las
#funciones trigonométricas sin(), cos(), así como del número pi.
a=32*pi/180
(original=rbind(c(1, 2, 1),c(0, 1, 1)))
(traslacion=cbind(c(cos(a),sin(a)),c(-sin(a),cos(a))))
([Link]=traslacion%*%original)
#[,1] [,2] [,3]
#[1,] 0.8480481 1.166177 0.3181288
#[2,] 0.5299193 1.907887 1.3779674

#FACTORES Y VECTORES DE CARACTERES


persona <- c("Hugo", "Paco", "Luis", "Petra", "Maria", "Fulano",
"Sutano", "Perengano", "Metano", "Etano", "Propano")
[Link] <- c("Dic", "Feb", "Oct", "Mar", "Feb", "Nov",
"Abr", "Dic", "Feb", "Oct", "Dic")
print(c(persona[7],[Link][7]))
#[1] "Sutano" "Abr"
paste(persona[4],"nació en el mes de",[Link][4])
paste(persona[2],"nació en el mes de",[Link][2])
paste(persona[5],"no nació en el mes de",[Link][1])

#FACTORES Y SU ESTRUCTURA
[Link] <- [Link]([Link]) #El comando [Link] extrae los factores del
vector automaticamente
[Link]
# y generamos la impresión ahora con el factor:
paste(persona[7], "nacio en el mes de", [Link][7])

unclass([Link]) #Esta funcion permite asignar números a las categorías


pertenecientes a las variables
table([Link]) #Permite ver una tabla de frecuencias tomando en cuenta todas las
categorías

#Ahora vamos a especificar los niveles requeridos con el comando factor.


#Primero hay que crear el vector con nuestros niveles
meses <- c("Ene","Feb","Mar","Abr","May","Jun","Jul","Ago",
"Sep","Oct","Nov","Dic")

[Link] <-factor([Link], levels=meses)


[Link]
table([Link])
#Ene Feb Mar Abr May Jun Jul Ago Sep Oct Nov Dic
#0 3 1 1 0 0 0 0 0 2 1 3

#Se pueden extraer tanto los factores como los niveles:


[Link][10] #Extraer el nivel de la lista original
levels([Link])[6] #Se extrae un nivel de la lista depurada
#O bien, cambiarlos
levels([Link])[6]<-"octubre"
[Link]

#Si se quiere tener acceso al factor como un vector de índices, se convierte a entero:
[Link]([Link])
## [1] 2 3 6 4 3 5 1 2 3 6 2

#LISTA
familia<-list("Petronila", "Javier", 20, c("Humberto", "Cristina"), c(16,10))
familia

familia<-list(mama="Petronila", papa="Javier", casados=20, hijos=c("Humberto",


"Cristina"),edades= c(16,10))
familia

#Acceso a elementos listados


familia$mama
familia[["mama"]]

familia$papa<-"Daniel"
familia

familia$"mama" <- "Julia"


mm <- "mama"
familia[[mm]]

familia[[ paste("ma", "ma", sep="") ]]


familia

#DATA FRAMES

(m <- cbind(ord=1:3, edad=c(30L, 26L, 9L)) )


(v <- c(1.80, 1.72, 1.05) )
ff <- [Link](familia=c("Padre", "Madre", "Hijo"),m, estatura=v)
ff

#Pendiente de revisión por el tipo de archivo


[Link] <- [Link]("[Link]")
colnames([Link])
rownames([Link])
[Link]$Piso
[Link][[2]]
[Link][2]
[Link][3, 2]
# modificamos el elemento con:
[Link][3, 2] <- 106
[Link]
[Link]$Calentador
class([Link]$Calentador)
[Link]$Total <- [Link]$Precio * [Link]$Area
[Link]

#FUNCIONES
[Link]<- function(r, h) {h*pi*r^2}
class([Link])
[Link]<- function(r, h) {return(h*pi*r^2)}
[Link](5,1)

hipotenusa <- function(x, y) {return(sqrt(x^2 + y^2))}


hipotenusa(3, 4)
hipotenusa(y = 4, x = 3)

#Se puede dejar asignados valores a la funcion, para llamarla mediante variables ausentes
[Link] <- function(r=5, h=1) {h*pi*r^2}
[Link]()

#Área del círculo


ff <- function(r) {return(a * r^2)}
#Donde:
a=pi
ff(10)

LAURA

2.8 Coerción

x <- 1.03
y <- [Link](x) # conversión a entero
z <- [Link](y) # conversión a complejo
a <- c("1000", "2013.1", "0")
class(a)
b <- [Link](a) # conversión de character a otro tipo
class(b)

c <- [Link](b) # conversión a lógico


# 0 es FALSE y distinto de 0 es TRUE

#Conversión de una matriz a un data frame:

(m <- matrix(1:20, nrow = 5, ncol = 4))


ff <- [Link](m)

ff$V2 #acceso a los elementos del data frame

#CAPÍTULO 3

#3.1 Los operadores de acceso o selección


mtx[2,3] # regresa un objeto de la misma clase que el original # selecciona más de un elemento.
ff[[“Nombre”]] # extrae elementos de una lista
ff$Nombre #extrae o accede a los elementos de una lista o un data frame, a partir del nombre del
elemento.

#[Link]. Selección de una secuencia de elementos, o elementos particulares

(v <- rnorm(20)) # genera números aleatorios con una distribución normal


(subv <- v[5:15]) # selecciona números en posiciones específicas (entre 5 y 15)
(sub1.v <- v[c(2, 3, 5:8)]) #selección de subconjuntos arbitrarios del vector o factor.

([Link] <- factor(c("Dic", "Feb", "Oct", "Mar", "Feb", "Nov"),


levels=c("Ene","Feb","Mar","Abr","May","Jun", "Jul","Ago","Sep","Oct","Nov","Dic"))) #con factores

(sub2.v <- v[-c(2, 3, 5:8)]) # el índice negativo excluye los elementos señalados por el índice}

#[Link]. Selección de elementos de acuerdo con una condición

v[v < 0] #obtención de elementos negativos en el vector original


v[!(v < 0)] # obtención de elementos positivos mediante negación lógica
v[v >= 0] #obtención de numeros positivos con el operador >=
[Link] == "Mar" # probar igualdad en factores
[Link] != "Mar" # probar desigualdad en factores
[Link]([Link]) # factor convertido a enteros establecido por orden de los Levels
[Link]([Link]) <= 4 # vector de lógicos menores a 4
[Link][[Link]([Link]) <= 4] # índice (lista) menores a 4
v[v < 0] <- -v[v < 0] #cambio de elementos negativos a su correspondiente positivo

3.2.2 #Matrices y data frames

(mt <- matrix(11:30, nrow = 4, ncol = 5))


[Link] <- [Link](mt) #convierte matriz a un data frame
rownames([Link]) <- c("uno", "dos", "tres", "cuatro") colnames([Link]) <- c("UNO", "DOS", "TRES",
"CUATRO", "CINCO") [Link] #asignan nombres a renglones y columnas de [Link] #

[Link] El operador con un solo índice


mt[5] #matriz con índice 5
[Link][5] #data frame con índice 5

[Link] Omisión de índices en el operador


mt[3, ] # Selecciona de una matriz el tercer renglón
[Link][3, ] # Selecciona de un data frame el tercer renglón
mt[, 3] # Selecciona de una matriz la tercera columna
[Link][, 3] # Selecciona de un data frame la tercera columna
class(mt[3, ]) #
class([Link][3, ]) # sólo en este caso se cumple
class(mt[, 3])
class([Link][, 3])
mt[3, , drop = FALSE] # El tercer renglón
class(mt[3, , drop = FALSE])
[Link][3, , drop = FALSE]
class([Link][3, , drop = FALSE])
mt[, 3, drop = FALSE] #La tercer columna
class(mt[, 3, drop = FALSE])
[Link][, 3, drop = FALSE]
class([Link][, 3, drop = FALSE])
mt[, 4:2] # Selección de las columnas 4,3,2, en ese orden
[Link][, 4:2]
mt[1:3, 4:2]
[Link][1:3, 4:2]
[Link]. El uso de índices lógicos o condiciones
mt[2, ] #Selecciona de una matriz la segunda fila
[Link][2, ] #Selecciona de un data frame la segunda fila
mt[, 2] == 16 # De la columna 2 identifica el valor 16
[Link][, 2] == 16
mt[(mt[, 2] == 16), ] # Se usan paréntesis, (), para enfatizar la condición, aunque se los
puede omitir
[Link][([Link][, 2] == 16), ]
mt[(mt[, 2] == 16), , drop = FALSE] #obtiene una matriz (de un solo renglón)
mt[4, 2] <- 16L [Link][4, 2] <- 16L #obtiene más de un renglón que cumpla la condición
mt[(mt[, 2] == 16), ] #obtiene un conjunto de renglones
[Link][([Link][, 2] == 16), ]
mt[2, ]%%8 != 0 #obtiene todas las columnas que en su renglón 2 no son múltiplos de 8 #
operador módulo o residuo: %%
mt[, (mt[2, ]%%8 != 0)] #expresión como índice
[Link][, ([Link][2, ]%%8 != 0)]

3.3. Los operadores [[]] y $

rownames(mt)<-c( “uno”, “dos”, “tres”, “cuatro”)


colnames(mt) <-c(“UNO”, “DOS”, “TRES”, “CUATRO”, “CINCO”)
mt

mt[,”TRES”]
## uno dos tres cuatro
## 19 20 21 22
[Link][,”TRES”]
## [1] 19 20 21 22
mt[“dos”,]

## UNO DOS TRES CUATRO CINCO


## 12 16 20 24 28

df [“dos”, ]

## UNO DOS TRES CUATRO CINCO


## 12 16 20 24 28
[Link] [“dos”, ]

## UNO DOS TRES CUATRO CINCO


## dos 12 16 20 24 28

#para comparaciones con el operador [[]]

mt[“dos”, “TRES”, drop=F]

## TRES
## dos 20

Class(mt[“dos”, “TRES”, drop =F]) # La clase de objeto

## [1] “matrix”
[Link][“dos”, “TRES”, drop =F] # F es lo mismo que FALSE

## TRES
## dos 20

class([Link][“dos”, “TRES”, drop = F]) # La clase del objeto

## [1] “[Link]”

mt[[2, 3]]

## [1] 20

mt[[“dos”, “TRES”]]

## [1] 20

class(mt[[“dos”, “TRES”]])

## [1] “integer”

[Link][[2, 3]]

## [1] 20
class([Link][[2, 3]])

## [1] “integer”

[Link][[“dos”, “TRES”]]

## [1] 20
[Link][[“tres”]]

## [1] 19 20 21 22

[Link]$TRES

## [1] 19 20 21 22

[Link]$”TRES”

## [1] 19 20 21 22

[Link]$T

## [1] 19 20 21 22

[Link][[“TR”, exact = F]] # Recuerde F es FALSE

## [1] 19 20 21 22

Paul (64-78)
############################################
#4 ESTRUCTURA DE CONTROL Y MANEJO DE DATOS #
############################################

################################
# 4.1. Construcciones IF- ELSE #
################################

aa<-25.5 #Aquí se asigna una variable


if(aa<26) #If sin else
print ("SI MAYOR") #Establecer condición de mayor
if(aa<26)print("SI MAYOR") #Instrucción simple
if(aa<26){ #Instrucción compuesta
print("PRIMER RENGLON")
print("SI MAYOR")
}

#Empleando el valor que regresa el if


y<-1
y<-if(aa<26)50 #Prueba como si fuera verdadero o falso
y

#La construccion if admite una expresión que puede ser compuesta.


#En los casos anteriores, la expresión señalada por el if se ejecuta u omite
#dependiendo del valor de la condición, TRUE o FALSE, respectivamente.
#La siguientes construcciones, redirigen la ejecución del código a distintos bloques
#o conjuntos de instrucciones dependiendo de que se cumplan o no las condiciones
establecidas:
aa=8.5
if(aa<5) {
print("REMEDIAL")
} else if (5<=aa && aa<=6.99){
print("EXAMEN")
print("SUPLETORIO")
} else {
print("APROBADO")
}

#################
#4.2. LOS CICLOS#
#################

#Tipos de ciclo: repeticiones por un número determinado de veces, repeticiones mientras se


cumple
#una condición y repeticiones infinitas.

#########################################################################
###
#4.2.1. Repeticiones por un número determinado de veces: con la instrucción for
#FORMA 1
letras<-c("B", "i", "O", "q", "U","í", "M", "i", "C", "a")
letras
for(i in 1:10){
print(letras[i])
}

#FORMA 2: Con seq along


for(i in seq_along(letras)){
print(letras[i])
}

#FORMA 3
for (termino in letras){
print(termino)
}
#########################################################################
###
#4.2.2. Repeticiones mientras se cumple una condición: instrucción while
i<- 4
while (i<=10){
print(letras[i])
i<-i+1
}
#########################################################################
###
#4.2.3. Repeticiones infinitas: instrucción repeat
i<-4
repeat{
print(letras[i])
i<-i+1
if(i>10)
break
}
#########################################################################
###
#4.2.4. Interrupciones del flujo normal de ciclos
#Ejemplo 1: con números aleatorios
[Link](140)
aprox<-0.003
Y_ini<-2.7
for(iter in 1:1000){
Y<-Y_ini+0.008*rnorm(1)
if(abs(Y-Y_ini)<=aprox)
break
Y_ini<-Y
}
paste0("Y_ini: ", Y_ini, ", Y:", Y, ", Num. iter:", iter)

#Ejemplo 2: funcion con repetición


fibbonacci <- function(n) {
if (n %in% c(0,1))
return (1)
F0 <- 1; F1 <- 1; i <- 2
repeat {
s <- F0 + F1
if (i == n)
return (s)
F0 <- F1
F1 <- s
i <- i+1
}
}
fibbonacci (4)

#Ejemplo 3
for (i in 1:7){
if(3<=i && i<=5)
next
print(i)
}

#########################################################################
##
## 4.3. Funciones de clasificación, transformación y agregación de datos ##
#########################################################################
##

#####################
# 4.3.1. Motivación #
#####################

#Programa para determinar el módulo de un vector n-dimensional


vv <- c(2,1,-2,5) #Se define el vector
modulo <- function (v){ #Se construye la función encargada de la operación
s <- 0 #Contiene la suma de cuadrados
for (elt_v in v){
s <- s + elt_v^2 #Incrementamos la suma
}
sqrt(s) #El módulo es la raíz de la suma
}

modulo(vv) #Resultado

#########################################################################
####
#Programa para calcular la media de un conjunto de datos
nums <- runif(32, 10.5, 40.8)
suma <-0
for (elt in nums){
suma <- suma + elt
}
(promedio <- suma/length(nums))
#########################################################################
#####
#Alternativas
(promedio <- sum(nums)/length(nums))

haz_promedio <- function (v){


sum(v)/length(v)
}
haz_promedio(nums)

mean(nums)
#########################################################################
#####
#Primer uso de la función Reduce
miSum <- function(v) Reduce("+",v)
miProd <-function (v) Reduce ("*",v)

prod(vv)
miProd (vv)
miSum(vv)
#########################################################################
#####
#Segundo uso de la función Reduce
mif <- function (a,b){
return (a*b/(a+b))
}
mi0p <- function (v) Reduce (mif,v)
mi0p(vv)

miOpV2 <- function(v) Reduce(function(a, b) a * b/(a + b), v,


accumulate = TRUE)
miOpV2(vv)

##############################################
# 4.3.2. Las funciones sapply () y lapply () #
##############################################
#La función sapply permite aplicar una operación o una función a cada uno
#de los elementos de la lista o data frame
(misDatos <- [Link] (uno = runif(5,10.5,40.3), dos = runif (5), tres = runif (5,155,890)))
sapply(misDatos, haz_promedio, simplify = TRUE)

#La función lapply permite aplicar operación o función y arrojar los resultados
#en una lista
lapply (misDatos, mean)

r <- numeric () #vector numerico para resultados


for (elt in misDatos){
r <- c(r, haz_promedio(elt))
}
names (r) <- names(misDatos)
r
###################################################################
# 4.3.3. Operaciones marginales en matrices y la función apply () #
###################################################################
(mm <- rbind(5:9, runif(5,10,20), c(2, -2, 1, 6,-8)))
colSums(mm) #Sumar todos los elementos de cada una de las columnas
rowMeans(mm) #Encontrar la media de cada una de las filas
apply(mm,1,sd) # el 1 es el margen: renglones
apply(mm,2,sd) # el 2 es el margen: columnas

ff <- function (v) v*(1:length(v))


ff(c(2,4,6,8))

apply(mm,2,ff)

######################################################
# 4.3.4. Clasificaciones y uso de la función split() #
######################################################
#Con esta función, puede escogerse los elementos de determinada fila o
#columnas y luego organizarlas dependiendo de otro parámetro
tt <- [Link](Estacion = c("E1", "E1", "E1", "E1", "E2", "E2", "E2","E3", "E3", "E3", "E3"),
Anio = c(1978, 1979, 1980, 1982, 1979, 1980, 1981, 1979, 1980, 1981, 1982), Enero = c(54,
21.5, 81, 37.5, NA, 105.2, 60.3, 10.8, 10.1, 20.2, 20.3),Febrero = c(38.5, 21, 31, NA, NA,
17.5, 3.2, 30.3, NA, 40.4, 50.5), Marzo = c(NA, 38.5, 4, 30, 155, 246, 100, 60.6, 70.6, 80.6,
90.6))
mls <- split (tt[,3:5],tt$Anio)
mls

Laura (79-93)
Kelly (94-108)
Fulton (109-124)

hist(pp$Precip, freq=F, breaks=15,


col="blueviolet", # Color de las barras
density=30, # Densidad de sombreado de las barras
main="Histograma y densidad Gamma", # Título
xlab="precipitacion (mm)", # Etiqueta del eje X
ylab="Densidad") # Etiqueta del eje Y

curve(dgammaX, add=T,
col="green", # Color de la curva
lwd=3) # Ancho de línea de la curva
plot(pp$Precip) # Produce un gráfico de "dispersión"
# Para el manejo de etiquetas especiales,
# con caracteres "raros para el Inglés",
lab <- "Años" # Etiqueta para las abscisas
plot([Link](rownames(pp)), # las abscisas
pp$Precip, # las ordenadas
type="l", # tipo de grafico: líneas
col="blue", # color: azul
main="Precipitaciones, Octubre", # Título
sub="Estado de Guerrero", # Subtítulo
xlab=lab, # etiqueta eje X
ylab="Precipitacion") # etiqueta eje Y
radio <- 0:10 # Vector de radios
area <- pi*radio^2 # Vector de áreas
tit <- "Áreas de círculos" # Título del gráfico
plot(radio, area, # x=radio y=area
type="b", # "both", puntos y líneas
main=tit,
xlab="Radio (r)",
ylab=expression(Area == pi*r^2), # Una expresión
col="orange", # color (naranja)
pch=20) # tipo de símbolo para punto
aa <- "área" # Texto para leyenda
pp <- "perímetro" # Texto para leyenca
xl <- "área, perímetro" # Etiqueta eje X
radio <- seq(0,5,by=0.5) # Vector de radios
area <- pi*radio^2 # Vector de áreas
perimetro <- 2*pi*radio # Vector de perímetros
plot(area, radio, type="o", xlab=xl, pch=21, col="red3",
bg="gold")
# En seguida "encimaremos" sobre el gráfico anterior (áreas),
# el de perímetros
lines(perimetro, radio, type="o", pch=23, col="navyblue",
bg="violetred")
legend("bottomright", # ubicación leyenda
legend = c(aa, pp ), # textos de leyenda
lty = c(1, 1 ), # tipo de línea
pch = c(21, 23 ), # símbolos
col = c("red3", "navyblue" ), # color líneas
[Link] = c("gold", "violetred") ) # relleno de símbolo
rgb(176, 48, 96, maxColorValue=255)
## [1] "#B03060"
# O como números entre 0 y 1 (porcentajes):
rgb(176/255, 48/255, 96/255)
## [1] "#B03060"
# La función rgb() puede producir los códigos
# de color de varios colores simultáneamente:
colores <- rgb(red= c(176,255,238,205),
green=c( 48, 52, 48, 41),
blue= c( 96,179,167,144),
max=255) # se puede abreviar "maxColorValue"
colores
## [1] "#B03060" "#FF34B3" "#EE30A7" "#CD2990"
plot(1:4, pch=22, cex=10, bg=colores,
xlim=c(-0.5,4.5), ylim=c(-0.5,4.5))
Los primeros veinte nombres de colores:
head(colors(),20)
## [1] "white" "aliceblue" "antiquewhite"
## [4] "antiquewhite1" "antiquewhite2" "antiquewhite3"
## [7] "antiquewhite4" "aquamarine" "aquamarine1"
## [10] "aquamarine2" "aquamarine3" "aquamarine4"
## [13] "azure" "azure1" "azure2"
## [16] "azure3" "azure4" "beige"
## [19] "bisque" "bisque1"
# Los elementos 455 al 458
coloresPorNombre <- colors()[455:458]
coloresPorNombre
## [1] "maroon" "maroon1" "maroon2" "maroon3"
# Para encontrar los contenidos de RGB:
(dd <- col2rgb(coloresPorNombre))
## [,1] [,2] [,3] [,4]
## red 176 255 238 205
## green 48 52 48 41
## blue 96 179 167 144
# Y para encontrar los hexadecimales correspondientes:
codigos <- rgb(red= dd["red",],
green=dd["green",],
blue= dd["blue",],
max=255) # se puede abreviar "maxColorValue"
codigos
## [1] "#B03060" "#FF34B3" "#EE30A7" "#CD2990"
# Pero, dado que 'dd' es una matriz,
# podemos obtener el mismo resultado con su
# traspuesta así:
(codigos <- rgb(t(dd), max=255))
## [1] "#B03060" "#FF34B3" "#EE30A7" "#CD2990"
# Se proporciona el vector de nombres de
# colores en vez del vector de códigos
plot(1:4, pch=22, cex=10, bg=coloresPorNombre,
xlim=c(-0.5,4.5), ylim=c(-0.5,4.5))
# la paleta actual
palette()
## [1] "black" "red" "green3" "blue" "cyan"
## [6] "magenta" "yellow" "gray"
# para cambiarla, por ejemplo, con los primeros
# veinticinco colores de colors()
palette(colors()[1:25])
# Se establece el espacio de dibujo:
plot(0, type="n", xlim=c(0,10), ylim=c(0,10))
# Se dibujan las líneas rectas; para ello,
# se hace uso de mapply que aplica de manera
# multiple una función:
void <- mapply(abline,
c(2,1,0,-1,-2), # interceptos por línea
rep(1,5)) # pendiente = 1
Laura (79-93)
Kelly (94-108)
Fulton (109-124)
mu <- mean(pp$Precip) # media
## [1] 115.5
sigma <- sd(pp$Precip) # desviación estándar
## [1] 56.01

#en R, la función de densidad normal de probabilidades es dnorm()

valores <- c(20,50,115,150,200) #precipitaciones


dnorm(valores,mu,sigma)
##[1] 0.001666 0.003597 0.007155 0.005890 0.002281

## Como μ y ౮ no varian para un conjunto de observaciones dado, se convierte en funcion.

dnormX <- function(x) dnorm(x,mu, sigma)


dnormX(valores)
##[1] 0.001666 0.003597 0.007155 0.005890 0.002281

##La funcion curve() sirve para graficar una funcion de densidad normal de probabilidades.

Lims <- c(mu-3*sigma,mu+3*sigma)


curve(dnormX,xlim=lims)

# Nótese que ahora los límites: lims, se imponen a la primer


# gráfica que se produce, en este caso, al histograma.
hist(pp$Precip, breaks = 15, freq = FALSE, xlim = lims)
# En lo que sigue, el argumento add=TRUE, indica que la curva
# se agrega al gráfico anterior
curve(dnormX, add = TRUE)

################5.5.5. Implementacion del metodo en R######################

#se debe instalar un paquete llamado numDeriv.


[Link](“numDeriv”)
#para usar el paquete se debe ordenar a R activarlo aplicando el comando
library(numDeriv)

#Traduccion de una funcion en codigo R:


miFun<- function(p) c(p[1]^2+p[1]*p[2]-100,p[1]+3*p[1]*p[2]^2-57)
p_tst <-c(1.5,3.5)
miFun(p_tst)
##[1] -2.500 1.625

#Ahora se puede aplicar el jacobiano de la funcion anterior evaluada en el mismo punto


jacobian(miFun,p_tst)

incremento<- solve(jacobian(miFun, p_tst),-miFun(p_tst))


incremento
## [1] 0.5360 -0.6561
siguiente_p <-p_tst + incremento
Siguiente
## [1] 2.036 2.844

#para para que el procedimiento sea general, la función podrá ser cualquiera que
represente un sistema de m ecuaciones no lineales, con m incógnitas

sigDx <- funcrion(ff,x){solve(jacobian(ff,x),-ff(x))}


siguiente_p <- p_tst + sigDx(miFun, P_tst))
## [1] 2.036 2.844

# Función para cálculo del módulo o magnitud de un vector


modulus <- function(x) sqrt(sum(x^2))
NwtRph <- function(ff, x0, eps=0.0001, lim=500, absComp=F) {
n <- 0 # número de iteración
repeat { # repetición infinita
difx <- sigDx(ff, x0) # diferencia de la sig. aprox.
x <- x0 + difx # la siguiente aproximación
# Hacemos el módulo de la diferencia para checar
r <- modulus(difx) # distancia entre x y x0
# Comparación absoluta o relativa
if (absComp) { # <-absoluta
if (r <= eps) return(x)
} else { # <-relativa
if (r <= eps*modulus(x0)) return(x)}
# si llega al máximo de iteraciones
# salimos con null
if (n > lim) return (NULL)
n <- n+1
x0 <- x # para la siguiente iteración}}
# Apliquemos para nuestro ejemplo, tomando
# p_tst, como valor inicial:
p <- NwtRph(miFun, p_tst)
print(p) # <- SOLUCIÓN
## [1] 2 3

#############5.5.6. Ajuste a la funcion de densidad de probabilidades#############

#Se realizara el ajuste usando la funcion Gamma de densidad de probabilidad.

mu<- mean(pp$Precip)
## [1] 115.5 #media
vz<-var(pp$Precip)
##[1] 3137 #varianza

#Traducir el codigo de la función vectorial F(p)


miFun <-function(p) c(p[1]*p[2]-mu,p[1]*p[2]^2-vz)

#si se considera como una aproximacion de (5,10) se aplica la funcion NwtRph()


p0<- c(5,10)
p<-NwtRph(miFun,p0)
print(p)
## [1] 4.25 27.17

dgammaX <-function(x) dgamma(x, shape=[1], scale=p[2])


# y se grafica.

hist(pp$Precip, breaks=15, freq=FALSE)


curve(dgammaX, add=TRUE)

#hay disponible una biblioteca, denominada “MASS” , que, entre otras operaciones, permite
#ajustar un conjunto de datos a una función de distribución cualquiera usando el método de
#máxima verosimilitud

[Link](“MASS”)

#Para utilizar la lectura MASS se debe usar la activacion.

library (MASS)

ff<-fitdistr(pp$Precip, dgamma, start=list(shape=p0[1],scale=p0[2]))


ff
## shape scale
## 4.1128 28.0696
## (0.8725) (6.3318)

#se elaborará también una función particular, como se hizo para el método anterior, que
#pueda ser graficada mediante la función curve(), de la siguiente manera

dgammaXX <- function(x) {dgamma(x, shape=ff$estimate[[1]], scale=ff$estimate[[2]])}


curve(dgammaX, col="green", lwd=2,
ylab="Densidad",
ylim=c(0,0.012), # Límites de Y
xlim=c(0,max(pp$Precip))) # Límites de X
curve(dgammaXX, col="red", lwd=2, add=T)

legend("topright",c("Metodo parametros", "Metodo max simil"),lwd=2, col=c("green", "red"))


#########################################################################
#############################CAPITULO 6##################################
#########################GRAFICACION CON R#############################
#########################################################################

#############################6.1 MOTIVACION##############################

hist(pp$Precip, freq=F, breaks=15,


col="blueviolet", # Color de las barras
density=30, # Densidad de sombreado de las barras
main="Histograma y densidad Gamma", # Título
xlab="precipitacion (mm)", # Etiqueta del eje X
ylab="Densidad") # Etiqueta del eje Y

También podría gustarte