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.
df<-data.frame(x=1:4, y=5:8, z=10:13)
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)
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)
##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)
## 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
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))
precio<-data_set$precio
tienda<-data_set$tienda
tipo<-factor(data_set$tipo,
labels = c("juguetes", "comida", "electrónica", "bebidas"))
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)
f<-function(x) mean(x, na.rm=TRUE)
tapply(data_set$precio, data_set$tienda, f)
##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)
## 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
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))
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)
##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)
## [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
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)
sapply(c(3, 5, 7), exp)
lapply(c(3, 5, 7), exp)
##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)))
## [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