আর-এ ডেটাফ্রেমগুলিতে সংযুক্ত / যুক্ত হওয়ার দ্রুততম উপায় কী?


97

উদাহরণস্বরূপ (যদিও বেশিরভাগ প্রতিনিধির উদাহরণ নিশ্চিত না):

N <- 1e6
d1 <- data.frame(x=sample(N,N), y1=rnorm(N))
d2 <- data.frame(x=sample(N,N), y2=rnorm(N))

আমি এ পর্যন্ত এটি পেয়েছি:

d <- merge(d1,d2)
# 7.6 sec

library(plyr)
d <- join(d1,d2)
# 2.9 sec

library(data.table)
dt1 <- data.table(d1, key="x")
dt2 <- data.table(d2, key="x")
d <- data.frame( dt1[dt2,list(x,y1,y2=dt2$y2)] )
# 4.9 sec

library(sqldf)
sqldf()
sqldf("create index ix1 on d1(x)")
sqldf("create index ix2 on d2(x)")
d <- sqldf("select * from d1 inner join d2 on d1.x=d2.x")
sqldf()
# 17.4 sec

স্ক্যালডিএফ করার সঠিক উপায়টি নীচে গ্যাবার দ্বারা নির্দেশিত: কেবলমাত্র একটি সূচক তৈরি করুন (ডি 1 বলুন) এবং নির্বাচনের বিবৃতিতে ডি 1 এর পরিবর্তে d1.main ব্যবহার করুন (অন্যথায় এটি সূচকটি ব্যবহার করবে না)। সময় এই ক্ষেত্রে 13.6 সেকেন্ড হয়। উভয় সারণীতে বিল্ডিং সূচকগুলি আসলে ডেটা. টেবিল ক্ষেত্রে প্রয়োজন হয় না, কেবল "dt2 <- data.table (d2)" করুন এবং সময়কালটি হবে 3.9 সেকেন্ড।
ডেটাসমুফ

উভয় উত্তর মূল্যবান তথ্য সরবরাহ করে, উভয়ই মূল্যবান (যদিও কেবল একজনই "গ্রহণযোগ্য" হতে পারে)।
ডেটাসমুরফ

আপনি আপনার প্রশ্নের অভ্যন্তরীণ যোগদানের সাথে বাম
জোড়ার

উত্তর:


46

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

DF1 = data.frame(a = c(1, 1, 2, 2), b = 1:4)
DF2 = data.frame(b = c(1, 2, 3, 3, 4), c = letters[1:5])
merge(DF1, DF2)
    b a c
  1 1 1 a
  2 2 1 b
  3 3 2 c
  4 3 2 d
  5 4 2 e
DF1$c = DF2$c[match(DF1$b, DF2$b)]
DF1$c
[1] a b c e
Levels: a b c d e

> DF1
  a b c
1 1 1 a
2 1 2 b
3 2 3 c
4 2 4 e

প্রশ্নটিতে পোস্ট করা স্ক্যালডিএফ কোডে, সম্ভবত প্রদর্শিত হতে পারে যে দুটি টেবিলের উপর সূচকগুলি ব্যবহার করা হয়েছিল তবে বাস্তবে, সেগুলি টেবিলগুলিতে স্থাপন করা হয় যা স্ক্যুচল নির্বাচন করার আগে কখনও ওভাররাইট করা হয়েছিল এবং এটি কিছু অংশের জন্য কেন অ্যাকাউন্টস? এটা এত ধীর। স্ক্যালডিএফের ধারণাটি হল যে আপনার আর সেশনের ডেটা ফ্রেমগুলি ডেটা বেস গঠন করে, স্ক্লাইটে থাকা সারণীগুলি নয়। সুতরাং প্রতিবার কোডটি একটি অযোগ্য টেবিলের নাম উল্লেখ করে এটি এর জন্য আপনার আর ওয়ার্কস্পেসে দেখবে - স্ক্লাইটের মূল ডাটাবেসে নয়। সুতরাং যে নির্বাচিত বিবৃতি প্রদর্শিত হয়েছিল তা কর্মক্ষেত্র থেকে স্ক্লাইটের মূল ডাটাবেসে ডি 1 এবং ডি 2 পড়েন যা সূচকের সাথে সেখানে ছিল clo ফলস্বরূপ এটি কোনও সূচক ছাড়াই একটি যোগদান করে। আপনি যদি স্ক্লাইটের মূল ডাটাবেসে থাকা ডি 1 এবং ডি 2 সংস্করণগুলি ব্যবহার করতে চান তবে আপনাকে সেগুলিকে মেইন.ডি 1 এবং প্রধান হিসাবে উল্লেখ করতে হবে। d2 এবং ডি 1 এবং ডি 2 হিসাবে নয়। এছাড়াও, আপনি যদি এটিকে যত তাড়াতাড়ি চালানোর চেষ্টা করছেন তবে নোট করুন যে একটি সাধারণ জয়েন উভয় টেবিলের উপর সূচকগুলি ব্যবহার করতে পারে না যাতে আপনি সূচকগুলির একটি তৈরির সময় বাঁচাতে পারেন। নীচের কোডে আমরা এই পয়েন্টগুলি বর্ণনা করি।

