Tutorial sobre algunas formas de hacer operaciones en un Data Frame en R, utilizando funciones de la familia apply().

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