UNIVERSIDAD CENTRAL DEL ECUADOR

FACULTAD DE CIENCIAS ECONÓMICAS

CARRERA DE ESTADÍSTICA



PRIMERAS PRACTICAS EN R 11

Manual

En el siguiente texto podremos encontrar una serie de códigos elaborados en el programa Rstudio que darán solución a un determinado ejercicio enfocados principalmente en la aplicacion de la funcion apply, tapply, sapply, lapply.

Ejercicio 1: APPLY

  1. Comenzaremos por crear un dataframe con los siguientes argumentos:
df<-data.frame(x=1:4, y=5:8, z=10:13)
  1. Utilizaremos la funcion apply():

La función apply nos permite aplicar una función a una matriz, lista o vector que se le pase cómo parámetro.

Argumento 1: matriz, lista o vector

Argumento 2: Puede tomar valores 1 o 2

1 para operar sobre las filas

2 para operar sobre las columnas

Argumento 3: Operador que se aplica sobre filas o columnas, según indique el argumento 2.

Ejemplos de funciones: sum, mean, count,…

apply(X=df, MARGIN=1, FUN=sum)
apply(df,1,sum)
apply(df[c(1,2), ],1,sum)
apply(df,2,sum)
apply(df[ ,c(1,3)],2,sum)
apply(df,c(1,2),sum)
apply(df,c(2,1),sum)
apply(df,1,mean,na.rm=TRUE)
  1. Adicionalmente podemos crear nosotros mismos una funcion con la que podamos usar como argumento dentro de la funcion apply
fun<-function(x,character=F){
 if(character==F){
   x^2
 }else{
   as.character(x^2)
 }
  
}

apply(df,1,fun)
apply(df,1,fun,character=TRUE)
apply(df,2,fun)
apply(df,c(1,2),fun)

Ejecución del código en R

SINTAXIS COMPLETA
##EJEMPLO 1: APPLY

df<-data.frame(x=1:4, y=5:8, z=10:13)
df

apply(X=df, MARGIN=1, FUN=sum)
apply(df,1,sum)
apply(df[c(1,2), ],1,sum)
apply(df,2,sum)
apply(df[ ,c(1,3)],2,sum)
apply(df,c(1,2),sum)
apply(df,c(2,1),sum)
apply(df,1,mean,na.rm=TRUE)

##FUNCION

fun<-function(x,character=F){
  if(character==F){
    x^2
  }else{
    as.character(x^2)
  }
   
}

apply(df,1,fun)
apply(df,1,fun,character=TRUE)
apply(df,2,fun)
apply(df,c(1,2),fun)

f<-function(x) sum(exp(x))

apply(df,1,f)
apply(df,2,f)
apply(df, 1:2, f)
apply(df, 2, min)
apply(df, 2, range)
apply(df, 1, summary)
apply(df, 2, summary)
ar<-array(data = 1:18, dim = c(3, 2, 3))
apply(ar, 3, sum)
RESULTADO FINAL
##   x y  z
## 1 1 5 10
## 2 2 6 11
## 3 3 7 12
## 4 4 8 13
## [1] 16 19 22 25
## [1] 16 19 22 25
##  1  2 
## 16 19
##  x  y  z 
## 10 26 46
##  x  z 
## 10 46
##      x y  z
## [1,] 1 5 10
## [2,] 2 6 11
## [3,] 3 7 12
## [4,] 4 8 13
##   [,1] [,2] [,3] [,4]
## x    1    2    3    4
## y    5    6    7    8
## z   10   11   12   13
## [1] 5.333333 6.333333 7.333333 8.333333
##   [,1] [,2] [,3] [,4]
## x    1    4    9   16
## y   25   36   49   64
## z  100  121  144  169
##      [,1]  [,2]  [,3]  [,4] 
## [1,] "1"   "4"   "9"   "16" 
## [2,] "25"  "36"  "49"  "64" 
## [3,] "100" "121" "144" "169"
##       x  y   z
## [1,]  1 25 100
## [2,]  4 36 121
## [3,]  9 49 144
## [4,] 16 64 169
##       x  y   z
## [1,]  1 25 100
## [2,]  4 36 121
## [3,]  9 49 144
## [4,] 16 64 169
## [1]  22177.60  60284.96 163871.51 445448.95
##            x            y            z 
##     84.79102   4629.43310 687068.79094
##              x         y         z
## [1,]  2.718282  148.4132  22026.47
## [2,]  7.389056  403.4288  59874.14
## [3,] 20.085537 1096.6332 162754.79
## [4,] 54.598150 2980.9580 442413.39
##  x  y  z 
##  1  5 10
##      x y  z
## [1,] 1 5 10
## [2,] 4 8 13
##              [,1]      [,2]      [,3]      [,4]
## Min.     1.000000  2.000000  3.000000  4.000000
## 1st Qu.  3.000000  4.000000  5.000000  6.000000
## Median   5.000000  6.000000  7.000000  8.000000
## Mean     5.333333  6.333333  7.333333  8.333333
## 3rd Qu.  7.500000  8.500000  9.500000 10.500000
## Max.    10.000000 11.000000 12.000000 13.000000
##            x    y     z
## Min.    1.00 5.00 10.00
## 1st Qu. 1.75 5.75 10.75
## Median  2.50 6.50 11.50
## Mean    2.50 6.50 11.50
## 3rd Qu. 3.25 7.25 12.25
## Max.    4.00 8.00 13.00
## [1] 21 57 93

