Quand je regarde la source des packages R, je vois la fonction sweep
utilisée assez souvent. Parfois, il est utilisé lorsqu'une fonction plus simple aurait suffi (par exemple, apply
), d'autres fois, il est impossible de savoir exactement ce qu'elle fait sans passer beaucoup de temps à parcourir le bloc de code dans lequel il se trouve.
Le fait que je puisse reproduire sweep
l'effet de en utilisant une fonction plus simple suggère que je ne comprends pas sweep
les principaux cas d'utilisation de cette fonction, et le fait que cette fonction soit utilisée si souvent suggère qu'elle est très utile.
Le contexte:
sweep
est une fonction de la bibliothèque standard de R; ses arguments sont:
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
Comme vous pouvez le voir, les arguments sont similaires à apply
bien sweep
nécessite un paramètre supplémentaire , STATS
.
Une autre différence clé est que sweep
renvoie un tableau de la même forme que le tableau d'entrée, alors que le résultat renvoyé par apply
dépend de la fonction transmise.
sweep
en action:
# 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
Donc, en résumé, ce que je recherche, c'est un cas d'utilisation exemplaire ou deux sweep
.
S'il vous plaît, ne récitez pas ou ne liez pas à la documentation R, aux listes de diffusion ou à l'une des sources R «primaires» - supposez que je les ai lues. Ce qui m'intéresse, c'est la façon dont les programmeurs / analystes R expérimentés utilisent sweep
dans leur propre code.
apply
que je peux comprendre pour ce résultat est quelque chose comme t(apply(t(M), 2, "-", dx))
, mais c'est assez méchant.