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