Ejercicio 2: TAPPLY

  1. Comenzaremos por crear un dataframe con los siguientes argumentos:
data_set<-data.frame(precio=round(rnorm(25,sd=10,mean = 30)),
                    tipo=sample(1:4, size=25,replace=T),
                    tienda=sample(paste("tienda",1:4), size = 25,replace = T))
  1. Separamos las columnas del dataframe creando vectores y convirtiendo a factores los valores :
precio<-data_set$precio
tienda<-data_set$tienda
tipo<-factor(data_set$tipo,
              labels = c("juguetes", "comida", "electrónica", "bebidas"))
  1. Utilizaremos la funcion tapply():

Realiza una operación especificada en el parámetro 3 respecto a un vector especificado en el parametro 1 agrupada por los factores que se indiquen como argumento en el parámetro 2.

Argumento 1: matriz, lista o vector

Argumento 2: Puede tomar valores 1 o 2

1 para operar sobre las filas

2 para operar sobre las columnas

Argumento 3: Operador que se aplica sobre filas o columnas, según indique el argumento 2.

Ejemplos de funciones: sum, mean, count,…

precios_medios<-tapply(precio, tipo, mean)
precios_medios
class(precios_medios)

precios_medios[2]

lista_precios_medios<-tapply(precio, tipo, mean, simplify=F)
lista_precios_medios
lista_precios_medios$juguetes

data_set[1, 1]<-NA
data_set[2, 3]<-NA

tapply(data_set$precio, data_set$tienda, mean)
tapply(data_set$precio, data_set$tienda, mean, na.rm=TRUE)
  1. Adicionalmente podemos crear nosotros mismos una funcion con la que podamos usar como argumento dentro de la funcion tapply
f<-function(x) mean(x, na.rm=TRUE)

tapply(data_set$precio, data_set$tienda, f)

Ejecución del código en R

SINTAXIS COMPLETA
##EJEMPLO 2: TAPPLY

set.seed(2)

data_set<-data.frame(precio=round(rnorm(25,sd=10,mean = 30)),
                     tipo=sample(1:4, size=25,replace=T),
                     tienda=sample(paste("tienda",1:4), size = 25,replace = T))

head(data_set)

precio<-data_set$precio
tienda<-data_set$tienda
tipo<-factor(data_set$tipo,
               labels = c("juguetes", "comida", "electrónica", "bebidas"))

precios_medios<-tapply(precio, tipo, mean)
precios_medios
class(precios_medios)

precios_medios[2]

lista_precios_medios<-tapply(precio, tipo, mean, simplify=F)
lista_precios_medios
lista_precios_medios$juguetes

data_set[1, 1]<-NA
data_set[2, 3]<-NA

tapply(data_set$precio, data_set$tienda, mean)
tapply(data_set$precio, data_set$tienda, mean, na.rm=TRUE)

f<-function(x) mean(x, na.rm=TRUE)

