برای مشاهده یافته ها از کلید Enter و برای خروج از کلید Esc استفاده کنید.

ساختمان داده tibble

همانگونه که پیشتر هم درباره اهمیت و کاربردهای دیتافریم ها در R صحبت کردیم، این ساختار داده ای مدتی طولانی تنها راه ذخیره داده ها با ستون هایی از انواع مختلف بود (بر خلاف ماتریس ها که فقط می توانند داده هایی از یک نوع را مدیریت کنند). با اینحال، در کنار دیتافریم، نوع دیگری از ساختارهای داده ای با عنوان tibble معرفی شدند تا علاوه بر قابلیت هایی که دیتافریم ها ارائه می کنند، بتواند وظایف بیشتری را انجام داده و عملکرد هوشمندانه تری داشته باشد.

برای استفاده از این ساختار، باید پکیج مربوط به آن نصب و بارگذاری (load) شود. نصب این پکیج می توان به دو صورت اقدام کرد. نخست نصب بسته tidyverse که در آینده به صورت کامل به آن خواهیم پرداخت. با نصب این بسته، بسته tibble هم نصب خواهد شد.

install.packages("tidyverse")

روش دیگر، نصب مستقیم بسته tibble با استفاده از دستور زیر می باشد.

install.packages("tibble")

ایجاد tibble

ایجاد tibble با استفاده از تابع ()tibble همانند ایجاد دیتافریم ها می باشد.

ds_Tib <- tibble(x = 1:4,
+                 y = c("مجید جوادی", "محمد مرادی", "علی رضایی", "مرتضی امامی"))
 ds_Tib
# A tibble: 4 × 2
      x y          
  <int> <chr>      
1     1 مجید جوادی 
2     2 محمد مرادی 
3     3 علی رضایی  
4     4 مرتضی امامی

اگر به کار با دیتا فریم ها عادت دارید، بلافاصله متوجه دو تفاوت در نحوه چاپ tibble ها خواهید شد:

  1. وقتی یک tibble را چاپ می کنید، به شما می گوید که ساختار دیتا یک tibble است و از چه ابعاد تشکیل شده است.
  2. tibble ها نوع هر متغیر را به شما می گویند.

این ویژگی دوم به ویژه برای جلوگیری از خطاهای ناشی از استفاده از متغیر نادرست بسیار مفید است.

نمایش نوع داده در tibble

هنگام چاپ یک tibble نوع داده ای در زیر عنوان ستون نمایش داده می شود:

  • <int> یک متغیر عدد صحیح را نشان می دهد،
  • <chr> نشان دهنده یک متغیر کاراکتری،
  • <dbl> یک عدد ممیز شناور (اعشاری) را نشان می‌دهد
  • <lgl> یک متغیر منطقی را نشان می دهد.

تبدیل یک دیتافریم موجود به tibble

در زبان R، به منظور تبدیل نوع داده از توابعی که با کلمه کلیدی as شروع می شوند استفاده می کنیم. همانطور که می توان با استفاده از تابع as.data.frame اشیاء را به قالب دیتافریم تبدیل کنیم، می توان با استفاده از تابع as_tibble اشیا را به tibble نیز تبدیل کرد.

myDf <- data.frame(x = 1:4,
+           y = c("مجید جوادی", "محمد مرادی", "علی رضایی", "مرتضی امامی"))
 myDf
  x           y
1 1  مجید جوادی
2 2  محمد مرادی
3 3   علی رضایی
4 4 مرتضی امامی

dfToTib <- as_tibble(myDf)
dfToTib
# A tibble: 4 × 2
      x y          
  <int> <chr>      
1     1 مجید جوادی 
2     2 محمد مرادی 
3     3 علی رضایی  
4     4 مرتضی امامی

تفاوت های دیتافریم و tibble

با وجود شباهت هایی بین دیتافریم و tibble، اگر تجربه کار با دیتافریم ها را داشته باشید، تفاوت هایی جزئی بین tibble و دیتافریم مشاهده خواهید کرد. مهمترین تفاوت های بین این دو ساختار داده ای عبارتند از:

  • tibble انواع داده ای را تبدیل نمی کند

یکی از مواردی که ممکن است در کار با دیتافریم ها برای همه برنامه نویس ها خوشایند نباشند این است که دیتافریم متغیرهای رشته‌ای را به‌طور پیش‌فرض به فاکتور تبدیل می‌کند. این مساله از آن جاییکه ممکن است بهترین راه برای کنترل متغیرها نباشد، می تواند آزاردهنده هم باشد. در هنگام ساخت دیتا فریم برای جلوگیری از این تبدیل، باید پارامتر stringsAsFactors = FALSE را مقداردهی و ذکر کنیم.

