data.table বনাম dplyr: অন্য কেউ ভাল করতে পারে বা খারাপভাবে করতে পারে?


758

সংক্ষিপ্ত বিবরণ

আমি তুলনামূলকভাবে পরিচিত, এর সাথে data.tableতেমন কিছু না dplyr। আমি কিছু dplyrভিগনেট এবং উদাহরণগুলি পড়েছি যা এসও-তে উঠে এসেছে এবং এখন পর্যন্ত আমার সিদ্ধান্তগুলি এই যে:

  1. data.tableএবং dplyrগতিতে তুলনীয়, যখন অনেকগুলি (যেমন> 10-100 কে) গ্রুপ রয়েছে এবং অন্য কিছু পরিস্থিতিতে (নীচে মাপদণ্ড দেখুন)
  2. dplyr আরও অ্যাক্সেসযোগ্য সিনট্যাক্স রয়েছে
  3. dplyr বিমূর্ত (বা উইল) সম্ভাব্য ডিবি ইন্টারঅ্যাকশন
  4. কিছু ছোট কার্যকারিতা পার্থক্য রয়েছে (নীচে "উদাহরণ / ব্যবহার" দেখুন)

আমার মনে 2 খুব বেশি ওজন সহ্য করে না কারণ আমি এটির সাথে মোটামুটি পরিচিত data.table, যদিও আমি বুঝতে পেরেছি যে উভয়ের ক্ষেত্রে নতুন ব্যবহারকারীদের জন্য এটি একটি বড় কারণ হয়ে উঠবে। আমি এমন যুক্তি এড়াতে চাই যা সম্পর্কে আরও স্বজ্ঞাত, কারণ এটি ইতিমধ্যে পরিচিত কারও দৃষ্টিকোণ থেকে আমার নির্দিষ্ট প্রশ্নের জন্য জিজ্ঞাসা করা অপ্রাসঙ্গিক data.table। "আরও স্বজ্ঞাত" কীভাবে দ্রুত বিশ্লেষণের দিকে নিয়ে যায় সে সম্পর্কে একটি আলোচনা এড়াতে চাই (অবশ্যই সত্য, তবে আবার, আমি এখানে কী সম্পর্কে সবচেয়ে আগ্রহী তা নয়)।

প্রশ্ন

আমি যা জানতে চাই তা হ'ল:

  1. বিশ্লেষণমূলক কাজগুলি রয়েছে যা প্যাকেজগুলির সাথে পরিচিত ব্যক্তিদের জন্য এক বা অন্য প্যাকেজের সাথে কোড করা অনেক সহজ (যেমন কী-স্ট্রোকের কিছু সংমিশ্রণ প্রয়োজন বনাম প্রয়োজনীয় স্তরের প্রয়োজন, যেখানে প্রতিটিটির কম কাজই ভাল জিনিস)।
  2. এমন একটি বিশ্লেষণমূলক কাজ রয়েছে যা একটি প্যাকেজ বনাম অন্য প্যাকেজে আরও দক্ষতার সাথে (যেমন 2x এর বেশি) সম্পাদিত হয়।

একটি সাম্প্রতিক একটি SO প্রশ্ন আমাকে এই সম্পর্কে আরও কিছুটা ভাবতে বাধ্য করেছে, কারণ আমি এখনও ভাবিনি dplyrযে আমি ইতিমধ্যে যা করতে পারি তার থেকে অনেক বেশি অফার করবে data.tabledplyrসমাধানটি এখানে রয়েছে (Q এর শেষে থাকা ডেটা):

dat %.%
  group_by(name, job) %.%
  filter(job != "Boss" | year == min(year)) %.%
  mutate(cumu_job2 = cumsum(job2))

কোন data.tableসমাধানে আমার হ্যাক প্রচেষ্টা চেয়ে অনেক ভাল ছিল । এটি বলেছিল, ভাল data.tableসমাধানগুলিও বেশ ভাল (ধন্যবাদ জিন-রবার্ট, অরুণ, এবং এখানে নোট করুন আমি কঠোরতম সর্বোত্তম সমাধানের জন্য একক বক্তব্যকে সমর্থন করেছি):

setDT(dat)[,
  .SD[job != "Boss" | year == min(year)][, cumjob := cumsum(job2)], 
  by=list(id, job)
]

পরেরটির সিনট্যাক্সটি খুব গৌরবময় মনে হতে পারে তবে আপনি যদি অভ্যস্ত হন data.table(তবে আরও কিছু রহস্যজনক কৌশল ব্যবহার করেন না) তবে এটি আসলে বেশ সরল ।

মূলত কি আমি দেখতে চাই কিছু ভাল উদাহরণ ছিল dplyrবা data.tableপথ অনেক বেশি সংক্ষিপ্ত বা সঞ্চালিত যথেষ্ট ভাল।

উদাহরণ

ব্যবহার
  • dplyrগোষ্ঠীভিত্তিক ক্রিয়াকলাপগুলিকে অনুমতি দেয় না যা স্বেচ্ছাসেবী সংখ্যার সারিগুলি ফেরত দেয় ( এড্ডির প্রশ্ন থেকে , দ্রষ্টব্য: এটি দেখে মনে হচ্ছে এটি dplyr 0.5 তে প্রয়োগ করা হবে , এছাড়াও, do@ বিগিনিআর @ এড্ডির প্রশ্নের উত্তরে ব্যবহারের সম্ভাব্য কাজ দেখায় )।
  • data.tableসমর্থন ঘূর্ণায়মান যোগদান করে (ধন্যবাদ @dholstius) পাশাপাশি ওভারল্যাপ যোগদান করে
  • data.tableঅভ্যন্তরীণভাবে ফর্মের অভিব্যক্তি DT[col == value]বা স্বয়ংক্রিয় সূচকের মাধ্যমে গতিরDT[col %in% values] পক্ষে অনুকূল হয় যা একই বেস আর সিনট্যাক্স ব্যবহার করার সময় বাইনারি অনুসন্ধান ব্যবহার করে। আরও কিছু বিশদ এবং একটি ক্ষুদ্র মানদণ্ডের জন্য এখানে দেখুন
  • dplyrক্রিয়াকলাপগুলির (যেমন regroup, summarize_each_) এর স্ট্যান্ডার্ড মূল্যায়ন সংস্করণ সরবরাহ করে যা প্রোগ্রামের ব্যবহারকে সহজ করতে পারে dplyr(নোটের প্রোগ্রাম্যাটিক ব্যবহার data.tableঅবশ্যই স্পষ্টভাবে সম্ভব, কেবলমাত্র কিছু যত্নশীল চিন্তাভাবনা, প্রতিস্থাপন / উদ্ধৃতি ইত্যাদি অন্তত আমার জ্ঞানের প্রয়োজন)
benchmarks

উপাত্ত

এটি প্রথম উদাহরণ হিসাবে আমি প্রশ্ন বিভাগে দেখিয়েছি।

dat <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L), name = c("Jane", "Jane", "Jane", "Jane", 
"Jane", "Jane", "Jane", "Jane", "Bob", "Bob", "Bob", "Bob", "Bob", 
"Bob", "Bob", "Bob"), year = c(1980L, 1981L, 1982L, 1983L, 1984L, 
1985L, 1986L, 1987L, 1985L, 1986L, 1987L, 1988L, 1989L, 1990L, 
1991L, 1992L), job = c("Manager", "Manager", "Manager", "Manager", 
"Manager", "Manager", "Boss", "Boss", "Manager", "Manager", "Manager", 
"Boss", "Boss", "Boss", "Boss", "Boss"), job2 = c(1L, 1L, 1L, 
1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L)), .Names = c("id", 
"name", "year", "job", "job2"), class = "data.frame", row.names = c(NA, 
-16L))

9
dplyrএকটিকে পড়ার ক্ষেত্রে একই সমাধানটি হ'ল:as.data.table(dat)[, .SD[job != "Boss" | year == min(year)][, cumjob := cumsum(job2)], by = list(name, job)]
এডিডি

7
# 1 এর জন্য dplyrএবং উভয় data.tableদলই মাপদণ্ডে কাজ করছে, সুতরাং কোনও উত্তর এখানে আসবে। # 2 (বাক্য গঠন) ইমো কঠোরভাবে মিথ্যা, তবে এটি স্পষ্টতই মতামত অঞ্চলে চলেছে, তাই আমিও বন্ধ করতে ভোট দিচ্ছি।
এডিডি