সুনির্দিষ্ট গণনা যে প্যাকেজটি দ্রুততম তার উপর একটি বিশাল পার্থক্য করতে পারে তা লক্ষ করা উপযুক্ত। উদাহরণস্বরূপ, আমরা নীচে একটি সংহতকরণ এবং একটি সমষ্টি করি। আমরা দেখতে পাচ্ছি যে ফলাফল দুটির জন্য প্রায় বিপরীত। দ্রুততম থেকে ধীরে ধীরে আমরা প্রথম উদাহরণে পেয়েছি: ডেটা.ট্যাবিল, প্লাইার, মার্জ এবং স্কোলেডফ যেখানে দ্বিতীয় উদাহরণে স্ক্যালডিএফ, সমষ্টি, ডেটা টেবিল এবং প্লেয়ার - প্রায় প্রথমটির বিপরীতে। প্রথম উদাহরণে বর্গফুফটি ডেটা.ট্যাবিলের চেয়ে 3x ধীর এবং দ্বিতীয়টিতে এটি 200x প্লায়ারের চেয়ে দ্রুত এবং ডেটা.টেবলের চেয়ে 100 গুণ দ্রুত faster নীচে আমরা ইনপুট কোডটি দেখাব, সংশ্লেষের জন্য আউটপুট সময় এবং সমষ্টিগুলির জন্য আউটপুট সময়। এটি আরও সার্থকভাবে লক্ষণীয় যে sqldf একটি ডাটাবেসের উপর ভিত্তি করে এবং তাই হ্যান্ডেল করতে পারবেন R এর চেয়ে বড় অবজেক্টগুলিকে পরিচালনা করতে পারে (আপনি যদি sqldf এর dbname যুক্তি ব্যবহার করেন) তবে অন্যান্য পন্থাগুলি মূল স্মৃতিতে প্রক্রিয়াজাতকরণের মধ্যে সীমাবদ্ধ। এছাড়াও আমরা স্ক্লাইটের সাথে স্কেলডিএফ চিত্রিত করেছি তবে এটি H2 এবং পোস্টগ্র্রেএসকিউএল ডাটাবেসগুলিকেও সমর্থন করে।

library(plyr)
library(data.table)
library(sqldf)

set.seed(123)
N <- 1e5
d1 <- data.frame(x=sample(N,N), y1=rnorm(N))
d2 <- data.frame(x=sample(N,N), y2=rnorm(N))

g1 <- sample(1:1000, N, replace = TRUE)
g2<- sample(1:1000, N, replace = TRUE)
d <- data.frame(d1, g1, g2)

library(rbenchmark)

benchmark(replications = 1, order = "elapsed",
   merge = merge(d1, d2),
   plyr = join(d1, d2),
   data.table = { 
      dt1 <- data.table(d1, key = "x")
      dt2 <- data.table(d2, key = "x")
      data.frame( dt1[dt2,list(x,y1,y2=dt2$y2)] )
      },
   sqldf = sqldf(c("create index ix1 on d1(x)",
      "select * from main.d1 join d2 using(x)"))
)

