پرش به محتوای اصلی
رامین خاورزاده فهم امروز، پیش‌بینی فردا با داده و هوش مصنوعی
رامین خاورزاده · · 1 دقیقه مطالعه

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

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

فهرست مطالب
    نام دانشجو : آذین عیوضلو تمرین : تشکیل حلقه با توابع خانواده 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 نشان میدهد باید روی هر ماتریکس از آرایه اصلی، میانگین را حساب کرده و برای ما برگرداند.
       
    اشتراک‌گذاری:

    نظرات

    هنوز نظری ثبت نشده است؛ اولین نفر باشید.

    ارسال دیدگاه