'स्वीप' फ़ंक्शन का उपयोग कैसे करें


100

जब मैं आर संकुल के स्रोत को देखता हूं, तो मैं फ़ंक्शन का sweepउपयोग अक्सर देखता हूं । कभी-कभी इसका उपयोग तब किया जाता है जब एक सरल फ़ंक्शन पर्याप्त होगा (जैसे, apply), अन्य बार, यह जानना असंभव है कि कोड ब्लॉक के माध्यम से कदम उठाने के लिए उचित समय खर्च किए बिना यह क्या कर रहा है।

तथ्य यह है कि मैं sweepएक सरल फ़ंक्शन का उपयोग करके प्रभाव को पुन: उत्पन्न कर सकता हूं, यह बताता है कि मैं sweepकोर के उपयोग के मामलों को नहीं समझता हूं , और यह तथ्य कि इस फ़ंक्शन का उपयोग अक्सर किया जाता है, यह बताता है कि यह काफी उपयोगी है।

प्रसंग:

sweepआर के मानक पुस्तकालय में एक समारोह है; इसके तर्क हैं:

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

आप देख सकते हैं, तर्क के समान हैं apply, हालांकि sweep, एक और पैरामीटर की आवश्यकता है STATS

एक अन्य महत्वपूर्ण अंतर यह है कि इनपुट सरणी sweepके समान आकार का एक सरणी देता है , जबकि लौटाया गया परिणाम पास किए गए applyफ़ंक्शन पर निर्भर करता है।

sweep कार्रवाई में:

# 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

तो संक्षेप में, मैं जो देख रहा हूं वह एक अनुकरणीय उपयोग का मामला है या दो के लिए है sweep

कृपया, आर डॉक्यूमेंटेशन, मेलिंग सूचियों या किसी भी 'प्राथमिक' आर स्रोतों के बारे में न तो सुनें और न ही लिंक करें - मान लें कि मैंने उन्हें पढ़ा है। मैं जिस चीज में दिलचस्पी रखता हूं वह यह है कि अनुभवी आर प्रोग्रामर / विश्लेषक sweepअपने कोड में कैसे उपयोग करते हैं।


2
एम-डीएक्स आपके परिणाम को दोहराता नहीं है। आपने अपने प्रश्न का उत्तर खुद ही दे दिया।
जॉन

applyमैं इस परिणाम के लिए यह पता लगा सकता हूं कि इसका एकमात्र उपयोग कुछ ऐसा है t(apply(t(M), 2, "-", dx)), लेकिन यह बहुत बुरा है।
केन विलियम्स

जवाबों:


84

sweep()आम तौर पर तब उपयोग किया जाता है जब आप पंक्ति या स्तंभ द्वारा मैट्रिक्स संचालित करते हैं, और ऑपरेशन का अन्य इनपुट प्रत्येक पंक्ति / स्तंभ के लिए एक अलग मूल्य होता है। चाहे आप पंक्ति या स्तंभ द्वारा संचालित हों, मार्जिन द्वारा परिभाषित किया गया है, जैसे कि apply()। जिन मूल्यों के लिए मैंने "अन्य इनपुट" का उपयोग किया है उन्हें STATS द्वारा परिभाषित किया गया है। तो, प्रत्येक पंक्ति (या स्तंभ) के लिए, आप STATS से मान लेंगे और FUN द्वारा परिभाषित ऑपरेशन में उपयोग करेंगे।

उदाहरण के लिए, यदि आप परिभाषित की गई मैट्रिक्स की 1 से 1 पंक्ति, 2 से 2, आदि को जोड़ना चाहते हैं, तो आप यह करेंगे:

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

मुझे स्पष्ट रूप से आर प्रलेखन में परिभाषा समझ में नहीं आई है, मैंने केवल उदाहरणों को देखकर सीखा है।


2
थोड़ा पैराफेरेस करने के लिए: STATSइस चर के लिए एक बुरा लेबल लगता है। यह एक इनपुट है FUNजो मैट्रिक्स में प्रत्येक तत्व के मूल्य को संशोधित करने के लिए उपयोग किया जाता है ( Mइस उदाहरण में)। STATSचुने हुए के आकार से मेल खाते आकार का एक निरंतर या एक सूची / वेक्टर / आदि हो सकता है MARGIN। मुझे लगता है।
रोलैंड

16

झाडू () स्तंभ, या पंक्ति द्वारा पंक्ति में बड़े मैट्रिक्स को व्यवस्थित रूप से हेरफेर करने के लिए महान हो सकता है, जैसा कि नीचे दिखाया गया है:

> 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

दी गई, यह उदाहरण सरल है, लेकिन STATS और FUN तर्क को बदलने से अन्य जोड़तोड़ संभव हैं।


6

यह सवाल थोड़ा पुराना है, लेकिन जब से मैंने हाल ही में इस समस्या का सामना cov.wtकिया है, तो आँकड़ों के फंक्शन के लिए सोर्स कोड में स्वीप का इस्तेमाल किया जा सकता है , जिसका इस्तेमाल वेटेड कोवरियन मैट्रिसेस के कंप्यूटिंग के लिए किया जाता है। मैं R 3.0.1 में कोड देख रहा हूं। यहाँ sweepकोवरियस की गणना करने से पहले कॉलम का मतलब निकालने के लिए प्रयोग किया जाता है। कोड के लाइन 19 पर केंद्रित वेक्टर व्युत्पन्न है:

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

और लाइन 54 पर यह मैट्रिक्स से बाहर बह गया है

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

कोड का लेखक डिफ़ॉल्ट मान का उपयोग कर रहा है FUN = "-", जिसने मुझे थोड़ी देर के लिए भ्रमित कर दिया।


3

एक उपयोग तब होता है जब आप किसी सरणी के लिए भारित रकमों की गणना कर रहे होते हैं । जहाँ rowSumsया colSumsइसका अर्थ 'वज़न = 1' माना sweepजा सकता है, इससे पहले इसका उपयोग भारित परिणाम देने के लिए किया जा सकता है। यह> = 3 आयामों के साथ सरणियों के लिए विशेष रूप से उपयोगी है।

जब @ राजा के उदाहरण के अनुसार एक भारित सहसंयोजक मैट्रिक्स की गणना करते समय यह उदाहरण आता है।

यहाँ एक वर्तमान परियोजना पर आधारित एक और है:

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

आप sweepनिम्न कोड की तरह फ़ंक्शन को स्केल और केंद्र डेटा में उपयोग कर सकते हैं । ध्यान दें कि meansऔर sdsयहाँ मनमाना हैं (आपके पास कुछ संदर्भ मान हो सकते हैं जो आप उनके आधार पर डेटा को मानकीकृत करना चाहते हैं):

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

यह कोड कच्चे स्कोर को T स्कोर में परिवर्तित करता है (माध्य = 50 और 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
@BenBolker जैसा कि मैंने उत्तर में उल्लेख किया है, क्योंकि मैं एक संदर्भ माध्य और एसडी के अनुसार वस्तुओं को स्केल करना चाहता हूं, न कि वर्तमान नमूने का मतलब और एसडी। यह तब होता है जब आप बड़े नमूनों में प्रशासित और मानकीकृत परीक्षणों से निपटते हैं, और आप अपने आँकड़ों के अनुसार अपने छोटे नमूने स्कोर को मानकीकृत करना चाहते हैं।
एहसान88
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.