set.seed(123)
N <- 1e5
g1 <- sample(1:1000, N, replace = TRUE)
g2<- sample(1:1000, N, replace = TRUE)
d <- data.frame(x=sample(N,N), y=rnorm(N), g1, g2)

benchmark(replications = 1, order = "elapsed",
   aggregate = aggregate(d[c("x", "y")], d[c("g1", "g2")], mean), 
   data.table = {
      dt <- data.table(d, key = "g1,g2")
      dt[, colMeans(cbind(x, y)), by = "g1,g2"]
   },
   plyr = ddply(d, .(g1, g2), summarise, avx = mean(x), avy=mean(y)),
   sqldf = sqldf(c("create index ix on d(g1, g2)",
      "select g1, g2, avg(x), avg(y) from main.d group by g1, g2"))
)

মার্জ গণনার তুলনা করে দুটি বেঞ্চমার্ক কল থেকে আউটপুটগুলি হ'ল:

Joining by: x
        test replications elapsed relative user.self sys.self user.child sys.child
3 data.table            1    0.34 1.000000      0.31     0.01         NA        NA
2       plyr            1    0.44 1.294118      0.39     0.02         NA        NA
1      merge            1    1.17 3.441176      1.10     0.04         NA        NA
4      sqldf            1    3.34 9.823529      3.24     0.04         NA        NA

সামগ্রিক গণনার তুলনা করে বেঞ্চমার্ক কল থেকে আউটপুটটি হ'ল:

        test replications elapsed  relative user.self sys.self user.child sys.child
4      sqldf            1    2.81  1.000000      2.73     0.02         NA        NA
1  aggregate            1   14.89  5.298932     14.89     0.00         NA        NA
2 data.table            1  132.46 47.138790    131.70     0.08         NA        NA
3       plyr            1  212.69 75.690391    211.57     0.56         NA        NA

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

"সমষ্টি" মামলা সম্পর্কে মন্তব্যটিও আমি প্রশংসা করি। যদিও এটি প্রশ্নের মধ্যে "মার্জ" সেটআপের চেয়ে আলাদা তবে এটি খুব প্রাসঙ্গিক। আমি আসলে এটি সম্পর্কে একটি পৃথক প্রশ্ন জিজ্ঞাসা করা হবে, কিন্তু এখানে ইতিমধ্যে একটি এখানে আছে stackoverflow.com/questions/3685492/… । উপরের ফলাফলের উপর ভিত্তি করে আপনি স্কেলডিএফ সমাধানটি বিদ্যমান সমস্ত উত্তরগুলিকে পরাজিত করতে পারেন;)
ডাটাস্মুরফ

40

গ্যাবরের ফলাফলগুলিতে 132 সেকেন্ডের জন্য রিপোর্ট করা হয়েছে data.tableআসলে বেস ফাংশনগুলির সময় নির্ধারণ colMeansএবং cbind(সেই ফাংশনগুলি ব্যবহার করে মেমরির বরাদ্দ এবং অনুলিপি করা)। ব্যবহারের ভাল এবং খারাপ উপায়ও রয়েছে data.table

benchmark(replications = 1, order = "elapsed", 
  aggregate = aggregate(d[c("x", "y")], d[c("g1", "g2")], mean),
  data.tableBad = {
     dt <- data.table(d, key = "g1,g2") 
     dt[, colMeans(cbind(x, y)), by = "g1,g2"]
  }, 
  data.tableGood = {
     dt <- data.table(d, key = "g1,g2") 
     dt[, list(mean(x),mean(y)), by = "g1,g2"]
  }, 
  plyr = ddply(d, .(g1, g2), summarise, avx = mean(x), avy=mean(y)),
  sqldf = sqldf(c("create index ix on d(g1, g2)",
      "select g1, g2, avg(x), avg(y) from main.d group by g1, g2"))
  ) 

            test replications elapsed relative user.self sys.self
3 data.tableGood            1    0.15    1.000      0.16     0.00
5          sqldf            1    1.01    6.733      1.01     0.00
2  data.tableBad            1    1.63   10.867      1.61     0.01
1      aggregate            1    6.40   42.667      6.38     0.00
4           plyr            1  317.97 2119.800    265.12    51.05

