Cuando miro la fuente de los paquetes R, veo la función que se sweep
usa 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 sweep
el efecto usando una función más simple sugiere que no entiendo sweep
los casos de uso principales, y el hecho de que esta función se use con tanta frecuencia sugiere que es bastante útil.
El contexto:
sweep
es 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 apply
pesar de que sweep
requiere un parámetro más, STATS
.
Otra diferencia clave es que sweep
devuelve una matriz de la misma forma que la matriz de entrada, mientras que el resultado devuelto por apply
depende 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 sweep
en su propio código.
fuente
apply
eso 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
STATS
parece ser una mala etiqueta para esta variable. Es una entradaFUN
que se usa para modificar el valor de cada elemento en la matriz (M
, en este ejemplo).STATS
puede 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ísweep
se 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
rowSums
ocolSums
se puede suponer que significa 'pesos = 1',sweep
se 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
sweep
función para escalar y centrar datos como el siguiente código. Tenga en cuenta quemeans
ysds
son 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