Cuando miro la fuente de los paquetes R, veo la función que se sweepusa con bastante frecuencia. A veces se usa cuando una función más simple hubiera sido suficiente (por ejemplo, apply), otras veces, es imposible saber exactamente lo que está haciendo sin dedicar una buena cantidad de tiempo a recorrer el bloque de código en el que se encuentra.
El hecho de que pueda reproducir sweepel efecto usando una función más simple sugiere que no entiendo sweeplos casos de uso principales, y el hecho de que esta función se use con tanta frecuencia sugiere que es bastante útil.
El contexto:
sweepes una función en la biblioteca estándar de R; sus argumentos son:
sweep(x, MARGIN, STATS, FUN="-", check.margin=T, ...)
# x is the data
# STATS refers to the summary statistics which you wish to 'sweep out'
# FUN is the function used to carry out the sweep, "-" is the default
Como se puede ver, los argumentos son similares a applypesar de que sweeprequiere un parámetro más, STATS.
Otra diferencia clave es que sweepdevuelve una matriz de la misma forma que la matriz de entrada, mientras que el resultado devuelto por applydepende de la función pasada.
sweep en acción:
# e.g., use 'sweep' to express a given matrix in terms of distance from
# the respective column mean
# create some data:
M = matrix( 1:12, ncol=3)
# calculate column-wise mean for M
dx = colMeans(M)
# now 'sweep' that summary statistic from M
sweep(M, 2, dx, FUN="-")
[,1] [,2] [,3]
[1,] -1.5 -1.5 -1.5
[2,] -0.5 -0.5 -0.5
[3,] 0.5 0.5 0.5
[4,] 1.5 1.5 1.5
Entonces, en resumen, lo que estoy buscando es un caso de uso ejemplar o dos sweep.
Por favor, no recite ni enlace a la Documentación de R, las listas de correo ni ninguna de las fuentes de R "primarias", suponga que las he leído. Lo que me interesa es cómo los programadores / analistas experimentados de R utilizan sweepen su propio código.
fuente

applyeso que puedo averiguar para este resultado es algo asít(apply(t(M), 2, "-", dx)), pero eso es bastante desagradable.Respuestas:
sweep()se utiliza normalmente cuando se opera una matriz por fila o por columna, y la otra entrada de la operación es un valor diferente para cada fila / columna. Si opera por fila o columna está definido por MARGIN, como paraapply(). Los valores usados para lo que llamé "la otra entrada" están definidos por STATS. Entonces, para cada fila (o columna), tomará un valor de STATS y lo usará en la operación definida por FUN.Por ejemplo, si desea agregar 1 a la 1ra fila, 2 a la 2da, etc. de la matriz que definió, hará:
Francamente, tampoco entendí la definición en la documentación de R, solo aprendí buscando ejemplos.
fuente
STATSparece ser una mala etiqueta para esta variable. Es una entradaFUNque se usa para modificar el valor de cada elemento en la matriz (M, en este ejemplo).STATSpuede ser una constante o una lista / vector / etc. de un tamaño que coincida con el tamaño elegidoMARGIN. Yo creo que.sweep () puede ser excelente para manipular sistemáticamente una matriz grande, ya sea columna por columna o fila por fila, como se muestra a continuación:
Por supuesto, este ejemplo es simple, pero cambiando el argumento STATS y FUN, son posibles otras manipulaciones.
fuente
Esta pregunta es un poco antigua, pero como recientemente me enfrenté a este problema, se puede encontrar un uso típico de barrido en el código fuente de la función de estadísticas
cov.wt, que se utiliza para calcular matrices de covarianza ponderadas. Estoy mirando el código en R 3.0.1. Aquísweepse utiliza para restar las medias de las columnas antes de calcular la covarianza. En la línea 19 del código se deriva el vector de centrado:y en la línea 54 se elimina de la matriz
El autor del código está usando el valor predeterminado
FUN = "-", lo que me confundió por un tiempo.fuente
Un uso es cuando se calculan sumas ponderadas para una matriz. Donde
rowSumsocolSumsse puede suponer que significa 'pesos = 1',sweepse puede usar antes de esto para dar un resultado ponderado. Esto es particularmente útil para matrices con> = 3 dimensiones.Esto surge, por ejemplo, al calcular una matriz de covarianza ponderada según el ejemplo de @James King.
Aquí hay otro basado en un proyecto actual:
fuente
Puede usar la
sweepfunción para escalar y centrar datos como el siguiente código. Tenga en cuenta quemeansysdsson arbitrarios aquí (es posible que tenga algunos valores de referencia que desee estandarizar los datos en función de ellos):Este código convierte las puntuaciones brutas en puntuaciones T (con media = 50 y sd = 10):
fuente