packageVersion("data.table")
# [1] ‘1.8.2’
packageVersion("plyr")
# [1] ‘1.7.1’
packageVersion("sqldf")
# [1] ‘0.4.6.4’
R.version.string
# R version 2.15.1 (2012-06-22)

দয়া করে নোট করুন যে আমি প্লাইয়ার ভাল জানেন না তাই দয়া করে plyrএখানে সময় নির্ভর করার আগে হ্যাডলির সাথে চেক করুন। এছাড়াও নোট করুন যে data.tableকি কি রূপান্তর data.tableএবং চাবি সেট করার সময় অন্তর্ভুক্ত , ভাড়া জন্য।


মূলত ডিসেম্বর ২০১০-এ উত্তর দেওয়ার পরে এই উত্তরটি আপডেট করা হয়েছে The পূর্ববর্তী মানদণ্ডের ফলাফলগুলি নীচে। কি পরিবর্তন হয়েছে তা দেখতে দয়া করে এই উত্তরের সংশোধন ইতিহাস দেখুন।

              test replications elapsed   relative user.self sys.self
4   data.tableBest            1   0.532   1.000000     0.488    0.020
7            sqldf            1   2.059   3.870301     2.041    0.008
3 data.tableBetter            1   9.580  18.007519     9.213    0.220
1        aggregate            1  14.864  27.939850    13.937    0.316
2  data.tableWorst            1 152.046 285.800752   150.173    0.556
6 plyrwithInternal            1 198.283 372.712406   189.391    7.665
5             plyr            1 225.726 424.296992   208.013    8.004

যেহেতু ডিডিপ্লাই শুধুমাত্র ডেটা ফ্রেমের সাথে কাজ করে, এটি উদাহরণস্বরূপ সবচেয়ে খারাপ কার্য সম্পাদন করে। আমি ভবিষ্যতের সংস্করণে এই ধরণের প্রচলিত ক্রিয়াকলাপের জন্য আরও ভাল ইন্টারফেসের আশা করি।
হ্যাডলি

4
এফওয়াইআই: আপনি .Internalসিআরএএন প্যাকেজগুলিতে কলগুলি ব্যবহার করতে পারবেন না , সিআরএএন সংগ্রহস্থল নীতি দেখুন
জোশুয়া উলরিখ

@ জোশুয়া অলিরিচ আপনি উত্তরটি প্রায় 2 বছর আগে যখন লেখা হয়েছিল তখন আপনি করতে পারেন। এই উত্তরটি data.tableস্বয়ংক্রিয়ভাবে meanএখনই অনুকূল হিসাবে ( .Internalঅভ্যন্তরীণভাবে কল না করে ) আপডেট করব ।
ম্যাট ডাউল

@ ম্যাথেজডোলে: হ্যাঁ, কখন / কখন এটি পরিবর্তন হয়েছে তা আমি নিশ্চিত নই। আমি এখন জানি এটা কেস। এবং এটি আপনার উত্তরে পুরোপুরি ঠিক আছে, কেবল প্যাকেজগুলিতে কাজ করবে না।
জোশুয়া উলরিখ

4
ধন্যবাদ। আমি এখানে আপনার মন্তব্যগুলি বিদ্যমান বৈশিষ্ট্য অনুরোধ # 599 এর সাথে যুক্ত করেছি । আসুন সেখানে চলে যাক। আপনার উদাহরণ কোডটি সুন্দরভাবে forলুপটি দেখায় , এটি বেশ ভাল। আপনি কি এই ইস্যুতে "এসএমএম বিশ্লেষণ" সম্পর্কে আরও তথ্য যুক্ত করতে পারেন? উদাহরণস্বরূপ আমি অনুমান করছি যে SEM = ইলেক্ট্রন মাইক্রোস্কোপ স্ক্যান করছে? অ্যাপ্লিকেশন সম্পর্কে আরও জানার বিষয়টি আমাদের কাছে আরও আকর্ষণীয় করে তোলে এবং আমাদের অগ্রাধিকার দিতে সহায়তা করে।
ম্যাট ডাউলে

16

সহজ কাজের জন্য (যোগদানের উভয় পক্ষের অনন্য মান) আমি ব্যবহার করি match:

system.time({
    d <- d1
    d$y2 <- d2$y2[match(d1$x,d2$x)]
})

এটি মার্জয়ের চেয়ে অনেক বেশি দ্রুত (আমার মেশিনে 0.13 থেকে 3.37 এস)।

আমার সময়:

  • merge: 3.32s
  • plyr: 0.84 এস
  • match: 0.12 এস

4
ধন্যবাদ, মারেক। এটি এত দ্রুত কেন (ইনডেক্স / হ্যাশ টেবিল তৈরি করে) এর কয়েকটি ব্যাখ্যা এখানে পাওয়া যাবে: tolstoy.newcastle.edu.au/R/help/01c/2739.html
datasmurf

11

ভেবেছিলেন মিশ্রণে ডিপ্লিয়ার সহ একটি বেঞ্চমার্ক পোস্ট করা আকর্ষণীয় হবে: (প্রচুর জিনিস চলছিল)

            test replications elapsed relative user.self sys.self
5          dplyr            1    0.25     1.00      0.25     0.00
3 data.tableGood            1    0.28     1.12      0.27     0.00
6          sqldf            1    0.58     2.32      0.57     0.00
2  data.tableBad            1    1.10     4.40      1.09     0.01
1      aggregate            1    4.79    19.16      4.73     0.02
4           plyr            1  186.70   746.80    152.11    30.27

packageVersion("data.table")
[1] ‘1.8.10’
packageVersion("plyr")
[1] ‘1.8’
packageVersion("sqldf")
[1] ‘0.4.7’
packageVersion("dplyr")
[1] ‘0.1.2’
R.version.string
[1] "R version 3.0.2 (2013-09-25)"

সম্প্রতি যোগ করা:

dplyr = summarise(dt_dt, avx = mean(x), avy = mean(y))

এবং dplyr এর জন্য ডেটা টেবিল সহ ডেটা সেটআপ করুন:

dt <- tbl_dt(d)
dt_dt <- group_by(dt, g1, g2)

আপডেট করা হয়েছে: আমি ডেটা.ট্যাবাল এবং প্লাইয়ার এবং আর স্টুডিও ওপেন (আই 7, 16 গিগাবাইট র‌্যাম) ছাড়া আর কিছুই সরিয়েছি।

ডেটা.ট্যাবল 1.9 এবং ডেপি ফ্রেম সহ dplyr সহ:

            test replications elapsed relative user.self sys.self
2 data.tableGood            1    0.02      1.0      0.02     0.00
3          dplyr            1    0.04      2.0      0.04     0.00
4          sqldf            1    0.46     23.0      0.46     0.00
1      aggregate            1    6.11    305.5      6.10     0.02

ডেটা টেবিলের সাথে ডেটা.ট্যাবল 1.9 এবং dplyr সহ:

            test replications elapsed relative user.self sys.self
2 data.tableGood            1    0.02        1      0.02     0.00
3          dplyr            1    0.02        1      0.02     0.00
4          sqldf            1    0.44       22      0.43     0.02
1      aggregate            1    6.14      307      6.10     0.01

packageVersion("data.table")
[1] '1.9.0'
packageVersion("dplyr")
[1] '0.1.2'

ধারাবাহিকতার জন্য এখানে সমস্ত এবং ডেটা সহ টেক্সট 1.9 টেবিল এবং dplyr এর সাথে আসল রয়েছে:

            test replications elapsed relative user.self sys.self
5          dplyr            1    0.01        1      0.02     0.00
3 data.tableGood            1    0.02        2      0.01     0.00
6          sqldf            1    0.47       47      0.46     0.00
1      aggregate            1    6.16      616      6.16     0.00
2  data.tableBad            1   15.45     1545     15.38     0.01
4           plyr            1  110.23    11023     90.46    19.52

আমি মনে করি নতুন ডেটা.টেবিল এবং ডিপ্লাইয়ারের জন্য এই ডেটাটি খুব ছোট :)

আরও বড় ডেটা সেট:

N <- 1e8
g1 <- sample(1:50000, N, replace = TRUE)
g2<- sample(1:50000, N, replace = TRUE)
d <- data.frame(x=sample(N,N), y=rnorm(N), g1, g2)