در مقابل، tibble ها به طور پیش فرض متغیرهای رشته را به فاکتور تبدیل نمی کنند. این رفتار به این دلیل مطلوب است که تبدیل خودکار داده ها به انواعی خاص می تواند باعث بروز مشکلاتی شود. به مثال زیر توجه کنید.

myDf <- data.frame(x = 1:4,
+                    y = c("مجید جوادی", "محمد مرادی", "علی رضایی", "مرتضی امامی"),
+                    stringsAsFactors = TRUE)
myDfNotFactor <- data.frame(x = 1:4,
+                             y = c("مجید جوادی", "محمد مرادی", "علی رضایی", "مرتضی امامی"),
+                             stringsAsFactors = FALSE)
myTib <- tibble(x = 1:4,
+                 y = c("مجید جوادی", "محمد مرادی", "علی رضایی", "مرتضی امامی"))
 class(myDf$y)
[1] "factor"
 class(myDfNotFactor$y)
[1] "character"
 class(myTib$y)
[1] "character"

با اینحال اگر بخواهیم یک متغیر فاکتوری در tibble وجود داشته باشد، می توان به سادگی تابع ()c را داخل ()factor قرار داد.

myTib <- tibble(x = 1:4,
+                 y = factor(c("مجید جوادی", "محمد مرادی", "علی رضایی", "مرتضی امامی")))
myTib
# A tibble: 4 × 2
      x y          
  <int> <fct>      
1     1 مجید جوادی 
2     2 محمد مرادی 
3     3 علی رضایی  
4     4 مرتضی امامی

  • خروجی مختصر، بدون توجه به اندازه داده ها

هنگامی که یک دیتافریم را چاپ می کنیم، تمام ستون ها (به طور پیش فرض) در کنسول چاپ می شوند، که مشاهده متغیرها و موارد اولیه را دشوار می کند. وقتی یک tibble چاپ می شود، فقط 10 ردیف اول و تعداد ستون‌هایی را که بر روی صفحه قرار می‌گیرند (به طور پیش‌فرض) چاپ می‌کند و درک سریع داده‌ها را آسان‌تر می‌کند. توجه داشته باشید که نام متغیرهایی که چاپ نمی شوند در پایین خروجی فهرست شده است.

  • خروجی tibble از زیر tibble

فرض کنید که بخواهیم زیر مجموعه ای از یک دیتا فریم را برگردانیم. در صورتی که این زیر مجموعه از یک ستون تشکیل شده باشد، خروجی دیگر یک دیتافریم نیست ولی در زمان استخراج یک زیر مجموعه از یک tibble، چه یک ستون و یا چند ستون انتخاب شوند، خروجی همچنان یک tibble خواهد بود.

هنگام تنظیم دیتا فریم، عملگر [ اگر بیش از یک ستون را باشد، خروجی یک دیتافریم خواهد بود ولی اگر فقط یک ستون باشد، خروجی یک بردار برمی گرداند. هنگام تنظیم زیر مجموعه یک tibble، عملگر [ همیشه یک tibble دیگر را برمی گرداند. اگر می خواهید به صورت مشخص یک ستون tibble را به عنوان بردار برگردانید، باید عملگر [[ یا $ استفاده کنید.

myDf[, 1]
# [1] 1 2 3 4

myTib[, 1]
# A tibble: 4 × 1
      x
  <int>
1     1
2     2
3     3
4     4
myTib[[1]]
# [1] 1 2 3 4

myTib$x
#[1] 1 2 3 4

  • متغیرها به صورت متوالی ایجاد می شوند

هنگام ساختن یک tibble، متغیرها به‌طور متوالی ایجاد می‌شوند تا متغیرهای بعدی بتوانند به متغیرهایی که پیشتر تعریف شده‌اند ارجاع دهند. این بدان معناست که می‌توانیم متغیرهایی را تعریف کنیم که در همان لحظه ایجاد، به متغیرهای دیگر در همان فراخوانی تابع اشاره می‌کنند. به استفاده از متغیر nItems در مثال زیر توجه کنید.

sequentialTib <- tibble(nItems = c(12, 45, 107),
+                         cost = c(0.5, 1.2, 1.8),
+                         totalWorth = nItems * cost)
sequentialTib
# A tibble: 3 × 3
  nItems  cost totalWorth
   <dbl> <dbl>      <dbl>
1     12   0.5         6 
2     45   1.2        54 
3    107   1.8       193.