2010-08-09 12 views
68

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

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

संदर्भ:

झाडू आर के मानक पुस्तकालय में एक समारोह है; यह विधि हस्ताक्षर है:

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 

आप देख सकते हैं, विधि हस्ताक्षर हालांकि 'स्वीप' 'लागू' के समान है एक और पैरामीटर, 'आंकड़े' की आवश्यकता है।

एक और महत्वपूर्ण अंतर यह है कि 'स्वीप' इनपुट सरणी के रूप में एक ही आकार की एक सरणी देता है, जबकि 'लागू करें' द्वारा दिया परिणाम समारोह में पारित पर निर्भर करता है।

कार्रवाई में स्वीप :

# 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 

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

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

+2

एम dx अपने परिणाम को दोहराने नहीं है। आपने अपने प्रश्न का उत्तर खुद ही दे दिया। – John

+0

'लागू' का एकमात्र उपयोग जिसे मैं इस परिणाम के लिए समझ सकता हूं वह कुछ है (लागू (टी (एम), 2, "-", डीएक्स)), लेकिन यह बहुत बुरा है। –

उत्तर

56

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

उदाहरण के लिए

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

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

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

+0

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

14

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

> 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 

दी, इस उदाहरण के लिए सरल है, लेकिन आँकड़े और मज़ा बदलते तर्क, अन्य कुशलताएं संभव हैं।

6

यह प्रश्न थोड़ा पुराना है, लेकिन चूंकि मैंने हाल ही में इस समस्या का सामना किया है, इसलिए स्वीप का एक सामान्य उपयोग आंकड़े फंक्शन cov.wt के लिए स्रोत कोड में पाया जा सकता है, जो भारित कॉन्वर्सिस मैट्रिस की गणना के लिए उपयोग किया जाता है। मैं आर 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 = "-", उपयोग कर रहा है जो थोड़ी देर के लिए मुझे भ्रमित कर दिया।

1

आप 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 

इस कोड (टी स्कोर के लिए कच्चे स्कोर परिवर्तित मतलब के साथ = 50 और एसडी = 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 
+0

यदि आप स्केल करने और केंद्र में जा रहे हैं तो आप केवल 'स्केल() 'का उपयोग क्यों नहीं करते हैं ??? ??? –

+1

जैसा कि मैंने उत्तर में उल्लेख किया है, क्योंकि मैं संदर्भ संदर्भ और एसडी के अनुसार वस्तुओं को स्केल करना चाहता हूं, वर्तमान नमूना का मतलब और एसडी नहीं। ऐसा तब होता है जब आप बड़े नमूनों में प्रशासित और मानकीकृत परीक्षणों से निपटते हैं, और आप अपने आंकड़ों के अनुसार अपने छोटे नमूना स्कोर को मानकीकृत करना चाहते हैं। – ehsan88

1

एक प्रयोग है आप एक सरणी के लिए भारित रकम की गणना कर रहे हैं जब। 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) 
संबंधित मुद्दे