Puedes seguir el tutorial por vídeo en https://youtu.be/qFq8RLYjyfo
Establezco el directorio de trabajo
setwd("~/Expression/Expression Encoder/Output/27 Operaciones por filas o columnas II")
Importo los datos
Datos = read.table("Potato.csv", header=T, sep="," , dec=".")
Estructura del comando apply apply (DataFrame, Margen, Funcion, Argumentos) Margen: 1 filas, 2 columnas
Queremos averiguar el peso total de cada muestra del ensayo, ya que nos han dado los datos de los pesos de las patatas de la muestra, clasificados por categoría.
apply (Datos[ , 3:6], 1, sum)
## [1] 20040 21420 23160 30210 22700 23760 7740 18520 17420 16020 10230
## [12] 20200 16110 14450 20180 19740 18880 23660
Datos$PesoTotalMuestra = apply (Datos[ , 3:6], 1, sum)
head (Datos,3)
## Tratamiento Variedad Peso40 Peso41a45 Peso46a60 PesoMas61 Numero40
## 1 Testigo Krone 380 1120 16180 2360 9
## 2 Testigo Krone 2000 1480 15600 2340 42
## 3 Testigo Krone 820 920 14840 6580 16
## Numero41a45 Numero46a60 NumeroMas61 PesoTotalMuestra
## 1 23 130 16 20040
## 2 25 124 14 21420
## 3 13 129 28 23160
Para averiguar el peso total por categoría, sumaremos por columna (categorías) en vez de por filas (muestras)
TotPesosCat = apply (Datos[ , 3:6], 2, sum)
TotPesosCat
## Peso40 Peso41a45 Peso46a60 PesoMas61
## 24300 36580 242550 41010
Los que hayais visto el vídeo de Sumar filas y columnas, os habréis dado cuenta de que el resultado es el mismo que cuando utilizamos los comandos rowSums y colSums. rowSums equivale a apply(DF, 1, sum) rowMeans equivale a apply(DF, 1, mean) colSums equivale a apply(DF, 2, sum) colMeans equivale a apply(DF, 2, mean)
Pero es que con apply(), además de sumar, podemos hacer otras operaciones que vienen cargadas por defecto en R.
getGroupMembers("Summary")
## [1] "max" "min" "range" "prod" "sum" "any" "all"
Así por ejemplo, podemos obtener el rango de los números de patatas por categorías.
apply (Datos[ , 7:10], 2, min)
## Numero40 Numero41a45 Numero46a60 NumeroMas61
## 3 5 44 0
apply (Datos[ , 7:10], 2, max)
## Numero40 Numero41a45 Numero46a60 NumeroMas61
## 71 60 138 44
apply (Datos[ , 7:10], 2, range)
## Numero40 Numero41a45 Numero46a60 NumeroMas61
## [1,] 3 5 44 0
## [2,] 71 60 138 44
Hay además otras operaciones aritméticas que vienen cargadas por defecto, como la media (mean), la varianza (var), la desviación estándar (sd) o la mediana (median).
apply (Datos[ , 7:10], 2, mean)
## Numero40 Numero41a45 Numero46a60 NumeroMas61
## 27.000000 26.222222 107.388889 9.888889
También podemos personalizar la función. Por ejemplo, vamos a pasar las unidades del peso de las sub-muestras de gramos a kilogramos. Para ello dividimos las mismas columnas de antes entre 1000.
PesosCatKg = apply (Datos[ , 3:6], 2, function(x) x/1000)
head (PesosCatKg)
## Peso40 Peso41a45 Peso46a60 PesoMas61
## [1,] 0.38 1.12 16.18 2.36
## [2,] 2.00 1.48 15.60 2.34
## [3,] 0.82 0.92 14.84 6.58
## [4,] 0.13 1.12 17.18 11.78
## [5,] 1.84 1.24 12.58 7.04
## [6,] 0.70 0.88 19.12 3.06
Si lo que queremos es tener el total por categoría en kg.
TotPesosCatKg = apply (Datos[ , 3:6], 2, function(x) sum(x)/1000)
TotPesosCatKg
## Peso40 Peso41a45 Peso46a60 PesoMas61
## 24.30 36.58 242.55 41.01