2014-12-01

Aplicar una función a cada columna en R

Title En R se puede aplicar una función a las columnas de una matriz o un data frame mediante la función apply

Problema

Por ejemplo, imaginemos que queremos calcular la media de las columnas del conjunto de datos trees, cargado por defecto en R. Deberemos especificar siempre el nombre del data frame (trees) seguido de $ y el nombre de la columna correspondiente.

mean(trees$Girth)
mean(trees$Height)
mean(trees$Volume)
[1] 13.24839
[1] 76
[1] 30.17097

Solución

Podemos obtener el mismo resultado con una sola línea de código, y sin necesidad de saber los nombres de las columnas, usando la función apply.

La sintaxis de apply(X, MARGIN, FUN, ...) es:

X la matriz o data frame
MARGIN para indicar la aplicación de la función. 1 indica por filas y 2 indica por columnas
FUN la función que deseamos aplicar

apply(trees, 2, mean)
   Girth   Height   Volume 
13.24839 76.00000 30.17097 

Notas

En nuestro ejemplo, no necesitaríamos utilizar la función apply, pues hay una función que específicamente calcula la media por columnas colMeans. Lo mismo en el caso de la función suma con la función colSums. Estas funciones son equivalentes a apply con FUN = mean o FUN = sum con MARGIN = 2, pero son mucho más rápidas.

colMeans(trees)
   Girth   Height   Volume 
13.24839 76.00000 30.17097 
colSums(trees)
 Girth Height Volume 
 410.7 2356.0  935.3 
Para otro tipo de funciones, sí que será aconsejable usar la función apply.

apply(trees, 2, shapiro.test) # Test de normalidad Shapiro-Wilk
$Girth

 Shapiro-Wilk normality test

data:  newX[, i]
W = 0.9412, p-value = 0.08893


$Height

 Shapiro-Wilk normality test

data:  newX[, i]
W = 0.9655, p-value = 0.4034


$Volume

 Shapiro-Wilk normality test

data:  newX[, i]
W = 0.8876, p-value = 0.003579

Referencias:

3 comentarios:

  1. Una pregunta, como hago contar la cantidad de faltantes en cada columna?

    ResponderEliminar
  2. Hola! Cómo podría aplicar una función que necesita datos de dos columnas de un data frame?

    ResponderEliminar
    Respuestas
    1. Hola Rocío. Plantea tu pregunta con un ejemplo reproducible en stackoverflow: https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example Saludos

      Eliminar

Nube de datos