tapply(data_set$precio, data_set$tienda, f)
tapply(precio, list(tipo, tienda), mean)
tapply(precio, list(tipo, tienda), mean, default=0)
RESULTADO FINAL
##   precio tipo   tienda
## 1     21    2 tienda 2
## 2     32    3 tienda 3
## 3     46    4 tienda 4
## 4     19    3 tienda 4
## 5     29    1 tienda 4
## 6     31    3 tienda 4
##    juguetes      comida electrónica     bebidas 
##    39.50000    30.33333    32.20000    29.33333
## [1] "array"
##   comida 
## 30.33333
## $juguetes
## [1] 39.5
## 
## $comida
## [1] 30.33333
## 
## $electrónica
## [1] 32.2
## 
## $bebidas
## [1] 29.33333
## [1] 39.5
## tienda 1 tienda 2 tienda 3 tienda 4 
## 32.00000       NA 39.25000 33.14286
## tienda 1 tienda 2 tienda 3 tienda 4 
## 32.00000 33.50000 39.25000 33.14286
## tienda 1 tienda 2 tienda 3 tienda 4 
## 32.00000 33.50000 39.25000 33.14286
##             tienda 1 tienda 2 tienda 3 tienda 4
## juguetes          46 31.00000       49 36.66667
## comida            26 30.33333       39       NA
## electrónica       50 29.00000       32 25.00000
## bebidas           22 40.00000       20 36.00000
##             tienda 1 tienda 2 tienda 3 tienda 4
## juguetes          46 31.00000       49 36.66667
## comida            26 30.33333       39  0.00000
## electrónica       50 29.00000       32 25.00000
## bebidas           22 40.00000       20 36.00000

Ejercicio 3: SAPPLY

  1. Utilizaremos la funcion sapply():

Se diferencia con apply en que opera con listas. Recibe una lista y devuelve un vector

sapply(1:4, sqrt)
sapply(1:4, function(i) sqrt(i))
  1. Adicionalmente podemos crear nosotros mismos una funcion con la que podamos usar como argumento dentro de la funcion sapply
mi_fun<-function(i) {
 sqrt(i)
}
sapply(1:4, mi_fun)
out <- numeric(10)
for (i in 1:10) {
 out[i] <- i ^ 2
}

out

sapply(1:10, function(i) i ^ 2)

Ejecución del código en R

SINTAXIS COMPLETA
##EJEMPLO 3: SAPPLY

sapply(1:4, sqrt)
sapply(1:4, function(i) sqrt(i))

mi_fun<-function(i) {
  sqrt(i)
}
sapply(1:4, mi_fun)
out <- numeric(10)
for (i in 1:10) {
  out[i] <- i ^ 2
}

out

sapply(1:10, function(i) i ^ 2)

Lista<-list(A=1:5, B=6:20, C=1)
sapply(Lista, length)
RESULTADO FINAL
## [1] 1.000000 1.414214 1.732051 2.000000
## [1] 1.000000 1.414214 1.732051 2.000000
## [1] 1.000000 1.414214 1.732051 2.000000
##  [1]   1   4   9  16  25  36  49  64  81 100
##  [1]   1   4   9  16  25  36  49  64  81 100
##  A  B  C 
##  5 15  1

Ejercicio 4: SAPPLY vs LAPPLY

  1. Compararemos la funcion sapply con la funcion lapply:

La funcion lapply se diferencia con apply en que opera con listas. Recibe una lista y devuelve una lista

lapply(c(3, 5, 7), exp)
  1. A diferencia de la funcion sapply, la funcion lapply nos devuelve un vector
sapply(c(3, 5, 7), exp)
lapply(c(3, 5, 7), exp)

Ejecución del código en R

SINTAXIS COMPLETA
##EJEMPLO 4: SAPPLY vs LAPLLY

sapply(c(3, 5, 7), exp)
lapply(c(3, 5, 7), exp)
sapply(c(3, 5, 7), exp, simplify=F)

as.list(sapply(c(3, 5, 7), exp))

simplify2array(lapply(c(3, 5, 7), exp))

unlist(lapply(c(3, 5, 7), exp))
mi_lista<-list(A=c(1, 4, 6), B=c(8, NA, 9 , 5))
sapply(mi_lista, sum)
sapply(mi_lista, sum, na.rm=T)

matrix(1, ncol=3, nrow=3)

