'Süpürme' işlevi nasıl kullanılır


101

R Paketlerinin kaynağına baktığımda, işlevin sweepoldukça sık kullanıldığını görüyorum . Bazen daha basit bir işlev yeterli olduğunda kullanılır (örneğin apply), diğer zamanlarda, içinde bulunduğu kod bloğuna geçmek için makul bir süre harcamadan tam olarak ne yaptığını bilmek imkansızdır.

Daha sweepbasit bir işlev kullanarak efektini yeniden oluşturabildiğim gerçeği, sweeptemel kullanım durumlarını anlamadığımı gösteriyor ve bu işlevin çok sık kullanılması gerçeği oldukça kullanışlı olduğunu gösteriyor.

Bağlam:

sweepR'nin standart kütüphanesindeki bir fonksiyondur; argümanları şunlardır:

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

Gördüğünüz gibi, argümanlar benzer applyolsa sweep, bir daha parametre gerekir STATS.

Diğer bir önemli fark, girdi dizisiyle aynı şekle sahipsweep bir dizi döndürmesidir , oysa döndürülen sonuç , iletilen işleve bağlıdır.apply

sweep eylemde:

# 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

Özetle, aradığım şey, örnek bir veya iki kullanım durumu sweep.

Lütfen R Belgelerini, posta listelerini veya 'birincil' R kaynaklarından herhangi birini okumayın veya bunlara bağlantı vermeyin - bunları okuduğumu varsayın. Benim ilgilendiğim şey, deneyimli R programcılarının / analistlerinin sweepkendi kodlarını nasıl kullandıklarıdır .


2
M-dx sonucunuzu çoğaltmaz. Kendi sorunuzu cevapladınız.
John

Bunun applybu sonuç için anlayabildiğim tek kullanımı şuna benzer t(apply(t(M), 2, "-", dx)), ama bu oldukça kötü.
Ken Williams

Yanıtlar:


84

sweep()genellikle bir matrisi satıra veya sütuna göre çalıştırdığınızda kullanılır ve işlemin diğer girdisi her satır / sütun için farklı bir değerdir. Satır veya sütuna göre işlem yapıp yapmadığınız, MARGIN tarafından tanımlanır apply(). "Diğer girdi" dediğim şey için kullanılan değerler STATS tarafından tanımlandı. Dolayısıyla, her satır (veya sütun) için STATS'tan bir değer alacak ve FUN tarafından tanımlanan işlemde kullanacaksınız.

Örneğin, tanımladığınız matrisin 1. satırına 1, 2. satırına 2, vb. Eklemek isterseniz, yapacaksınız:

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

Açıkçası R dokümantasyonundaki tanımı da anlamadım, sadece örneklere bakarak öğrendim.


2
biraz açıklamak gerekirse: STATSbu değişken için kötü bir etiket gibi görünüyor. Bu FUN, matristeki her bir öğenin değerini değiştirmek için kullanılan bir girdidir ( Mbu örnekte). STATSsabit veya seçilen boyutla eşleşen boyutta bir liste / vektör / vb olabilir MARGIN. Bence.
Roland

16

sweep (), aşağıda gösterildiği gibi, büyük bir matrisi sistematik olarak sütun sütun veya satır satır işlemek için harika olabilir:

> 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

Verilmiş, bu örnek basittir, ancak STATS ve EĞLENCE argümanını değiştirerek başka manipülasyonlar mümkündür.


6

Bu soru biraz eski, ancak son zamanlarda bu sorunla karşılaştığımdan beri cov.wt, ağırlıklı kovaryans matrislerini hesaplamak için kullanılan istatistik işlevinin kaynak kodunda tipik bir süpürme kullanımı bulunabilir . R 3.0.1'deki koda bakıyorum. Burada sweepkovaryansı hesaplamadan önce sütun ortalamalarını çıkarmak için kullanılır. Kodun 19. satırında merkezleme vektörü türetilir:

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

ve 54. satırda matristen çıkarılır

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

Kodun yazarı, FUN = "-"bir süredir kafamı karıştıran varsayılan değeri kullanıyor .


3

Bir kullanım, bir dizi için ağırlıklı toplamları hesaplamaktır . Burada rowSumsya da colSumsağırlıkları = 1 'anlamına varsayılabilir, sweepağırlıklı bir sonuç elde önce bu kullanılabilir. Bu, özellikle> = 3 boyutlu diziler için kullanışlıdır.

Bu, örneğin @ James King'in örneğine göre ağırlıklı bir kovaryans matrisi hesaplanırken ortaya çıkar.

İşte mevcut bir projeye dayalı bir başkası:

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)

0

sweepAşağıdaki kod gibi verileri ölçeklemek ve ortalamak için işlevi kullanabilirsiniz . Not olduğunu meansve sdsburada keyfi vardır (eğer onlara göre verileri standart olarak kullanmak isteyen bazı referans değerlerine sahip olabilir):

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

Bu kod, ham puanları T puanlarına dönüştürür (ortalama = 50 ve sd = 10 ile):

> 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
Cevapta bahsettiğim gibi @BenBolker, çünkü maddeleri mevcut örneğin kendisinin ortalama ve sd'sine değil, bir referans ortalamasına ve sd'ye göre ölçeklendirmek isteyebilirim. Büyük örneklerde uygulanan ve standartlaştırılan testlerle uğraşırken ve küçük örnek puanınızı istatistiklerine göre standartlaştırmak istediğinizde ortaya çıkar.
Ehsan88
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.