13
ঠিক আছে, আবারও, আরও পরিষ্কারভাবে প্রকাশিত সমস্যাগুলির সেটটি (d)plyrপরিমাপ করেছে 0
এডি

28
@ ব্রডিজ একটি জিনিস যা সত্যই আমাকে উভয় সম্পর্কে dplyrএবং plyrসিনট্যাক্সের সাথে সম্পর্কিত করে তোলে এবং মূলত আমি তাদের সিনট্যাক্সকে অপছন্দ করি তার মূল কারণটি হ'ল আমাকে আরও অনেক পদ্ধতি শিখতে হয় (1 টিরও বেশি পড়ুন) অতিরিক্ত ফাংশনগুলি ( এখনও নামগুলির সাথে) আমার জন্য অর্থবোধ করবেন না), তারা কী করে মনে রাখবেন, কী যুক্তি গ্রহণ করেন ইত্যাদি That এটি প্লাইর-দর্শন থেকে আমার পক্ষে সর্বদা একটি বিশাল পরিবর্তন।
এডিডি

43
@ এডিডি [জিহ্ব-ইন-গাল] একটি জিনিস যা সত্যই আমাকে ডেটা সম্পর্কে ডেকে আনে t টেবিল সিনট্যাক্সটি হ'ল আমাকে শিখতে হবে যে কীভাবে অনেকগুলি ফাংশন আর্গুমেন্ট ইন্টারঅ্যাক্ট করে এবং ক্রিপ্টিক শর্টকাটগুলি কী বোঝায় (উদাঃ .SD)। [গুরুত্ব সহকারে] আমি মনে করি এগুলি বৈধ নকশার পার্থক্য যা বিভিন্ন লোকের কাছে আবেদন করবে
হ্যাডলি

উত্তর:


532

আমরা কভার অন্তত একটি ব্যাপক উত্তর / তুলনা (গুরুত্ব কোন বিশেষ আদেশ) প্রদান করতে এগুলি দিকগুলিতে প্রয়োজন: Speed, Memory usage, Syntaxএবং Features

আমার উদ্দেশ্য হ'ল ডেটা.ট্যাবল দৃষ্টিকোণ থেকে যতটা সম্ভব স্পষ্ট coverেকে দেওয়া।

দ্রষ্টব্য: অন্যথায় স্পষ্টভাবে উল্লিখিত না হলে, dplyr উল্লেখ করে আমরা dplyr এর ডেটা.ফ্রেম ইন্টারফেসটি উল্লেখ করি যার অভ্যন্তরীণগুলি Rcpp ব্যবহার করে সি ++ তে থাকে।


ডেটা.টিটেবল সিনট্যাক্স তার ফর্মের সাথে সামঞ্জস্যপূর্ণ - DT[i, j, by]। রাখার জন্য i, jএবং byএকসঙ্গে নকশা করা। সম্পর্কিত ক্রিয়াকলাপগুলি একসাথে রেখে, এটি গতি এবং আরও গুরুত্বপূর্ণভাবে মেমরির ব্যবহারের জন্য ক্রিয়াকলাপগুলিকে সহজেই অনুকূলিতকরণ করতে দেয় এবং সিনট্যাক্সের ধারাবাহিকতা বজায় রেখে কিছু শক্তিশালী বৈশিষ্ট্যও সরবরাহ করে

1. গতি

বেশ কয়েকটি মানদণ্ড (যদিও বেশিরভাগ গ্রুপিং অপারেশনগুলিতে) ইতিমধ্যে ডেটা দেখানো প্রশ্নটিতে যুক্ত করা হয়েছে। টেবিলটি dplyr এর চেয়ে দ্রুততর হয় গ্রুপ এবং / অথবা সারিগুলি গ্রুপের সংখ্যা হিসাবে বৃদ্ধি করে, ম্যাট দ্বারা 10 মিলিয়ন থেকে গ্রুপিংয়ের বেঞ্চমার্ক সহ 2 বিলিয়ন সারি (100GB উপস্থিত RAM- র) এ 100 - 10 মিলিয়ন গ্রুপ এবং নানারকম গোষ্ঠীবদ্ধ কলাম, যা তুলনা pandas। আরও দেখুন আপডেট benchmarks , যার মধ্যে রয়েছে Sparkএবং pydatatableহিসাবে ভাল।

মানদণ্ডে, এই অবশিষ্ট দিকগুলিও কভার করা দুর্দান্ত হবে:

  • সারিগুলির একটি উপসেট জড়িত গোষ্ঠীকরণ ক্রিয়াকলাপ - যেমন, DT[x > val, sum(y), by = z]টাইপ অপারেশন।

  • বেঞ্চমার্ক অন্যান্য ক্রিয়াকলাপ যেমন আপডেট এবং যোগদান করে

  • রানটাইম ছাড়াও প্রতিটি অপারেশনের জন্য বেনমার্ক মেমরির পদচিহ্ন