sapply(1:3, function(i) matrix(i, ncol=3, nrow=3))
sapply(1:3, function(i) matrix(i, ncol=3, nrow=3), simplify="array")

sapply(1:3, function(i) matrix(i, ncol=3, nrow=3), simplify=F)

df<-trees
res<-data.frame()

for(i in 1:ncol(df)) {
  for (j in 1:nrow(df)) {
    res[j, i]<-df[j, i]*2
  }
}

sapply(1:ncol(df), function(i) {
  sapply(1:nrow(df), function(j) {
    df[j, i]*2
  })
})
plot(rnorm(10), ylim=c(-6, 6))
nlines<-5
for (i in 1:nlines) {
  lines(-i:i, col=i, lwd=3)
}

plot(rnorm(10), ylim=c(-6, 6))
nlines<-5

invisible(sapply(1:nlines, function(i) lines(-i:i, col=i, lwd=3)))
RESULTADO FINAL
## [1]   20.08554  148.41316 1096.63316
## [[1]]
## [1] 20.08554
## 
## [[2]]
## [1] 148.4132
## 
## [[3]]
## [1] 1096.633
## [[1]]
## [1] 20.08554
## 
## [[2]]
## [1] 148.4132
## 
## [[3]]
## [1] 1096.633
## [[1]]
## [1] 20.08554
## 
## [[2]]
## [1] 148.4132
## 
## [[3]]
## [1] 1096.633
## [1]   20.08554  148.41316 1096.63316
## [1]   20.08554  148.41316 1096.63316
##  A  B 
## 11 NA
##  A  B 
## 11 22
##      [,1] [,2] [,3]
## [1,]    1    1    1
## [2,]    1    1    1
## [3,]    1    1    1
##       [,1] [,2] [,3]
##  [1,]    1    2    3
##  [2,]    1    2    3
##  [3,]    1    2    3
##  [4,]    1    2    3
##  [5,]    1    2    3
##  [6,]    1    2    3
##  [7,]    1    2    3
##  [8,]    1    2    3
##  [9,]    1    2    3
## , , 1
## 
##      [,1] [,2] [,3]
## [1,]    1    1    1
## [2,]    1    1    1
## [3,]    1    1    1
## 
## , , 2
## 
##      [,1] [,2] [,3]
## [1,]    2    2    2
## [2,]    2    2    2
## [3,]    2    2    2
## 
## , , 3
## 
##      [,1] [,2] [,3]
## [1,]    3    3    3
## [2,]    3    3    3
## [3,]    3    3    3
## [[1]]
##      [,1] [,2] [,3]
## [1,]    1    1    1
## [2,]    1    1    1
## [3,]    1    1    1
## 
## [[2]]
##      [,1] [,2] [,3]
## [1,]    2    2    2
## [2,]    2    2    2
## [3,]    2    2    2
## 
## [[3]]
##      [,1] [,2] [,3]
## [1,]    3    3    3
## [2,]    3    3    3
## [3,]    3    3    3
##       [,1] [,2]  [,3]
##  [1,] 16.6  140  20.6
##  [2,] 17.2  130  20.6
##  [3,] 17.6  126  20.4
##  [4,] 21.0  144  32.8
##  [5,] 21.4  162  37.6
##  [6,] 21.6  166  39.4
##  [7,] 22.0  132  31.2
##  [8,] 22.0  150  36.4
##  [9,] 22.2  160  45.2
## [10,] 22.4  150  39.8
## [11,] 22.6  158  48.4
## [12,] 22.8  152  42.0
## [13,] 22.8  152  42.8
## [14,] 23.4  138  42.6
## [15,] 24.0  150  38.2
## [16,] 25.8  148  44.4
## [17,] 25.8  170  67.6
## [18,] 26.6  172  54.8
## [19,] 27.4  142  51.4
## [20,] 27.6  128  49.8
## [21,] 28.0  156  69.0
## [22,] 28.4  160  63.4
## [23,] 29.0  148  72.6
## [24,] 32.0  144  76.6
## [25,] 32.6  154  85.2
## [26,] 34.6  162 110.8
## [27,] 35.0  164 111.4
## [28,] 35.8  160 116.6
## [29,] 36.0  160 103.0
## [30,] 36.0  160 102.0
## [31,] 41.2  174 154.0

COLABORADOR: Phd.Francisco Valverde Alulema.