Frage Wie benutzt man die Sweep-Funktion?


Wenn ich mir die Quelle von R-Paketen ansehe, sehe ich die Funktion sweep oft benutzt. Manchmal wird es verwendet, wenn eine einfachere Funktion ausgereicht hätte (z. B. apply), In anderen Fällen ist es unmöglich, genau zu wissen, worauf es hinausläuft eine Menge Zeit damit verbringen, durch den Codeblock zu gehen, in dem es sich befindet.

Die Tatsache, dass ich reproduzieren kann sweepDer Effekt mit einer einfacheren Funktion deutet darauf hin Ich verstehe nicht sweepDie wichtigsten Anwendungsfälle und die Tatsache, dass diese Funktion so oft verwendet wird, deutet darauf hin, dass es sehr nützlich ist.

Der Kontext:

sweep ist eine Funktion in der Standardbibliothek von R; Seine Argumente sind:

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

Wie Sie sehen können, sind die Argumente ähnlich apply obwohl sweep erfordert ein weiterer Parameter, STATS.

Ein weiterer wichtiger Unterschied ist, dass sweep gibt ein Array des gleiche Form als Eingabearray, während das Ergebnis von apply hängt von der übergebenen Funktion ab.

sweep in Aktion:

# 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

Alles in allem, was ich suche, ist ein beispielhafter Anwendungsfall oder zwei für sweep.

Bitte rezitieren oder verlinken Sie nicht auf die R-Dokumentation, Mailing-Listen oder irgendeine der 'primären' Quellen - gehen Sie davon aus, dass ich sie gelesen habe. Was mich interessiert, ist, wie erfahrene R-Programmierer / Analysten arbeiten sweep in ihrem eigenen Code.


75
2017-08-09 23:15


Ursprung


Antworten:


sweep wird normalerweise verwendet, wenn Sie eine Matrix nach Zeile oder Spalte betreiben, und die andere Eingabe der Operation ist ein anderer Wert für jede Zeile / Spalte. Ob Sie nach Zeile oder Spalte operieren, wird von MARGIN wie anwendbar definiert. Die Werte für das, was ich "die andere Eingabe" nannte, sind in STATS definiert. Für jede Zeile (oder Spalte) nehmen Sie also einen Wert aus STATS und verwenden ihn in der von FUN definierten Operation.

Wenn Sie beispielsweise 1 zu der ersten Zeile, 2 zu 2 usw. der von Ihnen definierten Matrix hinzufügen möchten, tun Sie Folgendes:

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

Ich habe die Definition in der R-Dokumentation auch nicht verstanden, ich habe es nur durch Nachschlagen von Beispielen gelernt.


59
2018-05-03 17:52



Mit sweep () können Sie eine große Matrix entweder spaltenweise oder zeilenweise systematisch bearbeiten:

> 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

Zugegeben, dieses Beispiel ist einfach, aber durch Ändern des STATS- und FUN-Arguments sind andere Manipulationen möglich.


15
2017-10-10 17:35



Diese Frage ist ein bisschen alt, aber da ich dieses Problem vor kurzem hatte, kann eine typische Verwendung von Sweep im Quellcode für die Statistikfunktion gefunden werden cov.wt, verwendet für die Berechnung gewichteter Kovarianzmatrizen. Ich schaue mir den Code in R 3.0.1 an. Hier sweep wird verwendet, um die Spaltenmittel vor der Berechnung der Kovarianz zu subtrahieren. In Zeile 19 des Codes wird der Zentrierungsvektor abgeleitet:

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

und in Zeile 54 wird es aus der Matrix herausgefegt

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

Der Autor des Codes verwendet den Standardwert FUN = "-", die mich für eine Weile verwirrt haben.


7
2018-01-26 01:19



Eine Verwendung ist, wenn Sie rechnen gewichtet Summen für ein Array. Woher rowSums oder colSums kann angenommen werden, dass es "Gewichte = 1" bedeutet, sweep kann vorher verwendet werden, um ein gewichtetes Ergebnis zu erhalten. Dies ist besonders nützlich für Arrays mit> = 3 Dimensionen.

Dies kommt z.B. bei der Berechnung einer gewichteten Kovarianzmatrix nach dem Beispiel von @James King.

Hier ist ein weiteres basierend auf einem aktuellen Projekt:

set.seed(1)
## 2x2x2 array
a1 <- array(as.integer(rnorm(8, 10, 5)), dim=c(2, 2, 2))
## 'element-wise' sum of matrices
## weights = 1
rowSums(a1, dims=2)
## weights
w1 <- c(3, 4)
## a1[, , 1] * 3;  a1[, , 2] * 4
a1 <- sweep(a1, MARGIN=3, STATS=w1, FUN="*")
rowSums(a1, dims=2)

2
2017-08-11 19:33



Du könntest benutzen sweep Funktion zum Skalieren und Zentrieren von Daten wie der folgende Code. Beachten Sie, dass means und sds sind hier willkürlich (Sie können einige Referenzwerte haben, denen Sie Daten basierend darauf standardisieren möchten):

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

Dieser Code konvertiert Rohwerte in T-Werte (mit Mittelwert = 50 und 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

1
2017-09-22 22:19