2. স্মৃতি ব্যবহার

  1. Dplyr এর সাথে জড়িত filter()বা slice()অপারেশনগুলি মেমরি অদক্ষ হতে পারে (উভয় ডেটা.ফ্রেমস এবং ডেটা.ট্যাবগুলি)। এই পোস্টটি দেখুন

    লক্ষ্য করুন হ্যাডলি এর মন্তব্য সম্পর্কে আলোচনা গতি (যে dplyr তার জন্য অঢেল দ্রুত), যেহেতু এখানে প্রধান উদ্বেগের বিষয় মেমরির

  2. এই মুহুর্তে ডেটা.ট্যাবিল ইন্টারফেস একটিকে রেফারেন্সের মাধ্যমে কলামগুলি সংশোধন / আপডেট করতে দেয় (নোট করুন যে আমাদের ফলটি একটি ভেরিয়েবলের কাছে পুনরায় নির্ধারণের দরকার নেই)।

    # sub-assign by reference, updates 'y' in-place
    DT[x >= 1L, y := NA]

    তবে dplyr রেফারেন্স দ্বারা কখনও আপডেট হবে না । Dplyr সমতুল্য হবে (নোট করুন যে ফলাফলটি পুনরায় বরাদ্দ করা দরকার):

    # copies the entire 'y' column
    ans <- DF %>% mutate(y = replace(y, which(x >= 1L), NA))

    এটির জন্য উদ্বেগ হ'ল উল্লেখযোগ্য স্বচ্ছতা । রেফারেন্স অনুসারে ডেটা.ট্যাবল অবজেক্ট আপডেট করা, বিশেষত কোনও ফাংশনের মধ্যেই সর্বদা কাম্য হতে পারে না। তবে এটি একটি অবিশ্বাস্যভাবে দরকারী বৈশিষ্ট্য: আকর্ষণীয় ক্ষেত্রে এই এবং এই পোস্টগুলি দেখুন। এবং আমরা এটি রাখতে চাই।

    অতএব আমরা shallow()ডেটা.টবেলে ফাংশন রফতানির দিকে কাজ করছি যা ব্যবহারকারীকে উভয় সম্ভাবনা সরবরাহ করবে । উদাহরণস্বরূপ, যদি কোনও ফাংশনের মধ্যে ইনপুট ডেটা পরিবর্তন না করা বাঞ্ছনীয় হয় তবে এটির পরে কেউ এটি করতে পারে:

    foo <- function(DT) {
        DT = shallow(DT)          ## shallow copy DT
        DT[, newcol := 1L]        ## does not affect the original DT 
        DT[x > 2L, newcol := 2L]  ## no need to copy (internally), as this column exists only in shallow copied DT
        DT[x > 2L, x := 3L]       ## have to copy (like base R / dplyr does always); otherwise original DT will 
                                  ## also get modified.
    }

    ব্যবহার না করে shallow(), পুরানো কার্যকারিতা বজায় রাখা হয়:

    bar <- function(DT) {
        DT[, newcol := 1L]        ## old behaviour, original DT gets updated by reference
        DT[x > 2L, x := 3L]       ## old behaviour, update column x in original DT.
    }

    ব্যবহার করে অগভীর অনুলিপি তৈরি করে shallow(), আমরা বুঝতে পারি যে আপনি মূল বিষয়টিকে সংশোধন করতে চান না। নিশ্চিত করতে আমরা পাশাপাশি কলাম আপনি পরিবর্তন কপি করতে নিশ্চিত সবকিছু অভ্যন্তরীণভাবে যত্ন নিতে শুধুমাত্র যখন এটি অত্যাবশ্যক । প্রয়োগ করা হলে, ব্যবহারকারীকে উভয় সম্ভাবনা প্রদানের সময় এটিকে রেফারেন্সিয়াল স্বচ্ছতার বিষয়টি পুরোপুরি নিষ্পত্তি করা উচিত ।

    এছাড়াও, একবার shallow()dplyr এর তথ্য রফতানি করা হয়। টেবিল ইন্টারফেস প্রায় সমস্ত অনুলিপি এড়ানো উচিত। সুতরাং যারা dplyr এর সিনট্যাক্স পছন্দ করেন তারা ডেটা.ট্যাবলগুলি সহ এটি ব্যবহার করতে পারেন।

    তবে এটিতে এখনও ডেটা টেবিল সরবরাহ করে এমন অনেকগুলি বৈশিষ্ট্যের অভাব হবে যা উল্লেখ সহ (উপ) -পরিচালনা সহ ign

  3. যোগ দেওয়ার সময় সমষ্টি:

    ধরুন আপনার নীচে দুটি ডেটা টেবিল রয়েছে:

    DT1 = data.table(x=c(1,1,1,1,2,2,2,2), y=c("a", "a", "b", "b"), z=1:8, key=c("x", "y"))
    #    x y z
    # 1: 1 a 1
    # 2: 1 a 2
    # 3: 1 b 3
    # 4: 1 b 4
    # 5: 2 a 5
    # 6: 2 a 6
    # 7: 2 b 7
    # 8: 2 b 8
    DT2 = data.table(x=1:2, y=c("a", "b"), mul=4:3, key=c("x", "y"))
    #    x y mul
    # 1: 1 a   4
    # 2: 2 b   3

    এবং কলামগুলি দ্বারা যোগদানের সময় sum(z) * mulআপনি প্রতিটি সারিতে প্রবেশ করতে চান । আমরা হয়:DT2x,y

    • 1) সমষ্টিগত DT1পেতে sum(z), 2) একটি যোগদানের সম্পাদন এবং 3) সংখ্যাবৃদ্ধি (বা)

      # data.table way
      DT1[, .(z = sum(z)), keyby = .(x,y)][DT2][, z := z*mul][]
      
      # dplyr equivalent
      DF1 %>% group_by(x, y) %>% summarise(z = sum(z)) %>% 
          right_join(DF2) %>% mutate(z = z * mul)
    • 2) এটি একসাথে করুন ( by = .EACHIবৈশিষ্ট্য ব্যবহার করে):

      DT1[DT2, list(z=sum(z) * mul), by = .EACHI]

    সুবিধা কী?

    • মধ্যবর্তী ফলাফলের জন্য আমাদের মেমরি বরাদ্দ করতে হবে না।

    • আমাদের দুবার গ্রুপ / হ্যাশ করতে হবে না (একত্রিত করার জন্য এবং অন্যটিতে যোগদানের জন্য)।

    • এবং আরও গুরুত্বপূর্ণ বিষয়, আমরা যে অপারেশনটি করতে চেয়েছিলাম তা j(2) দেখে পরিষ্কার হয় ।

    এর বিস্তারিত ব্যাখ্যার জন্য এই পোস্টটি দেখুন by = .EACHI। কোনও মধ্যবর্তী ফলাফল বাস্তবায়িত হয় না, এবং যোগদান + সমষ্টি সমস্ত একযোগে সম্পন্ন হয়।

    কটাক্ষপাত আছে এই , এই এবং এই বাস্তব ব্যবহারের পরিস্থিতিতে জন্য পোস্ট নেই।

    ইন dplyrআপনি করতে হবে যোগ দিতে এবং সমষ্টিগত বা সমষ্টিগত প্রথম এবং তারপর যোগদান , তন্ন তন্ন যার পদ ধরে থাকা মানায়, দক্ষ হয় (যা পালাক্রমে গতি অনুবাদ)।

  4. আপডেট এবং যোগদান:

    নীচে প্রদর্শিত ডেটা টেবিল কোড বিবেচনা করুন:

    DT1[DT2, col := i.mul]

    / আপডেট যোগ করা DT1এর কলাম colসঙ্গে mulথেকে DT2সেই সারি উপর যেখানে DT2গুলি কী কলাম মেলে অন্যদিকে ' DT1। আমি মনে করি না এই অপারেশনের একটি সঠিক সমতুল্য আছে dplyr, অর্থাত্ কোনও *_joinঅপারেশন এড়ানো ছাড়াই , যাতে DT1এটিতে একটি নতুন কলাম যুক্ত করতে পুরো অনুলিপি করতে হবে, যা অপ্রয়োজনীয়।

    বাস্তব ব্যবহারের দৃশ্যের জন্য এই পোস্টটি দেখুন Check

সংক্ষিপ্তসার হিসাবে, এটি উপলব্ধি করা জরুরী যে প্রতিটি বিট অপ্টিমাইজেশনের বিষয়টি গুরুত্বপূর্ণ। যেমন গ্রেস হপার বলবে, আপনার ন্যানোসেকেন্ডগুলিকে মন দিন !

3. সিনট্যাক্স

আসুন এখন বাক্য গঠন দেখুন । হ্যাডলি এখানে মন্তব্য করেছেন :

ডেটা সারণীগুলি অত্যন্ত দ্রুত হয় তবে আমি মনে করি যে তাদের সংক্ষিপ্ততা শিখতে আরও কঠিন করে তোলে এবং কোডগুলি ব্যবহার করে এটি আপনার লেখার পরে এটি পড়া শক্ত হয় ...

আমি এই মন্তব্যটি অর্থহীন বলে মনে করি কারণ এটি অত্যন্ত বিষয়ভিত্তিক। আমরা সম্ভবত যা চেষ্টা করতে পারি তা হ'ল বাক্য গঠনের ধারাবাহিকতার বিপরীতে । আমরা পাশাপাশি ডেটা টেবিল এবং dplyr সিনট্যাক্স তুলনা করব।

আমরা নীচে প্রদর্শিত ডামি ডেটা নিয়ে কাজ করব:

DT = data.table(x=1:10, y=11:20, z=rep(1:2, each=5))
DF = as.data.frame(DT)
  1. বেসিক সমষ্টি / আপডেট ক্রিয়াকলাপ।

    # case (a)
    DT[, sum(y), by = z]                       ## data.table syntax
    DF %>% group_by(z) %>% summarise(sum(y)) ## dplyr syntax
    DT[, y := cumsum(y), by = z]
    ans <- DF %>% group_by(z) %>% mutate(y = cumsum(y))
    
    # case (b)
    DT[x > 2, sum(y), by = z]
    DF %>% filter(x>2) %>% group_by(z) %>% summarise(sum(y))
    DT[x > 2, y := cumsum(y), by = z]
    ans <- DF %>% group_by(z) %>% mutate(y = replace(y, which(x > 2), cumsum(y)))
    
    # case (c)
    DT[, if(any(x > 5L)) y[1L]-y[2L] else y[2L], by = z]
    DF %>% group_by(z) %>% summarise(if (any(x > 5L)) y[1L] - y[2L] else y[2L])
    DT[, if(any(x > 5L)) y[1L] - y[2L], by = z]
    DF %>% group_by(z) %>% filter(any(x > 5L)) %>% summarise(y[1L] - y[2L])
    • ডেটা.টিটেবল সিনট্যাক্সটি কমপ্যাক্ট এবং ডিপি্লায়ারের বেশ ভার্জোজ। (ক) ক্ষেত্রে জিনিসগুলি কমবেশি সমান।

    • ক্ষেত্রে (খ), সংক্ষেপেরfilter() সময় আমাদের dplyr ব্যবহার করতে হয়েছিল । তবে আপডেট করার সময় আমাদের যুক্তিটি ভিতরে নিয়ে যেতে হয়েছিল । তথ্যের ক্ষেত্রে, আমরা একই যুক্তি দিয়ে উভয় ক্রিয়াকলাপটি প্রকাশ করি - সারিগুলিতে কাজ করি যেখানে প্রথম ক্ষেত্রে, পেতে হয় , তবে দ্বিতীয় ক্ষেত্রে তার সারিটি সংযোজিত যোগফলের সাথে আপডেট করে ।mutate()x > 2sum(y)y

      যখন আমরা বলি DT[i, j, by]ফর্মটি সামঞ্জস্যপূর্ণ তখন আমরা এটাই বোঝাতে চাই ।

    • একইভাবে (সি) ক্ষেত্রে, যখন আমাদের if-elseশর্ত থাকে, আমরা ডেটা.ট্যাবল এবং ডিপিপ্লায়ার উভয় ক্ষেত্রে "যেমন আছে" যুক্তিটি প্রকাশ করতে সক্ষম হয়েছি। তবে, যদি আমরা কেবল সেই সারিগুলিতে ফিরে যেতে চাই যেখানে ifশর্তটি সন্তুষ্ট হয় এবং অন্যথায় এড়িয়ে যায়, আমরা summarise()সরাসরি (এএএএফআইটি) ব্যবহার করতে পারি না । আমাদের filter()প্রথমে এবং তারপরে সংক্ষিপ্তকরণ করতে হবে কারণ summarise()সর্বদা একক মান আশা করে ।

      এটি একই ফলাফল ফেরত দেওয়ার সময়, filter()এখানে ব্যবহার প্রকৃত ক্রিয়াকে কম স্পষ্ট করে তোলে।

      filter()প্রথম ক্ষেত্রেও এটি ব্যবহার করা খুব ভাল হতে পারে (আমার কাছে তা স্পষ্ট বলে মনে হয় না), তবে আমার বক্তব্যটি আমাদের হওয়া উচিত নয়।

  2. একাধিক কলামে সমষ্টি / আপডেট

    # case (a)
    DT[, lapply(.SD, sum), by = z]                     ## data.table syntax
    DF %>% group_by(z) %>% summarise_each(funs(sum)) ## dplyr syntax
    DT[, (cols) := lapply(.SD, sum), by = z]
    ans <- DF %>% group_by(z) %>% mutate_each(funs(sum))
    
    # case (b)
    DT[, c(lapply(.SD, sum), lapply(.SD, mean)), by = z]
    DF %>% group_by(z) %>% summarise_each(funs(sum, mean))
    
    # case (c)
    DT[, c(.N, lapply(.SD, sum)), by = z]     
    DF %>% group_by(z) %>% summarise_each(funs(n(), mean))
    • (ক) ক্ষেত্রে, কোডগুলি কম বেশি সমতুল্য। ডেটা.ট্যাবলে পরিচিত বেস ফাংশন ব্যবহার করা হয় lapply(), যেখানে ফাংশনগুলির একটি গুচ্ছের সাথে dplyrপরিচয় করিয়ে দেওয়া *_each()হয় funs()

    • ডেটা টেবিলের :=কলামের নাম সরবরাহ করা প্রয়োজন, অন্যদিকে ডিপি্লায়ার স্বয়ংক্রিয়ভাবে এটি তৈরি করে।

    • ক্ষেত্রে (খ), dplyr এর সিনট্যাক্স তুলনামূলকভাবে সহজ। একাধিক ফাংশনগুলিতে একত্রিতকরণ / আপডেটগুলি উন্নত করা তথ্য.টেবেলের তালিকায়।

    • যদিও (সি) ক্ষেত্রে, dplyr n()কেবল একবারের পরিবর্তে বহু কলাম হিসাবে বহুবার ফিরে আসত । ডেটা.ট্যাবেলে, আমাদের কেবলমাত্র তালিকাটি ফিরিয়ে নেওয়া দরকার j। তালিকার প্রতিটি উপাদান ফলাফলের কলামে পরিণত হবে। সুতরাং, আমরা আবার ব্যবহার করতে পারি, পরিচিত বেস ফাংশনটি c()কনটেনেট .Nকরার জন্য listযা প্রত্যাবর্তন করে a list

    দ্রষ্টব্য: আবারও, ডেটা.টিটেলে, আমাদের যা করতে হবে তা হ'ল একটি তালিকা ফিরে আসা j। তালিকার প্রতিটি উপাদান ফল হিসাবে কলামে পরিণত হবে। আপনি ব্যবহার করতে পারেন c(), as.list(), lapply(), list()কোনো নতুন ফাংশন শিখতে করেও ইত্যাদি ... বেস ফাংশন এই কাজ করা সম্ভব।

    আপনাকে কেবলমাত্র বিশেষ ভেরিয়েবলগুলি শিখতে হবে - .Nএবং .SDকমপক্ষে। Dplyr এর সমতুল্য n()এবং.

  3. যোগদান করেছে

    dplyr প্রতিটি ধরণের যোগদানের জন্য পৃথক ফাংশন সরবরাহ করে যেখানে ডেটা. টেবিল একই সিনট্যাক্স ব্যবহার করে DT[i, j, by](এবং যুক্তিতে) যোগদানের অনুমতি দেয় । এটি merge.data.table()বিকল্প হিসাবে একটি সমতুল্য ফাংশন সরবরাহ করে।

    setkey(DT1, x, y)
    
    # 1. normal join
    DT1[DT2]            ## data.table syntax
    left_join(DT2, DT1) ## dplyr syntax
    
    # 2. select columns while join    
    DT1[DT2, .(z, i.mul)]
    left_join(select(DT2, x, y, mul), select(DT1, x, y, z))
    
    # 3. aggregate while join
    DT1[DT2, .(sum(z) * i.mul), by = .EACHI]
    DF1 %>% group_by(x, y) %>% summarise(z = sum(z)) %>% 
        inner_join(DF2) %>% mutate(z = z*mul) %>% select(-mul)
    
    # 4. update while join
    DT1[DT2, z := cumsum(z) * i.mul, by = .EACHI]
    ??
    
    # 5. rolling join
    DT1[DT2, roll = -Inf]
    ??
    
    # 6. other arguments to control output
    DT1[DT2, mult = "first"]
    ??
    • কেউ কেউ খুব ভাল (বাম, ডান, অভ্যন্তরীণ, এন্টি, আধা ইত্যাদি) সাথে যোগ দেয় জন্য পৃথক ফাংশন খুঁজে পেতে পারে, অন্যরা যেমন ডেটা টেবিল পছন্দ করতে পারে DT[i, j, by], বা merge()যা বেস আর এর অনুরূপ।

    • তবে dplyr যোগ দেয় ঠিক তা। বেশি কিছু না. কিছুই কম.

    • ডাটা. টেবিলগুলি (2) যোগদানের সময় কলামগুলি নির্বাচন করতে পারে, এবং dplyr এ আপনাকে select()উপরে প্রদর্শিত হিসাবে যোগদানের আগে প্রথমে উভয় ডেটা.ফ্রেমে প্রয়োজন হবে । অন্যথায় আপনি অযৌক্তিক কলামগুলির সাথে যোগটি কেবল পরে এগুলি সরাতে প্রস্তুত করবেন এবং এটি অদক্ষ ine

    • ডেটা.ট্যাবলগুলি যোগদানের সময় (3) একত্রিত হতে পারে এবং বৈশিষ্ট্যটি ব্যবহার করে (4) যোগদানের সময় আপডেট করতে পারেby = .EACHI । কেন শুধুমাত্র কয়েকটি কলাম কলাম যুক্ত / আপডেট করতে পুরো যোগদানের ফলাফলকে পদক্ষেপ দেবে?

    • ডেটা.ট্যাবলটি ঘূর্ণায়মান (5) - রোল ফরোয়ার্ড, এলওসিএফ , রোল ব্যাকওয়ার্ড, এনওসিবি , নিকটতম হিসাবে সক্ষম

    • ডেটা.টবেলে mult =যুক্তিও রয়েছে যা প্রথম , শেষ বা সমস্ত ম্যাচ বাছাই করে ())।

    • ডেটা.টবেলে allow.cartesian = TRUEদুর্ঘটনাকৃত অবৈধ যোগদানের হাত থেকে রক্ষা করার যুক্তি রয়েছে ।

