112 votes

Comment utiliser la fonction R «Balayage»

Quand je regarde la source de Packages R, je vois la fonction de balayage utilisé assez souvent. Parfois, il est utilisé lorsqu'une simple fonction, aurait suffi (par exemple, "appliquer"), d'autres fois, il est impossible de savoir exactement ce qu'il est en train de faire sans passer un peu de temps à l'étape à travers le bloc de code c'est dans.

le fait que je puisse reproduire le balayage de l'effet à l'aide d'une simple fonction suggère que je ne comprends pas de balayage de la base de cas d'utilisation, et le fait que cette fonction est utilisée pour le suggère souvent que c'est très utile.

Le contexte:

sweep est une fonction de R de la bibliothèque standard; c'est la signature de la méthode est:

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, la signature de la méthode est semblable à la 'demande' si 'balayage' exige un paramètre plus, 'STATS'.

Une autre différence essentielle est que, 'balayage' retourne un tableau de la même forme que le tableau d'entrée, tandis que le résultat retourné par "appliquer" dépend de la fonction de transmission.

Balayage 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 somme, ce que je cherche est un modèle de cas d'utilisation ou les deux pour les de balayer.

S'il vous plaît, ne pas réciter ou un lien vers la R de la Documentation, listes de diffusion, ou l'un des "primaires" R sources--supposons que j'ai lus. Ce qui m'intéresse est de savoir comment expérimentée de R programmeurs/analystes utilisent le balayage dans leur propre code.

98voto

Daniele Merico Points 216

sweep est généralement utilisé lorsque vous utilisez une matrice par ligne ou par colonne, et l'autre entrée de l'opération est d'une valeur différente pour chaque ligne / colonne. Si vous exploitez en ligne ou une colonne est définie par la MARGE, comme pour les appliquer. Les valeurs utilisées pour ce que j'ai appelé "l'autre entrée" est défini par les STATS. Ainsi, pour chaque ligne (ou colonne), vous allez vous prendre une valeur à partir de STATISTIQUES et de les utiliser dans l'opération définie par le PLAISIR.

Par exemple, si vous souhaitez ajouter 1 à la 1ère colonne, 2 pour le 2ème, etc... de la matrice que vous avez défini, vous devez le faire:

sweep (M, 1, c (1: 4), "+")

Franchement, je ne comprends pas la définition de la R de la documentation soit, je viens d'apprendre en regardant des exemples.

16voto

Brad Horn Points 126

sweep () peut être utile pour manipuler systématiquement une grande matrice, colonne par colonne ou ligne par ligne, comme indiqué ci-dessous:

 > print(size)
     Weight Waist Height
[1,]    130    26    140
[2,]    110    24    155
[3,]    118    25    142
[4,]    112    25    175
[5,]    128    26    170

> sweep(size, 2, c(10, 20, 30), "+")
     Weight Waist Height
[1,]    140    46    170
[2,]    120    44    185
[3,]    128    45    172
[4,]    122    45    205
[5,]    138    46    200
 

Certes, cet exemple est simple, mais en changeant les arguments STATS et FUN, d’autres manipulations sont possibles.

6voto

James King Points 2414

Cette question est un peu vieux, mais depuis que j'ai récemment été confronté à ce problème une utilisation typique de balayage peut être trouvé dans le code source pour les statistiques de la fonction cov.wt, utilisée pour le calcul pondéré des matrices de covariance. Je suis en train de regarder le code dans la R 3.0.1. Ici, sweep est utilisée pour soustraire de la colonne signifie avant le calcul de la covariance. Sur la ligne 19 du code de l'centrage vecteur est dérivé:

 center <- if (center) 
        colSums(wt * x)
    else 0

et sur la ligne 54 il est balayé en dehors de la matrice

x <- sqrt(wt) * sweep(x, 2, center, check.margin = FALSE)

L'auteur du code, c'est à l'aide de la valeur par défaut FUN = "-", qui m'ont troublé pendant un certain temps.

0voto

Ehsan Abd Points 375

Vous pouvez utiliser la fonction sweep pour redimensionner et centrer des données comme le code suivant. Notez que means et sds sont arbitraires ici (vous pouvez avoir certaines valeurs de référence pour lesquelles vous souhaitez normaliser les données):

 df=matrix(sample.int(150, size = 100, replace = FALSE),5,5)

df_means=t(apply(df,2,mean))
df_sds=t(apply(df,2,sd))

df_T=sweep(sweep(df,2,df_means,"-"),2,df_sds,"/")*10+50
 

Ce code convertit les scores bruts en scores T (moyenne = 50 et sd = 10):

 > df
     [,1] [,2] [,3] [,4] [,5]
[1,]  109    8   89   69   15
[2,]   85   13   25  150   26
[3,]   30   79   48    1  125
[4,]   56   74   23  140  100
[5,]  136  110  112   12   43
> df_T
         [,1]     [,2]     [,3]     [,4]     [,5]
[1,] 56.15561 39.03218 57.46965 49.22319 40.28305
[2,] 50.42946 40.15594 41.31905 60.87539 42.56695
[3,] 37.30704 54.98946 47.12317 39.44109 63.12203
[4,] 43.51037 53.86571 40.81435 59.43685 57.93136
[5,] 62.59752 61.95672 63.27377 41.02349 46.09661
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X