Kiedy patrzę na źródło pakietów R, widzę sweep
często używaną funkcję . Czasami jest używany, gdy prostsza funkcja wystarczyłaby (np. apply
), Innym razem nie można dokładnie wiedzieć, co robi, bez poświęcania dużej ilości czasu na przejście przez blok kodu, w którym się znajduje.
Fakt, że mogę odtworzyć sweep
efekt za pomocą prostszej funkcji, sugeruje, że nie rozumiem sweep
podstawowych przypadków użycia, a fakt, że ta funkcja jest używana tak często, sugeruje, że jest całkiem przydatna.
Kontekst:
sweep
jest funkcją w standardowej bibliotece języka R; jej argumenty to:
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
Jak widać, argumenty są podobne apply
, choć sweep
wymaga jeszcze jednego parametru STATS
.
Inną kluczową różnicą jest to, że sweep
zwraca tablicę o tym samym kształcie co tablica wejściowa, podczas gdy wynik zwracany przez apply
zależy od przekazanej funkcji.
sweep
w akcji:
# 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
Podsumowując, szukam przykładowego przypadku użycia lub dwóch dla sweep
.
Prosimy nie recytować ani nie łączyć się z dokumentacją R, listami mailingowymi ani żadnym z „głównych” źródeł języka R - załóżmy, że je przeczytałem. Interesuje mnie sposób, w jaki doświadczeni programiści / analitycy języka R wykorzystują sweep
swój własny kod.
źródło
apply
jakie mogę znaleźć dla tego wyniku, to coś w rodzajut(apply(t(M), 2, "-", dx))
, ale to dość paskudne.Odpowiedzi:
sweep()
jest zwykle używany, gdy operujesz macierzą według wiersza lub kolumny, a inne dane wejściowe operacji to inna wartość dla każdego wiersza / kolumny. To, czy operujesz wierszem, czy kolumną, definiuje MARGINES, jak w przypadkuapply()
. Wartości używane dla tego, co nazwałem „innym wejściem”, są zdefiniowane przez STATYSTYKI. Zatem dla każdego wiersza (lub kolumny) weźmiesz wartość ze STATS i użyjesz jej w operacji zdefiniowanej przez FUN.Na przykład, jeśli chcesz dodać 1 do pierwszego wiersza, 2 do drugiego itd. Zdefiniowanej macierzy, zrobisz:
Szczerze mówiąc, również nie rozumiałem definicji w dokumentacji R, po prostu nauczyłem się, patrząc na przykłady.
źródło
STATS
wydaje się być złą etykietą dla tej zmiennej. Jest to dane wejścioweFUN
używane do modyfikowania wartości każdego elementu w macierzy (M
w tym przykładzie).STATS
może być stałą lub listą / wektorem / itp. o rozmiarze pasującym do wybranego rozmiaruMARGIN
. Myślę.sweep () doskonale nadaje się do systematycznego manipulowania dużą macierzą kolumna po kolumnie lub wiersz po wierszu, jak pokazano poniżej:
To prawda, ten przykład jest prosty, ale po zmianie argumentu STATS i FUN, możliwe są inne manipulacje.
źródło
To pytanie jest trochę stare, ale ponieważ ostatnio miałem do czynienia z tym problemem, typowe użycie wobulacji można znaleźć w kodzie źródłowym funkcji stats
cov.wt
, używanej do obliczania ważonych macierzy kowariancji. Patrzę na kod w R 3.0.1. Tutajsweep
służy do odejmowania średnich kolumnowych przed obliczeniem kowariancji. W linii 19 kodu wyprowadzany jest wektor centrujący:aw linii 54 jest wymieciony z macierzy
Autor kodu używa wartości domyślnej
FUN = "-"
, co przez chwilę mnie zmyliło.źródło
Jednym z zastosowań jest obliczanie sum ważonych dla tablicy. Tam, gdzie
rowSums
lubcolSums
można założyć, że oznacza „wagi = 1”,sweep
można tego użyć wcześniej, aby uzyskać wynik ważony. Jest to szczególnie przydatne w przypadku tablic o wymiarach> = 3.Pojawia się to np. Przy obliczaniu ważonej macierzy kowariancji, jak na przykładzie @James King.
Oto kolejny oparty na bieżącym projekcie:
źródło
Możesz użyć
sweep
funkcji do skalowania i wyśrodkowywania danych, jak w poniższym kodzie. Zauważ, żemeans
isds
są tutaj arbitralne (możesz mieć pewne wartości odniesienia, które chcesz ujednolicić dane na ich podstawie):Ten kod konwertuje surowe wyniki na wyniki T (ze średnią = 50 i sd = 10):
źródło