আবার, সিনট্যাক্স DT[i, j, by]অতিরিক্ত আর্গুমেন্টের সাথে সামঞ্জস্যপূর্ণ যাতে আরও আউটপুট নিয়ন্ত্রণ করা যায়।

  1. do()...

    dplyr এর সংক্ষিপ্তসারটি এমন ফাংশনগুলির জন্য বিশেষভাবে ডিজাইন করা হয়েছে যা একক মান ফেরত দেয়। যদি আপনার ফাংশনটি একাধিক / অসম মানগুলি দেয়, আপনাকে অবলম্বন করতে হবে do()। আপনার সমস্ত ফাংশন ফেরতের মান সম্পর্কে আপনাকে আগেই জানতে হবে।

    DT[, list(x[1], y[1]), by = z]                 ## data.table syntax
    DF %>% group_by(z) %>% summarise(x[1], y[1]) ## dplyr syntax
    DT[, list(x[1:2], y[1]), by = z]
    DF %>% group_by(z) %>% do(data.frame(.$x[1:2], .$y[1]))
    
    DT[, quantile(x, 0.25), by = z]
    DF %>% group_by(z) %>% summarise(quantile(x, 0.25))
    DT[, quantile(x, c(0.25, 0.75)), by = z]
    DF %>% group_by(z) %>% do(data.frame(quantile(.$x, c(0.25, 0.75))))
    
    DT[, as.list(summary(x)), by = z]
    DF %>% group_by(z) %>% do(data.frame(as.list(summary(.$x))))
    • .SDএর সমতুল্য .

    • ডেটা.ট্যাবেলে আপনি এতে বেশ কিছু নিক্ষেপ করতে পারেন j- একটি তালিকা মনে রাখার জন্য কেবল সেই বিষয়টি মনে রাখতে হবে যাতে তালিকার প্রতিটি উপাদান একটি কলামে রূপান্তরিত হয়।

    • Dplyr এ, এটি করতে পারে না। do()আপনার ফাংশন সর্বদা একক মান ফেরত দেবে কিনা সে সম্পর্কে আপনি কতটা নিশ্চিত তা নির্ভর করে অবলম্বন করতে হবে। এবং এটি বেশ ধীর।

আবার, ডেটা টেবিলের সিনট্যাক্সের সাথে সামঞ্জস্য রয়েছে DT[i, j, by]। আমরা jএই বিষয়গুলি নিয়ে চিন্তা না করে কেবল ভাব প্রকাশ করতে পারি ।

কটাক্ষপাত আছে এই তাই প্রশ্ন এবং এই এক । আমি অবাক হই যে, ডিপ্লাইয়ের সিনট্যাক্স ব্যবহার করে উত্তরটি সোজা হিসাবে প্রকাশ করা সম্ভব হবে কিনা ...

সংক্ষেপে বলতে গেলে , আমি বিশেষত বেশ কয়েকটি উদাহরণ হাইলাইট করেছি যেখানে ডাইপ্লির সিনট্যাক্সটি হয় অদক্ষ, সীমিত বা অপারেশনগুলি সোজা করে তুলতে ব্যর্থ। এটি বিশেষত কারণ ডেটা টেবিলটি "পড়তে / শিখতে শক্ত" সিনট্যাক্স সম্পর্কে উপরের কিছুটা প্রতিক্রিয়া জানায় (উপরের মত সংযুক্ত) Dplyr কভার করে এমন বেশিরভাগ পোস্ট সর্বাধিক সোজা অপারেশন সম্পর্কে কথা বলে talk এবং এটি দুর্দান্ত। তবে এর সিনট্যাক্স এবং বৈশিষ্ট্যের সীমাবদ্ধতাগুলিও উপলব্ধি করা গুরুত্বপূর্ণ এবং আমি এখনও এটি নিয়ে একটি পোস্ট দেখতে পাইনি।

ডেটা টেবিলের পাশাপাশি এর কৌতুহল রয়েছে (যার মধ্যে কয়েকটি আমি উল্লেখ করেছি যে আমরা সংশোধন করার চেষ্টা করছি)। আমি এখানে হাইলাইট হিসাবে ডেটা টেবিলের যোগ দেয় উন্নত করার চেষ্টা করছি ।

তবে ডিপিপ্লায়ারের সাথে ডেটা টেবিলের তুলনায় যে বৈশিষ্ট্যগুলির অভাব রয়েছে সেগুলিও বিবেচনা করা উচিত।

4. বৈশিষ্ট্য

