تمرین تشکیل حلقه با توابع خانواده apply در R

1402/06/14

دسترسی سریع


نام دانشجو : آذین عیوضلو تمرین : تشکیل حلقه با توابع خانواده apply ----------------------------------------------------------------------------------------- تشکیل حلقه با توابع خانواده apply توابع خانواده apply برای به کارگیری یک تابع خاص بر روی همه و یا بخشی از عناصر (ردیف ها و یا ستون ها) در یک ماتریس، آرایه و یا داده چارچوب دار مورد استفاده قرار میگیرند. توابع زیادی در این خانواده وجود دارند که کارکرد اصلی آنها تا حد زیادی مشابه یکدیگر میباشد (apply(),tapply(), sapply(),…). به عنوان مثال، در محاصبه میانگین داده ها تابع apply() به ما کمک میکند تا تابع mean() را برای بخش های مورد نظر از داده ها تکرار نماییم. مثال: داده های فرضی زیر را در نظر بگیرید که وزن سه متغیر age,score,grade برای 4 فرد اندازه گیری و در آبجکت dataclass دخیره شده اند. میخواهیم میانگین هر یک از متغیر ها را جداگانه محاسبه نماییم. برای انجام این کار چندین روش وجود دارد. ابتدا میتوانیم برای هریک از متغیر ها تابع mean() را به کار ببریم.

 ->dataclass<

   ((data.frame(score=c(38.5,28.9,25.6,45),grade=c(5,5,6,4),age=c(17,16,15,15

(  mean(dataclass$score<

[1] 34.5

( mean(dataclass$grade<

[1] 5

(  mean(dataclass$age<

[1] 15.75

  مقادیر سه متغیر grade-score-age  در آبجکتی تحت عنوان data frame نسبت داده شده اند. که بهترین روش وارد کردن داده ها در R تشکیل یک ساختار چارچوب دار است. ساده ترین روش برای وارد کردن داده های کم حجم استفاده از تابع (cc) است حال با استفاده از دستور mean(data$...) میانگین هر متغیر به طور جداگانه حساب شده. همانطور که مشاهده میکنیم، برای محاسبه میانگین متغیر ها تابع apply به کار رفته است. تابع apply() تشکیل یک حلقه داده است که در آن تابع mean() در هر دور به ترتیب روی یکی از متغیر ها به کار رفته است. همان گونه که مشاهده میشود میانگین همه متغیر ها مستلزم به کارگیری تابع mean() به تعداد متغیر هاست. روش دیگر استفاده از تابع apply() میباشد.  

(Apply(dataclass, 2 , mean<

Score   grade    age

34.50  5.00     15.75

  با دستور apply() هر سه متغیر میانگین هایشان به صورت یک جا آورده شده است.   برهان دوم که در اینجا 2 در نظر گرفته شده است به تابع میگوید که میانگین روی ستون ها محسبه گردد و یا روی ردیف ها( برهان برابر با 1). همان گونه که ملاحظه تابع mean() در هر دور به ترتیب روی یکی از متغیر ها به کار میرود. تابع by() نیز عملکردی شبیه به توابع خانواده apply  دارد که میتواند محاسبات را روی یکی بخش های مشخصی از داده ها به کار ببرد. برای آشنایی با نهوه استفاده از تابع by() مثالی از کتاب طرح های آزمایشی در کشاورزی1 (ولی زاده و مقدم 1375) را که پیش تر در بحث اسپلیت پلات (فصل 6) مورد تجزیه قرار گرفت را بررسی مینماییم.  

( data.fertilizer<-read.table("D:\\my data\\root.txt",header=T<

  data.fertilizer<

   block nitrogen green   root

1      1        1     1 34.086

2      1        1     2 38.285

3      1        1     3 51.870

4      1        1     4 46.683

5      1        2     1 47.671

6      1        2     2 54.834

7      1        2     3 62.491

8      1        2     4 63.973

9      2        1     1 33.345

10     2        1     2 37.050

11     2        1     3 56.069

12     2        1     4 45.201

13     2        2     1 44.460

14     2        2     2 59.774

15     2        2     3 61.256

16     2        2     4 65.949

17     3        1     1 32.604

18     3        1     2 37.544

19     3        1     3 55.081

20     3        1     4 48.412

21     3        2     1 50.635

22     3        2     2 62.738

23     3        2     3 70.148

24     3        2     4 68.172

( attach(data.fertilizer<

  در این قسمت از داده های فصل 6 استفاده شده است. داده ها را در excel وارد و در text ذخیره کردیم و با استفاده از دستور read.table برای فراخوانی داده ها در R استفاده کردیم. (header=T به برنامه میگوید تا نام متغیر ها در فایل اصلی داده ها معتبر باشد) چنانچه داده ها پیوست نشده اند، قبل از اجرای دستور فوق باید آنهارا با تابع attach() پیوست نماییم. در واقع برای دسترسی مستقیم به متغیر های موجود در داده، از تابع attach() استفاده شد  

( by(data.fertilizer[4],green,mean<

green: 1

 40.46683[1]

------------------------------------------------------------

green: 2

 48.37083[1]

------------------------------------------------------------

green: 3

 59.48583[1]

------------------------------------------------------------

green: 4

 56.39833[1]

همان طورکه مشاهده میشود تابع by() به برنامه میگوید که میانگین متغیر root را برای سطوح متغیر green محاسبه نماید.   By() عملکردی همانند apply() دارد. در اینجا از ستون data.fertilizer میانگین معغیر را برای سطح gren به دست آوردیم. میانگین 1-2-3-4 هرکدام جداگانه حساب شده اند. برای green(1)= 40.46683 – 2:43.37083 – 3=50.48583 – 4=56.39833  

Examples

## Compute row and column sums for a matrix:

x <- cbind(x1 = 3, x2 = c(4:1, 2:5))

dimnames(x)[[1]] <- letters[1:8]

apply(x, 2, mean, trim = .2)

col.sums <- apply(x, 2, sum)

row.sums <- apply(x, 1, sum)

rbind(cbind(x, Rtot = row.sums), Ctot = c(col.sums, sum(col.sums)))

stopifnot( apply(x, 2, is.vector))

## Sort the columns of a matrix

apply(x, 2, sort)

##- function with extra args:

cave <- function(x, c1, c2) c(mean(x[c1]), mean(x[c2]))

apply(x, 1, cave,  c1 = "x1", c2 = c("x1","x2"))

 

ma <- matrix(c(1:4, 1, 6:8), nrow = 2)

ma

apply(ma, 1, table)  #--> a list of length 2

apply(ma, 1, stats::quantile) # 5 x n matrix with rownames

 

stopifnot(dim(ma) == dim(apply(ma, 1:2, sum)))

## Example with different lengths for each call

z <- array(1:24, dim = 2:4)

zseq <- apply(z, 1:2, function(x) seq_len(max(x)))

zseq         ## a 2 x 3 matrix

typeof(zseq) ## list

dim(zseq) ## 2 3

zseq[1,]

apply(z, 3, function(x) seq_len(max(x)))

      # a list without a dim attribute

      حلقه ی apply یک تابع است که ما یک آرایه دارای مقداری ماتریکس جدا رو بهش میدهیم و پس از مشخص کردن یک تابع در آرگومان بعدی ، کاری را که میخواهیم روی آرایه اعمال شود را تعریف میکنیم. مثال

Apply(myData, score , mean)

 
  • که در اینجا myData آرایه ی اصلی ما است(main) و score یک عضو از آرایه myData است که خود نیز یک آرایه ( ماتریکس) است.
  • در آخرین آرگومان کلمه ی mean نشان میدهد باید روی هر ماتریکس از آرایه اصلی، میانگین را حساب کرده و برای ما برگرداند.
   

نظرات

هیچ نظری وجود ندارد.


افزودن نظر

Sitemap
Copyright © 2017 - 2023 Khavarzadeh®. All rights reserved