Supongamos que tengo una matriz by 2 y una función que toma un vector 2 como uno de sus argumentos. Me gustaría aplicar la función a cada fila de la matriz y obtener un n-vector. ¿Cómo hacer esto en R?
Por ejemplo, me gustaría calcular la densidad de una distribución Normal estándar 2D en tres puntos:
bivariate.density(x = c(0, 0), mu = c(0, 0), sigma = c(1, 1), rho = 0){
exp(-1/(2*(1-rho^2))*(x[1]^2/sigma[1]^2+x[2]^2/sigma[2]^2-2*rho*x[1]*x[2]/(sigma[1]*sigma[2]))) * 1/(2*pi*sigma[1]*sigma[2]*sqrt(1-rho^2))
}
out <- rbind(c(1, 2), c(3, 4), c(5, 6))
¿Cómo aplicar la función a cada fila de out
?
¿Cómo pasar valores para los otros argumentos además de los puntos a la función en la forma que especifique?
apply()
: barre por fila (cuando el segundo argumento es 1, si no por columna), y la fila actual (o col) es siempre el primer argumento. Así se definen las cosas.MARGIN
argumento. Aquí significa aplicar la función a las filas (la primera dimensión endim(M)
). Si fuera 2, aplicaría la función a las columnas.En caso de que quiera aplicar funciones comunes, tales como suma o media, se debe utilizar
rowSums
orowMeans
ya que son más rápido que elapply(data, 1, sum)
enfoque. De lo contrario, quédate conapply(data, 1, fun)
. Puede pasar argumentos adicionales después del argumento FUN (como Dirk ya sugirió):Entonces puedes hacer algo como esto:
fuente
Aquí hay un breve ejemplo de cómo aplicar una función a cada fila de una matriz. (Aquí, la función aplicada normaliza cada fila a 1.)
Nota: El resultado de la
apply()
tuvo que ser transpuesta utilizandot()
para obtener el mismo diseño que la matriz de entradaA
.Resultado:
fuente
El primer paso sería hacer que la función sea objeto, luego aplicarla. Si desea un objeto de matriz que tenga el mismo número de filas, puede predefinirlo y usar el formulario object [] como se ilustra (de lo contrario, el valor devuelto se simplificará a un vector):
Si desea utilizar otros parámetros distintos a los predeterminados, la llamada debe incluir argumentos con nombre después de la función:
apply () también se puede usar en matrices de dimensiones superiores y el argumento MARGIN puede ser un vector y un solo entero.
fuente
Aplicar funciona bien, pero es bastante lento. Usar sapply y vapply podría ser útil. El rowwise de dplyr también podría ser útil Veamos un ejemplo de cómo hacer un producto de fila de cualquier marco de datos.
Tenga en cuenta que asignar a variable antes de usar vapply / sapply / apply es una buena práctica ya que reduce mucho el tiempo. Veamos resultados de microbenchmark
Observe detenidamente cómo se usa t ()
fuente
b <- t(iris[1:10, 1:3])
yapply(b, 2 prod)
.Otro enfoque si desea usar una porción variable del conjunto de datos en lugar de un solo valor es usar
rollapply(data, width, FUN, ...)
. El uso de un vector de anchos le permite aplicar una función en una ventana variable del conjunto de datos. He usado esto para construir una rutina de filtrado adaptativo, aunque no es muy eficiente.fuente