আমি এখানে এবং এই পোস্টে বেশিরভাগ বৈশিষ্ট্যগুলি উল্লেখ করেছি । এছাড়াও:

  • ফ্রেড - দ্রুত ফাইল রিডার দীর্ঘকাল ধরে উপলব্ধ।

  • fwrit - একটি সমান্তরাল দ্রুত ফাইল লেখক এখন উপলব্ধ। বাস্তবায়ন সম্পর্কে বিশদ ব্যাখ্যার জন্য এই পোস্টটি দেখুন এবং আরও বিকাশের উপর নজর রাখার জন্য # 1664

  • অটোমেটিক ইনডেক্সিং - অভ্যন্তরীণভাবে বেস আর সিনট্যাক্সটিকে অনুকূল করার জন্য আরও একটি সুবিধাজনক বৈশিষ্ট্য।

  • অ্যাড-হক গ্রুপিং : dplyrচলাকালীন সময়ে গ্রুপগুলি ভেরিয়েবল দ্বারা ফলাফলগুলি স্বয়ংক্রিয়ভাবে সাজায় summarise(), যা সর্বদা কাম্য নয়।

  • উপরে উল্লিখিত ডেটা টেবিলের অসংখ্য সুবিধা (গতি / মেমরি দক্ষতা এবং সিনট্যাক্সের জন্য) যোগ দেয়।

  • নন-<=, <, >, >= ইকুই যোগ দেয়: ডেটা.ট্যাবেলে যোগদানের সমস্ত সুবিধা সহ অন্যান্য অপারেটরগুলি ব্যবহার করে যোগদানের অনুমতি দেয়।

  • ওভারল্যাপিং রেঞ্জের সাথে যোগ দেওয়া সম্প্রতি ডেটা.টেবেলে কার্যকর হয়েছিল। মাপদণ্ডের সাথে পর্যালোচনা করার জন্য এই পোস্টটি দেখুন ।

  • setorder() ডেটা.টবেলে ফাংশন যা রেফারেন্সের মাধ্যমে ডেটা. টেবিলের সত্যিকারের দ্রুত পুনঃক্রম করতে দেয়।

  • dplyr একই সিনট্যাক্স ব্যবহার করে ডাটাবেসগুলিতে ইন্টারফেস সরবরাহ করে, যা এই মুহুর্তে ডেটা টেবিলটি নয়।

  • data.tableদ্রুত সমতুল প্রদান করে সেট অপারেশন - (জানুয়ারী Gorecki দ্বারা লিখিত) fsetdiff, fintersect, funionএবং fsetequalঅতিরিক্ত সঙ্গে allযুক্তি (SQL এর যে হিসাবে)।

  • ডেটা.টিবেল কোনও মাস্কিং সতর্কতা সহ পরিষ্কারভাবে লোড করে এবং কোনও আর প্যাকেজে পাস করার সময় সামঞ্জস্যতার জন্য এখানে বর্ণিত একটি পদ্ধতি রয়েছে [.data.frame। dplyr বেস ফাংশন পরিবর্তন করে filter, lagএবং [যা সমস্যার কারণ হতে পারে; যেমন এখানে এবং এখানে


অবশেষে:

  • ডাটাবেসগুলিতে - কোনও কারণ নেই যে ডেটা.টবেবল অনুরূপ ইন্টারফেস সরবরাহ করতে পারে না, তবে এটি এখন অগ্রাধিকার নয়। এটি ব্যবহারকারীরা খুব সহজেই এই বৈশিষ্ট্যটি পছন্দ করতে পারে তবে এটি নিশ্চিত হবে না নিশ্চিত।

  • সমান্তরালতার উপর - যতক্ষণ না কেউ এগিয়ে যায় এবং এটি না করে সবকিছুই কঠিন। অবশ্যই এটি চেষ্টা করবে (থ্রেড নিরাপদ হচ্ছে)।

    • অগ্রগতি বর্তমানে বর্ধমান কর্মক্ষমতা লাভের জন্য পরিচিত সময় গ্রহণকারী অংশগুলিকে সমান্তরাল করার দিকে (v1.9.7 ডিভেলে) করা হচ্ছে OpenMP

9
@ ব্লুফিট: আমি মনে করি না যে আপনি আমাদের এই আলোচনাটিকে আড্ডায় সরিয়ে নিয়ে বাকি কোন দুর্দান্ত পরিষেবা করেছেন did আমি এই ছাপে ছিলাম যে অরুন অন্যতম বিকাশকারী এবং এর ফলে দরকারী অন্তর্দৃষ্টি হতে পারে।
আইআরটিএফএম

2
আমি যখন আপনার লিঙ্কটি ব্যবহার করে চ্যাট করতে গিয়েছিলাম, তখন দেখা গেল যে "আপনার একটি ফিল্টার ব্যবহার করা উচিত" .. মন্তব্য শুরু করার পরে সমস্ত উপাদান চলে গেছে। আমি কি এসও-চ্যাট প্রক্রিয়া সম্পর্কে কিছু মিস করছি?
আইআরটিএফএম

6
আমি মনে করি যে যেখানেই আপনি রেফারেন্স ( :=) দ্বারা অ্যাসাইনমেন্ট ব্যবহার করছেন , dplyr<-DF <- DF %>% mutate...DF %>% mutate...
সমতুল্যদেরও ন্যায়বিচারের

4
বাক্য গঠন সম্পর্কে। আমি বিশ্বাস করি যে dplyrব্যবহারকারীরা plyrসিনট্যাক্স ব্যবহার করতেন তাদের পক্ষে data.tableআরও সহজ হতে পারে , তবে যে ভাষাগুলির মতো ভাষা সিনট্যাক্স SQLএবং এর পিছনে সম্পর্কিত বীজগণিত অনুসন্ধান করা হয়েছে তাদের পক্ষে সহজতর হতে পারে , যা সমস্ত ট্যাবুলার ডেটা ট্রান্সফর্মেশন সম্পর্কিত। অরুন আপনার লক্ষ্য করা উচিত যে সেট অপারেটরগুলিdata.table ফাংশন মোড়ানো দ্বারা খুব সহজেই সক্ষম - এবং অবশ্যই তাৎপর্যপূর্ণ গতিবেগ নিয়ে আসে।
জঙ্গোরেকি

9
আমি এই পোস্টটি অনেকবার পড়েছি এবং এটি ডেটা.ট্যাবল বুঝতে এবং এটি আরও ভালভাবে ব্যবহার করতে সক্ষম হতে আমাকে অনেক সহায়তা করেছে। আমি, বেশিরভাগ ক্ষেত্রে ডিপিপ্লায়ার বা পান্ডা বা পিএল / পিজিএসকিউএল এর চেয়ে ডেটা টেবিল পছন্দ করি। তবে কীভাবে এটি প্রকাশ করব তা ভাবতে ভাবতে আমি থামাতে পারিনি। সিনট্যাক্স হয় না সহজ, পরিষ্কার বা বাগাড়ম্বরপূর্ণ। আসলে, আমি ডেটা ব্যবহার করার পরেও অনেক কিছুই টেবিল করার পরেও আমি প্রায়শই নিজের কোডটি বোঝার জন্য সংগ্রাম করি, আমি এক সপ্তাহ আগে আক্ষরিক লিখেছিলাম। এটি কেবল একটি লেখার ভাষার জীবনের উদাহরণ। en.wikedia.org/wiki/Write-only_language সুতরাং, আসুন আশা করি, একদিন আমরা ডেটা.ট্যাবেলে dplyr ব্যবহার করতে সক্ষম হব।
ইউফোস

385

অরুনের জবাবের বিস্তৃত রূপরেখা (তবে ভিন্ন ভিন্ন অগ্রাধিকারের ভিত্তিতে কিছুটা পুনর্বিন্যাস করা) অনুসরণ করে ডিসিপ্লাইর দৃষ্টিকোণ থেকে আমার বিস্তৃত জবাবের এখানে আমার প্রচেষ্টা।

বাক্য গঠন

সিনট্যাক্সের জন্য কিছু সাবজেক্টিভিটি রয়েছে, তবে আমি আমার বক্তব্যটির সাথে দাঁড়িয়ে আছি যে ডেটা.ট্যাবিলের সংক্ষিপ্তকরণ এটি শেখা আরও কঠিন এবং পড়া আরও কঠিন করে তোলে। এটি আংশিক কারণ dplyr একটি আরও সহজ সমস্যা সমাধান করছে!

একটি খুব গুরুত্বপূর্ণ জিনিস যা dplyr আপনার জন্য করে তা হ'ল এটি আপনার বিকল্পগুলিকে সীমাবদ্ধ করে । আমি দাবি করি যে সর্বাধিক একক সারণী সমস্যাগুলি কেবলমাত্র পাঁচটি মূল ক্রিয়া ফিল্টার দিয়ে সমাধান করা যেতে পারে, নির্বাচন করতে, পরিবর্তন করতে, সংশ্লেষণ করতে এবং সংক্ষিপ্ত করতে, পাশাপাশি "গ্রুপ দ্বারা" অ্যাডওয়্যার্ভ করা যেতে পারে। আপনি যখন ডেটা ম্যানিপুলেশন শিখছেন তখন এই সীমাবদ্ধতা একটি বড় সহায়তা, কারণ এটি সমস্যার বিষয়ে আপনার চিন্তাভাবনাটিকে অর্ডার করতে সহায়তা করে। Dplyr এ, এই ক্রিয়াগুলির প্রত্যেকটিই একটি ফাংশনে ম্যাপ করা হয়। প্রতিটি ফাংশন একটি কাজ করে এবং বিচ্ছিন্নভাবে বোঝা সহজ।

আপনি এই সাধারণ অপারেশনগুলি একসাথে পাইপ দিয়ে জটিলতা তৈরি করেন %>%। অরুণের সাথে লিঙ্কিত পোস্টগুলির একটির উদাহরণ এখানে :

diamonds %>%
  filter(cut != "Fair") %>%
  group_by(cut) %>%
  summarize(
    AvgPrice = mean(price),
    MedianPrice = as.numeric(median(price)),
    Count = n()
  ) %>%
  arrange(desc(Count))

এমনকি যদি আপনি dplyr এর আগে কখনও দেখেন নি (বা এমনকি আর!), তখনও আপনি কী ঘটছে তার সংক্ষিপ্তসার পেতে পারেন কারণ ফাংশনগুলি সমস্ত ইংরেজি ক্রিয়াপদ are ইংরাজী ক্রিয়াগুলির অসুবিধা হ'ল তাদের তুলনায় আরও বেশি টাইপিংয়ের প্রয়োজন হয় [তবে আমি মনে করি এটি আরও ভাল স্বতঃপূরণ দ্বারা প্রশমিত হতে পারে।

এখানে সমতুল্য ডেটা.টিবেল কোড:

diamondsDT <- data.table(diamonds)
diamondsDT[
  cut != "Fair", 
  .(AvgPrice = mean(price),
    MedianPrice = as.numeric(median(price)),
    Count = .N
  ), 
  by = cut
][ 
  order(-Count) 
]

আপনি যদি আগে থেকেই ডেটা.ট্যাবলের সাথে পরিচিত না হন তবে এই কোডটি অনুসরণ করা আরও শক্ত। (পুনরাবৃত্তিটি [ এমনভাবে কীভাবে আমার চোখের কাছে দেখতে ভাল লাগবে তা আমিও বুঝতে পারি না)। ব্যক্তিগতভাবে, আমি যখন 6 মাস আগে লিখেছি কোডটি দেখি, এটি কোনও অপরিচিত ব্যক্তির দ্বারা লিখিত কোডটির দিকে তাকানোর মতো, তাই আমি ভারবজ, কোডটি যদি সোজাসুজি পছন্দ করতে এসেছি।

অন্য দুটি ছোটখাটো কারণ যা আমি মনে করি পাঠ্যতা কিছুটা হ্রাস পেয়েছে:

  • যেহেতু প্রায় প্রতিটি ডেটা টেবিল অপারেশন ব্যবহার [করে তা কী ঘটছে তা নির্ধারণ করার জন্য আপনার অতিরিক্ত প্রসঙ্গের প্রয়োজন। উদাহরণস্বরূপ, x[y] দুটি ডেটা টেবিলগুলিতে যোগদান করা বা কোনও ডেটা ফ্রেম থেকে কলামগুলি বের করা হচ্ছে? এটি কেবলমাত্র একটি ছোট সমস্যা, কারণ ভালভাবে লিখিত কোডে ভেরিয়েবলের নামগুলি কী ঘটছে তা বোঝাতে হবে।

  • আমি group_by()dplyr একটি পৃথক অপারেশন চাই। এটি মৌলিকভাবে গণনা পরিবর্তন করে তাই আমি মনে করি কোডটি স্কিম করার সময় স্পষ্ট হওয়া উচিত, এবং যুক্তির group_by()চেয়ে স্পট করা সহজ ।by[.data.table

আমি এটিও পছন্দ করি যে পাইপটি কেবল একটি প্যাকেজের মধ্যে সীমাবদ্ধ নয়। আপনি আপনার ডেটা পরিপাটি করে পরিপাটি করে শুরু করতে পারেন , এবং জিজিভিসে একটি প্লট দিয়ে শেষ করতে পারেন । এবং আমি যে প্যাকেজগুলি লিখি তা আপনি সীমাবদ্ধ নন - যে কেউ এমন একটি ফাংশন লিখতে পারেন যা ডেটা ম্যানিপুলেশন পাইপের একবিরাম অংশ তৈরি করে forms আসলে, আমি বরং পূর্ববর্তী ডেটা পছন্দ করি t টেবিল কোডটি এগুলি দিয়ে আবার লিখিত %>%:

diamonds %>% 
  data.table() %>% 
  .[cut != "Fair", 
    .(AvgPrice = mean(price),
      MedianPrice = as.numeric(median(price)),
      Count = .N
    ), 
    by = cut
  ] %>% 
  .[order(-Count)]

এবং সাথে পাইপিংয়ের ধারণাটি %>%কেবলমাত্র ডেটা ফ্রেমের মধ্যে সীমাবদ্ধ নয় এবং সহজেই অন্যান্য প্রসঙ্গে যেমন: ইন্টারেক্টিভ ওয়েব গ্রাফিক্স , ওয়েব স্ক্র্যাপিং , গিস্টস , রান-টাইম চুক্তি , ...)

স্মৃতি এবং কর্মক্ষমতা

আমি এগুলি একসাথে রেখেছি, কারণ আমার কাছে এগুলি এতটা গুরুত্বপূর্ণ নয়। বেশিরভাগ আর ব্যবহারকারী 1 মিলিয়ন সারি ডেটার নীচে ভাল কাজ করেন এবং dplyr সেই আকারের ডেটার জন্য পর্যাপ্ত পরিমাণে দ্রুত যা আপনি প্রক্রিয়াকরণের সময় সম্পর্কে অবগত নন। আমরা মিডিয়াম ডেটাতে প্রকাশের জন্য dplyr অনুকূল করে; বড় ডেটাতে কাঁচা গতির জন্য ডেটা টেবিল ব্যবহার করতে দ্বিধা বোধ করুন।

Dplyr এর নমনীয়তা এর অর্থ হ'ল আপনি একই সিনট্যাক্সটি ব্যবহার করে পারফরম্যান্স বৈশিষ্ট্যগুলি সহজেই টুইঙ্ক করতে পারেন। যদি ডেটা ফ্রেম ব্যাকএন্ডের সাথে ডিপি্লায়ারের পারফরম্যান্স আপনার পক্ষে যথেষ্ট ভাল না হয় তবে আপনি ডেটা.টিবল ব্যাকএন্ড ব্যবহার করতে পারেন (কিছুটা কার্যক্ষমতার সীমিত সেট থাকা সত্ত্বেও)। আপনি যে ডেটা নিয়ে কাজ করছেন সেটি যদি মেমরির সাথে খাপ খায় না, তবে আপনি একটি ডাটাবেস ব্যাকএন্ড ব্যবহার করতে পারেন।

যা যা বলেছিল, dplyr পারফরম্যান্স দীর্ঘমেয়াদে আরও ভাল হবে। আমরা অবশ্যই ডেটা-এর দুর্দান্ত কিছু ধারণাগুলি বাস্তবায়িত করব rad রডিক্সের অর্ডার দেওয়ার মতো এবং যোগসূত্র এবং ফিল্টারগুলির জন্য একই সূচক ব্যবহার করার মতো able আমরা সমান্তরালে কাজ করছি যাতে আমরা একাধিক কোরের সুবিধা নিতে পারি।

বৈশিষ্ট্য

২০১৫ সালে আমরা কয়েকটি বিষয়ে কাজ করার পরিকল্পনা করছি:

  • readrপ্যাকেজ, এটি সহজ ডিস্ক বন্ধ এবং মেমরি করার জন্য ফাইল, অনুরূপ পেতে করতে fread()

  • নন-ইকুই-যোগ দেওয়ার জন্য সমর্থন সহ আরও নমনীয় যোগ দেয়।

  • বুটস্ট্র্যাপ নমুনা, রোলআপ এবং আরও অনেক বেশি নমনীয় গোষ্ঠীকরণ

আমি আর এর ডাটাবেস সংযোগকারীগুলিকে উন্নত করতে, ওয়েব এপিআইএসের সাথে কথা বলার ক্ষমতা এবং এইচটিএমএল পৃষ্ঠাগুলি স্ক্র্যাপ করা আরও সহজ করার জন্যও সময় ব্যয় করছি ।


27
কেবলমাত্র একটি পার্শ্ব নোট, আমি আপনার অনেক যুক্তির সাথে একমত নই (যদিও আমি data.tableনিজেই সিনট্যাক্স পছন্দ করি) তবে আপনি স্টাইল পছন্দ না করলে আপনি সহজেই %>%পাইপ data.tableক্রিয়াকলাপের জন্য ব্যবহার করতে পারেন [%>%সুনির্দিষ্ট নয় dplyr, বরং একটি পৃথক প্যাকেজ থেকে আসে (যা আপনিও সহ-লেখক হয়েছিলেন), তাই আমি নিশ্চিত নই যে আপনি আপনার বেশিরভাগ সিনট্যাক্স অনুচ্ছেদে কী বলতে চাইছেন তা আমি বুঝতে পেরেছি ।
ডেভিড আরেনবুর্গ

11
@ ডেভিড আরেনবুর্গ ভাল পয়েন্ট আমি করেছি পুনরায় লিখিত বাক্য গঠন করতে আশা আরো স্পষ্ট কি আমার মূল পয়েন্ট, এবং হাইলাইট যা আপনি ব্যবহার করতে করতে %>%data.table সঙ্গে
হ্যাডলি

5
ধন্যবাদ হ্যাডলি, এটি একটি কার্যকর দৃষ্টিকোণ। আমি সাধারণত DT[\n\texpression\n][\texpression\n]( টুকরো টুকরো ) ইন্ডেন্টিং করি যা আসলে বেশ ভাল কাজ করে। আমি উত্তর হিসাবে অরুণ এর উত্তর পালন করছি তিনি আরো সরাসরি আমার নির্দিষ্ট প্রশ্ন যা এত বাক্য গঠন অভিগম্যতা সম্পর্কে নয় উত্তর, কিন্তু আমি মধ্যে পার্থক্য / মিল জন্য একটি সাধারণ অনুভূতি পেতে চেষ্টা মানুষের জন্য এই একটি ভাল উত্তর মনে dplyrএবং data.table
ব্রোডিজি

33
ইতিমধ্যে যখন কেন ফাস্ট্রেডে কাজ করছেন fread()? ফ্রেড () উন্নত করার জন্য বা অন্য (অনুন্নত) জিনিসগুলিতে কাজ করার জন্য কি সময় আরও ভালভাবে ব্যয় করা হবে না?
EDi

10
স্বরলিপিটির এপিআই data.tableপ্রতিষ্ঠিত হয়েছে []। এটিই এর বৃহত্তম শক্তি এবং এর বৃহত্তম দুর্বলতা।
পল

65

প্রশ্নের শিরোনামের প্রত্যুত্তর প্রতিক্রিয়াতে ...

dplyr অবশ্যই না পারে data.tableনা এমন কাজ করে।

আপনার পয়েন্ট # 3

dplyr বিমূর্ততা (বা ইচ্ছা) সম্ভাব্য DB মিথস্ক্রিয়া

আপনার নিজের প্রশ্নের সরাসরি উত্তর তবে উচ্চ পর্যায়ে উন্নীত হয় না। dplyrএকাধিক ডেটা স্টোরেজ মেকানিজমের সত্যই এটি একটি প্রসারিত ফ্রন্ট-এন্ড যেখানে data.tableএকক হিসাবে এক্সটেনশন।

dplyrএকই ব্যাকরণ ব্যবহার করে সমস্ত লক্ষ্যবস্তু সহ একটি ব্যাক-এন্ড অজোনস্টিক ইন্টারফেস হিসাবে দেখুন , যেখানে আপনি ইচ্ছায় লক্ষ্যবস্তু এবং হ্যান্ডলারগুলি প্রসারিত করতে পারেন। দৃষ্টিকোণ data.tableথেকে dplyr, এই লক্ষ্যগুলির মধ্যে একটি।

আপনি কখনই (আমি আশা করি) এমন কোনও দিন দেখতে পাবেন না যা data.tableএসকিউএল স্টেটমেন্ট তৈরি করতে আপনার প্রশ্নগুলি অনুবাদ করার চেষ্টা করে যা অন ডিস্ক বা নেটওয়ার্ক ডেটা স্টোরগুলি দিয়ে কাজ করে।

dplyrসম্ভবত জিনিসগুলি করতে পারে data.tableবা করতে পারে না বা করতে পারে না।

মেমরি-এ কাজ করার নকশার ভিত্তিতে data.table, প্রশ্নের তুলনায় সমান্তরাল প্রক্রিয়াকরণে নিজেকে প্রসারিত করতে আরও অনেক বেশি কঠিন সময় থাকতে পারে dplyr


অভ্যন্তরীণ প্রশ্নের উত্তরে ...

ব্যবহার

বিশ্লেষণমূলক কাজগুলি রয়েছে যা প্যাকেজগুলির সাথে পরিচিত ব্যক্তিদের জন্য এক বা অন্য প্যাকেজের সাথে কোড করা অনেক সহজ (যেমন কী-স্ট্রোকের কিছু সংমিশ্রণ প্রয়োজন বনাম প্রয়োজনীয় স্তরের প্রয়োজনীয় স্তরের যেখানে প্রতিটিটির কম কাজই ভাল জিনিস)।

এটি প্যান্টের মতো মনে হতে পারে তবে আসল উত্তরটি হ'ল না। সরঞ্জামগুলির সাথে পরিচিত লোকেরা মনে হয় যে তাদের মধ্যে সবচেয়ে পরিচিত একজন বা হাতের কাজটির জন্য যা সত্যই সঠিক one এই কথার সাথে, কখনও কখনও আপনি একটি নির্দিষ্ট পাঠযোগ্যতা উপস্থাপন করতে চান, কখনও কখনও একটি স্তরের পারফরম্যান্স এবং যখন আপনার উভয়ের একটি উচ্চ পর্যায়ে পর্যাপ্ত প্রয়োজন হয় তখন আপনাকে যা পরিষ্কারভাবে বিমূর্ততা তৈরি করতে হবে তার সাথে যেতে অন্য একটি সরঞ্জামের প্রয়োজন হতে পারে ।

কর্মক্ষমতা

এমন একটি বিশ্লেষণমূলক কাজ রয়েছে যা একটি প্যাকেজ বনাম অন্য প্যাকেজে আরও দক্ষতার সাথে (যেমন 2x এর বেশি) সম্পাদিত হয়।

আবার, না। অন্তর্নিহিত ডেটা স্টোর এবং নিবন্ধিত হ্যান্ডলারের ক্ষেত্রে কিছু ক্ষেত্রে সীমাবদ্ধ থাকার বোঝা পায় সেখানে data.tableযা কিছু করা যায় তাতে দক্ষ হয়ে dplyrওঠায় এক্সেলস।

সঙ্গে এই উপায়ে আপনি যখন কোনো কার্য-সম্পাদনার সমস্যা পাতিত data.tableআপনি নিশ্চিত এটা আপনার প্রশ্নের ফাংশন আছে এবং যদি এটা হতে পারে হয় আসলে সঙ্গে একটি বোতলের data.tableতারপর আপনি নিজেকে একটি প্রতিবেদন দাখিল আনন্দ জিতেছ। ব্যাক-এন্ড হিসাবে dplyrব্যবহার করার সময় এটিও সত্য data.table; আপনি পারে দেখতে কিছু থেকে ওভারহেড dplyrকিন্তু মতভেদ এটা আপনার প্রশ্নের আছে।

যখন dplyrব্যাক-এন্ডের সাথে পারফরম্যান্সের সমস্যা রয়েছে আপনি হাইব্রিড মূল্যায়নের জন্য একটি ফাংশন নিবন্ধন করে বা (ডেটাবেসগুলির ক্ষেত্রে) কার্যকর করার আগে উত্পন্ন উত্পন্ন ক্যোয়ারীটি পরিচালনা করে তাদের কাছাকাছি যেতে পারেন।

এছাড়াও প্লাইার কখন ডেটা.ট্যাবিলের চেয়ে ভাল সেটার গ্রহণযোগ্য উত্তরটি দেখুন ?


3
Tbl_dt সহ একটি ডেটা.ট্যাবল মোড়ানো ক্যান dplyr? কেন শুধু উভয় বিশ্বের সেরা পাবেন না?
aaa90210

22
আপনি বিপরীত বিবৃতি উল্লেখ করতে ভুলে গেছেন "ডেটা। টেবিল অবশ্যই dplyr পারেন না এমন কাজগুলি করে" যা সত্য।
jangorecki

25
অরুণ উত্তর এটি ভাল ব্যাখ্যা। সর্বাধিক গুরুত্বপূর্ণ (পারফরম্যান্সের দিক দিয়ে) হ'ল ফ্রিড, রেফারেন্স অনুসারে আপডেট হওয়া, রোলিং যোগ দেয়, ওভারল্যাপিং যোগ দেয়। আমি বিশ্বাস করি যে এমন কোনও প্যাকেজ নেই (কেবলমাত্র dplyr নয়) যা এই বৈশিষ্ট্যগুলির সাথে প্রতিযোগিতা করতে পারে। একটি দুর্দান্ত উদাহরণ এই উপস্থাপনা থেকে শেষ স্লাইড হতে পারে ।
জঙ্গোরেকে

15
সামগ্রিকভাবে, ডেটা.ট্যাবলই কেন আমি এখনও আর ব্যবহার করি নাহলে আমি পান্ডা ব্যবহার করতাম as এটি পান্ডাদের চেয়ে আরও ভাল / দ্রুত।
মার্বেল

8
আমি ডেটা টেবিল পছন্দ করি কারণ এর সরলতা এবং এসকিউএল সিনট্যাক্স কাঠামোর সাথে সাদৃশ্য রয়েছে। আমার কাজের পরিসংখ্যানগত মডেলিংয়ের জন্য প্রতিদিন খুব তীব্র অ্যাডহক ডেটা বিশ্লেষণ এবং গ্রাফিক্স করা জড়িত এবং জটিল জিনিসগুলি করার জন্য আমার খুব সহজ সরঞ্জাম প্রয়োজন। এখন আমি আমার সরঞ্জামকিটটি কেবলমাত্র ডেটাতে কমিয়ে দিতে পারি my আমার দৈনন্দিন কাজের গ্রাফের জন্য ডেটা এবং ল্যাটিসের জন্য টেবিল। একটি উদাহরণ দিন এমনকি আমি এর মতো অপারেশনগুলিও করতে পারি: $ টিটি [গোষ্ঠী == 1, y_hat: = পূর্বাভাস (ফিট 1, ডেটা =। এসডি),] $, যা সত্যই ঝরঝরে এবং আমি এটিকে এসকিউএল থেকে একটি দুর্দান্ত সুবিধা হিসাবে বিবেচনা করি ক্লাসিক আর পরিবেশ।
xappppp
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.