বেনমার্ক চালানোর আগে ডেটা ধরে রাখতে প্রায় 10-13 জিবি র্যাম নিয়েছেন।

ফলাফল:

            test replications elapsed relative user.self sys.self
1          dplyr            1   14.88        1      6.24     7.52
2 data.tableGood            1   28.41        1     18.55      9.4

1 বিলিয়ন চেষ্টা করেও ভেড়া মেরে ফেলেছে। 32 জিবি এটি কোনও সমস্যা হ্যান্ডেল করবে।


[অরুণ সম্পাদনা করুন] (ডটকমেন, আপনি কি দয়া করে এই কোডটি চালাতে পারেন এবং আপনার বেঞ্চমার্কিং ফলাফলগুলি পেস্ট করতে পারেন? ধন্যবাদ)

require(data.table)
require(dplyr)
require(rbenchmark)

N <- 1e8
g1 <- sample(1:50000, N, replace = TRUE)
g2 <- sample(1:50000, N, replace = TRUE)
d <- data.frame(x=sample(N,N), y=rnorm(N), g1, g2)

benchmark(replications = 5, order = "elapsed", 
  data.table = {
     dt <- as.data.table(d) 
     dt[, lapply(.SD, mean), by = "g1,g2"]
  }, 
  dplyr_DF = d %.% group_by(g1, g2) %.% summarise(avx = mean(x), avy=mean(y))
) 

অরুণের অনুরোধ অনুসারে আপনি আমাকে যা চালানোর জন্য সরবরাহ করেছেন তার ফলাফল:

        test replications elapsed relative user.self sys.self
1 data.table            5   15.35     1.00     13.77     1.57
2   dplyr_DF            5  137.84     8.98    136.31     1.44

বিভ্রান্তির জন্য দুঃখিত, গভীর রাতটি আমার কাছে পেল।

ডেটা ফ্রেমের সাথে dplyr ব্যবহার করা সংক্ষিপ্তসারগুলি প্রক্রিয়া করার কম দক্ষ উপায় বলে মনে হয়। এই পদ্ধতিগুলি কি ডেটা.টিবল এবং dplyr এর সঠিক কার্যকারিতাটির সাথে তাদের ডেটা কাঠামোর পদ্ধতির অন্তর্ভুক্ত করতে পারে? আমি প্রায় পৃথক করতে পছন্দ করব যেহেতু আমাদের গ্রুপিং বা ডেটা তৈরি করার আগে বেশিরভাগ ডেটা পরিষ্কার করা দরকার। টেবিল able এটি স্বাদের বিষয় হতে পারে তবে আমি মনে করি সবচেয়ে গুরুত্বপূর্ণ অংশটি হ'ল ডেটা কীভাবে দক্ষতার সাথে মডেল করা যায়।


4
সুন্দর আপডেট। ধন্যবাদ আমি মনে করি আপনার ডেটা সেটটির তুলনায় আপনার মেশিনটি একটি জানোয়ার .. আপনার এল 2 ক্যাশেটির আকার (এবং উপস্থিত থাকলে L3) কী?
অরুণ

আই 7 এল 2 2x256 কেবি 8-ওয়ে, এল 3 4 এমবি 16-ওয়ে। 128 গিগাবাইট এসএসডি, একটি ডেল
অনুপ্রেরণায়

4
আপনি আপনার উদাহরণ পুনরায় ফর্ম্যাট করতে পারেন? আমি কিছুটা বিভ্রান্ত। ডেপ্লিয়ারের চেয়ে ডেটা.টিটেবল কি ভাল (এই উদাহরণে) ভাল? যদি তাই হয়, কি পরিস্থিতিতে.
csgillespie

1

মার্জ ফাংশন এবং এর alচ্ছিক পরামিতি ব্যবহার করে:

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

Outer join: merge(x = df1, y = df2, by = "CustomerId", all = TRUE)

Left outer: merge(x = df1, y = df2, by = "CustomerId", all.x = TRUE)

Right outer: merge(x = df1, y = df2, by = "CustomerId", all.y = TRUE)

Cross join: merge(x = df1, y = df2, by = NULL)

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