'সুইপ' ফাংশন কীভাবে ব্যবহার করবেন


101

যখন আমি আর প্যাকেজগুলির উত্সটি দেখি, আমি ফাংশনটি 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তাদের নিজস্ব কোড ব্যবহার করেন।


4
এম-ডেক্স আপনার ফলাফলটিকে প্রতিলিপি দেয় না। আপনি আপনার নিজের প্রশ্নের উত্তর দিয়েছেন।
জন

এই applyফলাফলটির জন্য আমি যে একমাত্র ব্যবহার করতে পারি তা হ'ল এটির মতো t(apply(t(M), 2, "-", dx)), তবে এটি বেশ বাজে।
কেন উইলিয়ামস

উত্তর:


87

sweep()সাধারণত আপনি যখন সারি বা কলাম দ্বারা ম্যাট্রিক্স পরিচালনা করেন তখন ব্যবহৃত হয় এবং অপারেশনের অন্যান্য ইনপুট প্রতিটি সারি / কলামের জন্য আলাদা মান। আপনি সারি বা কলাম দ্বারা পরিচালনা করছেন কিনা হিসাবে হিসাবে মার্জিন দ্বারা সংজ্ঞায়িত করা হয় apply()। আমি "অন্যান্য ইনপুট" বলার জন্য ব্যবহৃত মানগুলি STATS দ্বারা সংজ্ঞায়িত করা হয়। সুতরাং, প্রতিটি সারি (বা কলাম) এর জন্য, আপনি STATS থেকে একটি মান নেবেন এবং FUN দ্বারা সংজ্ঞায়িত ক্রিয়াকলাপে ব্যবহার করবেন।

উদাহরণস্বরূপ, আপনি যদি নির্ধারিত ম্যাট্রিক্সের 1 ম সারিতে 1 টি, 2 য় 2 ইত্যাদি ইত্যাদি যোগ করতে চান তবে আপনি এটি করবেন:

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

আমি স্পষ্টভাবে আর ডকুমেন্টেশনে সংজ্ঞাটি বুঝতে পারি নি, আমি উদাহরণগুলি সন্ধান করেই শিখেছি।


4
সামান্য প্যারাফ্রেজ করতে: 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, সেই সাথে স্টেটস ফাংশনের সোর্স কোডে সুইপের একটি সাধারণ ব্যবহার পাওয়া যাবে , যা ভারী কোভেরিয়েন্স ম্যাট্রিক্সের কম্পিউটিংয়ের জন্য ব্যবহৃত হয়। আমি কোড 3.0 এ দেখছি। 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

এই কোডটি কাঁচা স্কোরগুলিকে টি স্কোরগুলিতে রূপান্তর করে (গড় = 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

4
@ বেনবোলকার যেমনটি আমি উত্তরে উল্লেখ করেছি, কারণ আমি আইটেমগুলি একটি রেফারেন্স গড় এবং এসডি অনুসারে স্কেল করতে চাই, বর্তমানের নমুনার নিজেই গড় এবং এসডি নয় not এটি ঘটে যখন আপনি বড় নমুনাগুলিতে পরিচালিত এবং মানকৃত পরীক্ষাগুলি মোকাবেলা করেন এবং আপনি তাদের ছোট পরিসংখ্যান স্কোরকে তাদের পরিসংখ্যান অনুসারে মানক করতে চান।
এহসান 88
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.