Ketika saya melihat sumber Paket R, saya melihat fungsi yang sweep
digunakan cukup sering. Kadang-kadang digunakan ketika fungsi yang lebih sederhana sudah cukup (misalnya, apply
), di lain waktu, tidak mungkin untuk mengetahui dengan tepat apa yang dilakukannya tanpa menghabiskan cukup banyak waktu untuk melangkah melalui blok kode di dalamnya.
Fakta bahwa saya dapat mereproduksi sweep
efek menggunakan fungsi yang lebih sederhana menunjukkan bahwa saya tidak memahami sweep
kasus penggunaan inti, dan fakta bahwa fungsi ini sering digunakan menunjukkan bahwa ini cukup berguna.
Isi:
sweep
adalah fungsi di perpustakaan standar R; argumennya adalah:
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
Seperti yang Anda lihat, argumennya mirip apply
meskipun sweep
membutuhkan satu parameter lagi STATS
,.
Perbedaan utama lainnya adalah sweep
mengembalikan larik dengan bentuk yang sama seperti larik masukan, sedangkan hasil yang dikembalikan apply
bergantung pada fungsi yang diteruskan.
sweep
sedang beraksi:
# 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
Singkatnya, yang saya cari adalah satu atau dua contoh kasus penggunaan sweep
.
Harap, jangan membaca atau menautkan ke Dokumentasi R, milis, atau sumber R 'utama' - anggap saja saya telah membacanya. Yang saya minati adalah bagaimana programmer / analis R berpengalaman menggunakan sweep
kode mereka sendiri.
sumber
apply
yang bisa saya temukan untuk hasil ini adalah sesuatu sepertit(apply(t(M), 2, "-", dx))
, tapi itu cukup buruk.Jawaban:
sweep()
biasanya digunakan saat Anda mengoperasikan matriks demi baris atau kolom, dan input operasi lainnya adalah nilai yang berbeda untuk setiap baris / kolom. Apakah Anda beroperasi menurut baris atau kolom ditentukan oleh MARGIN, seperti untukapply()
. Nilai yang digunakan untuk apa yang saya sebut "input lain" ditentukan oleh STATS. Jadi, untuk setiap baris (atau kolom), Anda akan mengambil nilai dari STATS dan digunakan dalam operasi yang ditentukan oleh FUN.Misalnya, jika Anda ingin menambahkan 1 ke baris pertama, 2 ke baris ke-2, dll. Dari matriks yang Anda tentukan, Anda akan melakukan:
Terus terang saya juga tidak mengerti definisi dalam dokumentasi R, saya hanya belajar dengan melihat contoh.
sumber
STATS
tampaknya menjadi label yang buruk untuk variabel ini. Ini adalah inputFUN
yang digunakan untuk mengubah nilai setiap elemen dalam matriks (M
, dalam contoh ini).STATS
dapat berupa konstanta atau daftar / vektor / dll dengan ukuran yang sesuai dengan ukuran yang dipilihMARGIN
. Kupikir.sweep () bisa sangat bagus untuk memanipulasi matriks besar secara sistematis baik kolom demi kolom, atau baris demi baris, seperti yang ditunjukkan di bawah ini:
Memang, contoh ini sederhana, tetapi mengubah argumen STATS dan FUN, manipulasi lain dimungkinkan.
sumber
Pertanyaan ini agak lama, tetapi karena saya baru saja menghadapi masalah ini, penggunaan sapuan yang khas dapat ditemukan di kode sumber untuk fungsi statistik
cov.wt
, yang digunakan untuk menghitung matriks kovarians berbobot. Saya melihat kode di R 3.0.1. Di sinisweep
digunakan untuk mengurangi rata-rata kolom sebelum menghitung kovarian. Pada baris 19 kode vektor pemusatan diturunkan:dan pada baris 54 itu disapu dari matriks
Penulis kode menggunakan nilai default
FUN = "-"
, yang membuat saya bingung untuk sementara waktu.sumber
Salah satu kegunaannya adalah saat Anda menghitung jumlah tertimbang untuk sebuah larik. Dimana
rowSums
ataucolSums
dapat diasumsikan berarti 'bobot = 1',sweep
dapat digunakan sebelumnya untuk memberikan hasil yang berbobot. Ini sangat berguna untuk array dengan> = 3 dimensi.Ini muncul misalnya saat menghitung matriks kovarians tertimbang sesuai contoh @James King.
Inilah yang lain berdasarkan proyek saat ini:
sumber
Anda dapat menggunakan
sweep
fungsi untuk menskalakan dan memusatkan data seperti kode berikut. Perhatikan bahwameans
dansds
sewenang-wenang di sini (Anda mungkin memiliki beberapa nilai referensi yang ingin Anda standarisasi datanya berdasarkan nilai tersebut):Kode ini mengubah skor mentah menjadi skor T (dengan mean = 50 dan sd = 10):
sumber