Wenn ich mir die Quelle von R-Paketen ansehe, sehe ich die sweep
häufig verwendete Funktion . Manchmal wird es verwendet, wenn eine einfachere Funktion ausgereicht hätte (z. B. apply
), manchmal ist es unmöglich, genau zu wissen, was es tut, ohne eine angemessene Zeit damit zu verbringen, den Codeblock zu durchlaufen, in dem es sich befindet.
Die Tatsache, dass ich den sweep
Effekt mit einer einfacheren Funktion reproduzieren kann , deutet darauf hin , dass ich die wichtigsten Anwendungsfälle nicht verstehe sweep
, und die Tatsache, dass diese Funktion so oft verwendet wird, legt nahe, dass sie 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 wie apply
wenn sweep
man erfordert mehr Parameter STATS
.
Ein weiterer wesentlicher Unterschied besteht darin, dass sweep
ein Array mit derselben Form wie das Eingabearray zurückgegeben wird, während das von zurückgegebene Ergebnis von apply
der übergebenen Funktion abhängt.
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 suche ich also ein oder zwei beispielhafte Anwendungsfälle für sweep
.
Bitte rezitieren oder verlinken Sie nicht auf die R-Dokumentation, Mailinglisten oder eine der 'primären' R-Quellen - vorausgesetzt, ich habe sie gelesen. Mich interessiert, wie erfahrene R-Programmierer / Analysten sweep
ihren eigenen Code verwenden.
quelle
apply
, die ich für dieses Ergebnis herausfinden kann, ist so etwas wiet(apply(t(M), 2, "-", dx))
, aber das ist ziemlich böse.Antworten:
sweep()
wird normalerweise verwendet, wenn Sie eine Matrix zeilen- oder spaltenweise bearbeiten und die andere Eingabe der Operation für jede Zeile / Spalte einen anderen Wert hat. Ob Sie nach Zeilen oder Spalten arbeiten, wird wie bei MARGIN festgelegtapply()
. Die Werte, die für das verwendet werden, was ich "die andere Eingabe" nannte, werden von STATS definiert. Für jede Zeile (oder Spalte) nehmen Sie einen Wert aus STATS und verwenden ihn in der durch FUN definierten Operation.Wenn Sie beispielsweise 1 zur 1. Zeile, 2 zur 2. usw. der von Ihnen definierten Matrix hinzufügen möchten, gehen Sie wie folgt vor:
Ich habe die Definition in der R-Dokumentation offen gesagt auch nicht verstanden, sondern nur durch Nachschlagen von Beispielen gelernt.
quelle
STATS
scheint eine schlechte Bezeichnung für diese Variable zu sein. Diese EingabeFUN
wird verwendet, um den Wert jedes Elements in der Matrix zu ändern (M
in diesem Beispiel).STATS
kann entweder eine Konstante oder eine Liste / ein Vektor / usw. mit einer Größe sein, die der Größe der gewählten Größe entsprichtMARGIN
. Meiner Ansicht nach.sweep () kann sich hervorragend dazu eignen, eine große Matrix entweder spaltenweise oder zeilenweise systematisch zu bearbeiten, wie unten gezeigt:
Zugegeben, dieses Beispiel ist einfach, aber wenn Sie das Argument STATS und FUN ändern, sind andere Manipulationen möglich.
quelle
Diese Frage ist etwas alt, aber da ich kürzlich mit diesem Problem konfrontiert war, findet sich im Quellcode für die Statistikfunktion
cov.wt
, die zur Berechnung gewichteter Kovarianzmatrizen verwendet wird, eine typische Verwendung von Sweep . Ich schaue mir den Code in R 3.0.1 an. Hiersweep
wird verwendet, um Spaltenmittelwerte vor dem Berechnen der Kovarianz zu subtrahieren. In Zeile 19 des Codes wird der Zentrierungsvektor abgeleitet:und in Zeile 54 wird es aus der Matrix herausgefegt
Der Autor des Codes verwendet den Standardwert
FUN = "-"
, was mich eine Weile verwirrt hat.quelle
Eine Verwendung ist, wenn Sie gewichtete Summen für ein Array berechnen . Wo
rowSums
odercolSums
angenommen werden kann, dass '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 tritt beispielsweise bei der Berechnung einer gewichteten Kovarianzmatrix gemäß dem Beispiel von @James King auf.
Hier ist eine andere, die auf einem aktuellen Projekt basiert:
quelle
Sie können die
sweep
Funktion verwenden, um Daten wie den folgenden Code zu skalieren und zu zentrieren. Beachten Sie, dassmeans
undsds
hier willkürlich sind (möglicherweise haben Sie einige Referenzwerte, mit denen Sie Daten basierend darauf standardisieren möchten):Dieser Code konvertiert Rohwerte in T-Werte (mit Mittelwert = 50 und SD = 10):
quelle