এক্স [ওয়াই] ডেটাতে যোগদান করা কেন? টেবিলগুলি পুরো বাইরের যোগদানের বা বামে যোগ দেওয়ার অনুমতি দেয় না?


123

এটি ডেটা সম্পর্কিত দার্শনিক প্রশ্নটির একটি অংশ join আমি ডেটা টেবিলগুলির জন্য আরও এবং বেশি ব্যবহার সন্ধান করছি, তবে এখনও শিখছি ...

X[Y]ডেটা টেবিলগুলির জন্য যোগদানের ফর্ম্যাটটি খুব সংক্ষিপ্ত, সহজ এবং দক্ষ, তবে যতদূর আমি বলতে পারি এটি কেবল অভ্যন্তরীণ যোগদান এবং ডান বাহ্যিক যোগদানগুলিকে সমর্থন করে। বাম বা পুরো বাহ্যিক যোগদানের জন্য, আমাকে ব্যবহার করতে হবে merge:

  • X[Y, nomatch = NA] - Y এর সমস্ত সারি - ডান বাহিরের জোড় (ডিফল্ট)
  • X[Y, nomatch = 0] - এক্স এবং ওয়াই উভয় ক্ষেত্রেই কেবল সারি - অভ্যন্তরীণ যোগদান
  • merge(X, Y, all = TRUE) - এক্স এবং ওয়াই উভয় থেকে সমস্ত সারি - সম্পূর্ণ বাহ্যিক যোগদান
  • merge(X, Y, all.x = TRUE) - এক্স এর সমস্ত সারি - বাম বাহিরের জোড়

আমার কাছে মনে হচ্ছে যে X[Y]জয়েন ফর্ম্যাটটি 4 প্রকারের সমস্ত প্রকারের সাথে যোগদান করলে এটি কার্যকর হবে। কেবলমাত্র দুই প্রকারের যোগদানের কোনও কারণ রয়েছে?

আমার জন্য, nomatch = 0এবং nomatch = NAপরামিতি মানগুলি ক্রিয়া সম্পাদনের জন্য খুব স্বজ্ঞাত নয়। এটা আমাকে বোঝার জন্য এবং মনে রাখবেন হয় merge: সিনট্যাক্স all = TRUE, all.x = TRUEএবং all.y = TRUEX[Y]অপারেশনটি যেহেতু এর mergeচেয়ে অনেক বেশি সাদৃশ্যযুক্ত match, তাই ফাংশনটির প্যারামিটারের mergeপরিবর্তে সংশ্লেষটি কেন যোগদান করবে না ?matchnomatch

এখানে 4 টি যুক্ত হওয়ার কোডের উদাহরণ রয়েছে:

# sample X and Y data.tables
library(data.table)
X <- data.table(t = 1:4, a = (1:4)^2)
setkey(X, t)
X
#    t  a
# 1: 1  1
# 2: 2  4
# 3: 3  9
# 4: 4 16

Y <- data.table(t = 3:6, b = (3:6)^2)
setkey(Y, t)
Y
#    t  b
# 1: 3  9
# 2: 4 16
# 3: 5 25
# 4: 6 36

# all rows from Y - right outer join
X[Y]  # default
#  t  a  b
# 1: 3  9  9
# 2: 4 16 16
# 3: 5 NA 25
# 4: 6 NA 36

X[Y, nomatch = NA]  # same as above
#    t  a  b
# 1: 3  9  9
# 2: 4 16 16
# 3: 5 NA 25
# 4: 6 NA 36

merge(X, Y, by = "t", all.y = TRUE)  # same as above
#    t  a  b
# 1: 3  9  9
# 2: 4 16 16
# 3: 5 NA 25
# 4: 6 NA 36

identical(X[Y], merge(X, Y, by = "t", all.y = TRUE))
# [1] TRUE

# only rows in both X and Y - inner join
X[Y, nomatch = 0]  
#    t  a  b
# 1: 3  9  9
# 2: 4 16 16

merge(X, Y, by = "t")  # same as above
#    t  a  b
# 1: 3  9  9
# 2: 4 16 16

merge(X, Y, by = "t", all = FALSE)  # same as above
#    t  a  b
# 1: 3  9  9
# 2: 4 16 16

identical( X[Y, nomatch = 0], merge(X, Y, by = "t", all = FALSE) )
# [1] TRUE

# all rows from X - left outer join
merge(X, Y, by = "t", all.x = TRUE)
#    t  a  b
# 1: 1  1 NA
# 2: 2  4 NA
# 3: 3  9  9
# 4: 4 16 16

# all rows from both X and Y - full outer join
merge(X, Y, by = "t", all = TRUE)
#    t  a  b
# 1: 1  1 NA
# 2: 2  4 NA
# 3: 3  9  9
# 4: 4 16 16
# 5: 5 NA 25
# 6: 6 NA 36

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


4
আপনি কি FAQ 1.12 পড়েছেন ? আপনি সর্বদা কল করতে পারেন Y[X]যদি আপনি চান বাম বাইরের যোগদানের এর X[Y]এবং rbind(Y[X],X[Y])যদি আপনি একটি সম্পূর্ণ বাইরের চান যোগদানের
mnel

আরও তথ্যের জন্য আমার উত্তর দেখুন full সম্পূর্ণ বাহ্যিক যোগদানের জন্য
টেবিলের সারণি

@ মণেল, আমি ধরে নিলাম unique()সম্পূর্ণ যোগদানের জন্য নীচে আপনার পদ্ধতির পক্ষে অগ্রাধিকারযোগ্য rbind(Y[X],X[Y]), যেহেতু rbind টেবিলটি অনুলিপি করতে জড়িত। এটা কি সঠিক?
ডগলাস ক্লার্ক

আমার জ্ঞানের সেরা, হ্যাঁ তিনটি ছোট অনন্য কল একটি বৃহত্তর চেয়ে দ্রুততর কিনা তা আমি পরীক্ষা করিনি (উদাহরণস্বরূপ unique(c(unique(X[,t]), unique(Y[,t]))- এটি আরও মেমরির দক্ষ হওয়া উচিত কারণ এটি কেবলমাত্র দুটি তালিকার সংমিশ্রণ যা এক্স এবং ওয়াইয়ের সারিগুলির সংখ্যার চেয়ে কম বা সমান হতে চলেছে) ।

2
আপনার প্রশ্ন যেমন একটি ভাল বিবরণ; আমি আপনার প্রশ্নে আমার প্রশ্নের উত্তর পেয়েছি। ধন্যবাদ
01

উত্তর:


71

এফএকিউ 1.11 থেকে উদ্ধৃতি দিতে এবং এর data.table মধ্যে পার্থক্য কী ?X[Y]merge(X, Y)

X[Y] হ'ল একটি যুক্ত, Y এর সূচি হিসাবে Y এর (বা যদি এর যদি থাকে তবে) এর সারি সন্ধান করে।

Y[X] এটি একটি যোগদান, এক্স ব্যবহার করে Y এর সারিগুলি অনুসন্ধান করা (বা এটির যদি এক্স এর কী থাকে)

merge(X,Y)একই সাথে উভয় উপায়ে করে। সারি সংখ্যা X[Y]এবং Y[X]সাধারণত ভিন্ন, যেহেতু সারির সংখ্যা দ্বারা ফিরে merge(X,Y)এবং merge(Y,X)একই।

কিন্তু এটি মূল পয়েন্টটি মিস করে। যোগদান বা সংযুক্তির পরে বেশিরভাগ টাস্কগুলিতে ডেটাতে কিছু করা প্রয়োজন। কেবলমাত্র তার পরে একটি ছোট উপসেট ব্যবহার করার জন্য, সমস্ত কলামের ডেটা কেন মার্জ করবেন? আপনি প্রস্তাব দিতে পারেন merge(X[,ColsNeeded1],Y[,ColsNeeded2]), তবে এর জন্য প্রোগ্রামারটির প্রয়োজনে কোন কলামগুলির প্রয়োজন work X[Y,j] ডেটাতে. টেবিল আপনার পক্ষে এক ধাপে এটি করে। আপনি যখন লিখবেন X[Y,sum(foo*bar)], ডেটা.টিবেলটি jকলামগুলি ব্যবহার করে তা দেখার জন্য স্বয়ংক্রিয়ভাবে অভিব্যক্তিটি পরীক্ষা করে । এটি কেবলমাত্র এই কলামগুলিকে কেবল উপসেট করবে; অন্যদের উপেক্ষা করা হয়। মেমোরি কেবল কলামগুলির ব্যবহারের জন্য তৈরি হয় jএবং Yকলামগুলি প্রতিটি গ্রুপের প্রেক্ষাপটে স্ট্যান্ডার্ড আর রিসাইক্লিং বিধিগুলি উপভোগ করে। আসুন বলি fooযে রয়েছে X, এবং বারটি রয়েছে Y(20 টি অন্যান্য কলামের সাথে Y)। ননX[Y,sum(foo*bar)] প্রোগ্রামে তাত্পর্যপূর্ণ এবং সাবসেটের পরে অব্যবহৃত সমস্ত কিছু সংযোজন করার চেয়ে দ্রুত চালানো?


আপনি যদি একটি বাম বাহ্যিক জোড় চান X[Y]

le <- Y[X]
mallx <- merge(X, Y, all.x = T)
# the column order is different so change to be the same as `merge`
setcolorder(le, names(mallx))
identical(le, mallx)
# [1] TRUE

আপনি যদি একটি সম্পূর্ণ বাইরের যোগদান চান

# the unique values for the keys over both data sets
unique_keys <- unique(c(X[,t], Y[,t]))
Y[X[J(unique_keys)]]
##   t  b  a
## 1: 1 NA  1
## 2: 2 NA  4
## 3: 3  9  9
## 4: 4 16 16
## 5: 5 25 NA
## 6: 6 36 NA

# The following will give the same with the column order X,Y
X[Y[J(unique_keys)]]

5
ধন্যবাদ @ মিলেল FAQ 1.12 পূর্ণ বা বাম বাহ্যিক যোগদানের কথা উল্লেখ করে না। অনন্য () সহ আপনার সম্পূর্ণ বাইরের যোগদানের পরামর্শটি একটি দুর্দান্ত সহায়তা। এগুলি FAQ এ থাকা উচিত। আমি জানি ম্যাথু ডাওল "এটি নিজের ব্যবহারের জন্য ডিজাইন করেছিলেন এবং তিনি সেভাবে এটি চেয়েছিলেন।" (FAQ 1.9), তবে আমি ভেবেছিলাম X[Y,all=T]ডেটা-র মধ্যে একটি সম্পূর্ণ বাহ্যিক সংযুক্তি নির্দিষ্ট করার একটি মার্জিত উপায় হতে পারে X বা X[Y,all.x=T]বাম যোগদানের জন্য। আমি ভাবলাম কেন এটি সেভাবে ডিজাইন করা হয়নি? শুধু একটি ভাবনা.
ডগলাস ক্লার্ক

1
@ ডগলাস ক্লার্ক উত্তর যোগ করেছেন, এবং 2302 দায়ের করেছেন : প্রশ্নগুলির সাথে মিলের সংযুক্তি সিনট্যাক্স যুক্ত করুন (সময় সহ) । দুর্দান্ত পরামর্শ!
ম্যাট ডাউল

1
@ মলিন সমাধানের জন্য ধন্যবাদ ... আমার দিনটি তৈরি করেছে ... :)
অঙ্কিত

@ মিলেল পারফর্ম করার সময় আমরা এনএ'র সাথে 0 ব্যবহার করার কোনও উপায় আছে কি X[Y[J(unique_keys)]]?
অঙ্কিত

11
ডেটা.ট্যাবলী ডকুমেন্টেশন সম্পর্কে আমাকে কী প্রভাবিত করেছে তা হ'ল এটি এতটা ভারবজ হতে পারে, তবুও এতটা রহস্যময় থাকে ...
নিউউবিবাং

24

@ গলির উত্তর স্পট রয়েছে, সুতরাং এই উত্তরটি গ্রহণ করুন। এটি কেবল অনুসরণের, মন্তব্যের জন্য দীর্ঘ long

Mnel বলেছেন, বাম / ডান বাইরের যোগদান সোয়াপিং দ্বারা প্রাপ্ত হয় Yএবং X: Y[X]বনাম X[Y]। সুতরাং 4 টির মধ্যে 3 টি যুক্ত সংশ্লেষে সমর্থিত, 2 নয়, iiuc।

4 র্থ যুক্ত করা একটি ভাল ধারণা বলে মনে হচ্ছে। ধরা যাক আমরা যুক্ত করি full=TRUEবা both=TRUEবা merge=TRUE(সেরা আর্গুমেন্টের নামটি নিশ্চিত নই?) তারপরে আমার কাছে X[Y,j,merge=TRUE]এমনটি ঘটেছিল না যে FAQ 1.12-এ BUT এর পরে কারণগুলির জন্য কার্যকর হবে। নতুন বৈশিষ্ট্য অনুরোধটি এখন এখানে যুক্ত হয়েছে এবং এখানে আবার যুক্ত হয়েছে, ধন্যবাদ:

এফআর # 2301: এক্স [ওয়াই] এবং ওয়াই [এক্স] উভয়ের জন্য মার্জ = সত্য যুক্তি যুক্ত করুন যেমন মার্জ () হয় does

সাম্প্রতিক সংস্করণগুলি গতিবেগ হয়েছে merge.data.table(উদাহরণস্বরূপ, কীগুলি আরও দক্ষতার সাথে সেট করার জন্য অভ্যন্তরীণভাবে একটি অগভীর অনুলিপি গ্রহণ করে)। সুতরাং আমরা আনতে merge()এবং X[Y]কাছাকাছি চেষ্টা করছি , এবং সম্পূর্ণ নমনীয়তার জন্য ব্যবহারকারীর সমস্ত বিকল্প প্রদান। উভয় পক্ষের পক্ষে মতামত রয়েছে। আর একটি অসামান্য বৈশিষ্ট্য অনুরোধ হ'ল:

এফআর # 2033: বাই.এক্স এবং বাই.ই যুক্ত করে মার্জ.ডেটা.টিটেবল

অন্য যদি কেউ থাকে তবে দয়া করে তাদের আসতে দিন।

প্রশ্নের এই অংশ দ্বারা:

ম্যাচ ফাংশনটির Nomatch প্যারামিটারের পরিবর্তে যোগদানের জন্য মার্জ সিনট্যাক্সটি কেন ব্যবহার করবেন না?

যদি আপনি চান merge()সিনট্যাক্স এবং তার 3 আর্গুমেন্ট all, all.xএবং all.yতারপর ব্যবহার পরিবর্তে যে X[Y]। ভাবেন এটি সমস্ত ক্ষেত্রে আবরণ করা উচিত। অথবা আপনি কি বোঝাতে চেয়েছেন কেন যুক্তি একক nomatchমধ্যে [.data.table? যদি তা হয় তবে এফএকিউ ২.১৪.১ কে প্রাকৃতিক বলে মনে হয়েছিল: "আপনি কি আরও ব্যাখ্যা করতে পারবেন কেন ডেটা.টেবিলটি এ [বি] সিনট্যাক্স দ্বারা অনুপ্রাণিত হয়?" তবে nomatchবর্তমানে কেবল দুটি মান লাগে 0এবং NA। এটি প্রসারিত হতে পারে যাতে নেতিবাচক মান বলতে কিছু বোঝায় বা 12 এর অর্থ এনএ পূরণ করার জন্য 12 তম সারির মানগুলি ব্যবহার করা যায়, উদাহরণস্বরূপ, বা nomatchভবিষ্যতে ভেক্টর বা এমনকি নিজেই হতে পারে একটি data.table

হুঁ। কীভাবে বাই-বাই একত্রিত হয়ে = সত্যের সাথে ইন্টারেক্ট করবে? সম্ভবত আমাদের এটি ডেটেবল-সহায়তাতে নেওয়া উচিত ।


ধন্যবাদ @ ম্যাথু @ মলনের উত্তরটি দুর্দান্ত, তবে আমার প্রশ্নটি কীভাবে পুরো বা বামে যোগদান করবেন তা নয়, তবে "এখানে কী কেবল দু'রকমের যোগদানের কোনও কারণ রয়েছে?" সুতরাং এখন এটি কিছুটা দার্শনিক ;-) আসলে আমি একত্রীকরণ সিনট্যাক্সকে পছন্দ করি না, তবে বিদ্যমান স্টাফ ভাড়ার লোকদের সাথে পরিচিত হওয়ার জন্য একটি আর traditionতিহ্য উপস্থিত রয়েছে। আমি join="all", join="all.x", join="all.y" and join="x.and.y"আমার নোটের মার্জিনে লিখেছিলাম । এটি আরও ভাল কিনা তা নিশ্চিত নই।
ডগলাস ক্লার্ক

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

উপরোক্ত আলোচনা আমার মন্তব্য নির্দেশিত, আমি একটি যোগ সুপারিশ join, এর শব্দ যখন আমি একটি datatable হল: X[Y,j,join=string]। যোগদানের সম্ভাব্য স্ট্রিং মানগুলি হ'ল: 1) "all.y" এবং "ডান" -
ডগলাস ক্লার্ক

1
হাই ম্যাট, ডেটা টেবিল লাইব্রেরি দুর্দান্ত; এটার জন্য ধন্যবাদ; যদিও আমি মনে করি যোগদানের আচরণ (ডিফল্টরূপে বাহ্যিকভাবে সঠিকভাবে যুক্ত হওয়া) মূল ডকুমেন্টেশনে বিশদভাবে ব্যাখ্যা করা উচিত; এটি বের করতে আমার 3 দিন সময় লেগেছে।
টিমোথে হেনরি

1
@ টাকসন এখানে লিঙ্ক করতে, এখন # 709 ইস্যু হিসাবে দায়ের করা ।
ম্যাট ডাউলে

17

এই "উত্তর" আলোচনার প্রস্তাব: আমার মন্তব্যে ইঙ্গিত হিসাবে, আমি join[.data.table () এ একটি পরামিতি যুক্ত করার পরামর্শ দিচ্ছি যাতে অতিরিক্ত ধরণের যোগদানের জন্য,: X[Y,j,join=string]। 4 ধরণের সাধারণ যোগদানের পাশাপাশি আমি 3 ধরণের এক্সক্লুসিভ যোগদান এবং ক্রস জয়েনকে সমর্থন করার পরামর্শ দিই ।

joinবিভিন্ন ধরনের যোগদানের জন্য স্ট্রিং মান (এবং alias লেখা) হতে প্রস্তাব করা হয়:

  1. "all.y"এবং "right"- ডান যোগদান করুন, বর্তমান ডেটা.সামান্য ডিফল্ট (nomatch = NA) - সমস্ত Y সারি এনএ সহ যেখানে কোনও মিল নেই;
  2. "both"এবং "inner" - অভ্যন্তরীণ যোগদান (nomatch = 0) - কেবলমাত্র সারি যেখানে এক্স এবং ওয়াই মিলবে;

  3. "all.x"এবং "left" - বাম যোগদান - এক্স, এনএ থেকে সমস্ত সারি যেখানে কোনও ওয়াই মেলে না:

  4. "outer"এবং "full" - সম্পূর্ণ বাইরের যোগদান - এক্স এবং ওয়াইয়ের সমস্ত সারি, এনএ যেখানে কোনও মিল নেই

  5. "only.x"এবং "not.y"- অ-যোগ বা অ্যান্টি-জয়েন রিটার্নিং এক্স সারি যেখানে কোনও ম্যাচ নেই

  6. "only.y" এবং "not.x"- অ-যোগ বা অ্যান্টি-জয়েন রিটার্নিং ওয় সারিগুলিতে যেখানে কোনও এক্স ম্যাচ নেই
  7. "not.both" - এক্স এবং ওয়াই সারিগুলিতে ফিরে আসা একচেটিয়াভাবে যোগ দিন যেখানে অন্য টেবিলের সাথে কোনও মিল নেই, অর্থাত্ একটি এক্সক্লুসিভ-বা (এক্সওআর)
  8. "cross"- ক্রসের সাথে যোগ বা কার্টেসিয়ান পণ্য এক্স এর প্রতিটি সারি যুক্ত Y এর প্রতিটি সারির সাথে মেলে

ডিফল্ট মানটি join="all.y"যা বর্তমান ডিফল্টের সাথে মিলে যায়।

"All", "all.x" এবং "all.y" স্ট্রিংয়ের মানগুলি merge()প্যারামিটারের সাথে মিলে যায়। "ডান", "বাম", "অভ্যন্তরীণ" এবং "বহিরাগত" স্ট্রিংগুলি এসকিউএল ব্যবহারকারীদের জন্য আরও সাবলীল হতে পারে।

"উভয়" এবং "not.both" স্ট্রিংগুলি এই মুহূর্তে আমার সেরা পরামর্শ - তবে কারও কাছে অভ্যন্তরীণ যোগদান এবং একচেটিয়া যোগদানের জন্য আরও ভাল স্ট্রিং পরামর্শ থাকতে পারে। ("এক্সক্লুসিভ" সঠিক সংজ্ঞা আছে কিনা তা আমি নিশ্চিত নই, "এক্সওর" -র যোগদানের উপযুক্ত শব্দ থাকলে আমাকে সংশোধন করুন।)

এর ব্যবহার বা যোগ-অ-সংশ্লেষের join="not.y"বিকল্প এবং সম্ভবত আরও পরিষ্কার (আমার কাছে), যদিও আমি নিশ্চিত না যে সেগুলি একই (ডেটা.ট্যাবল সংস্করণে 1.8.3 নতুন বৈশিষ্ট্য)।X[-Y,j]X[!Y,j]

ক্রস জয়েন কখনও কখনও কার্যকর হতে পারে তবে এটি ডেটা টেবিলের দৃষ্টান্তের সাথে মানানসই হতে পারে।


1
আলোচনার জন্য দয়া করে এটি ডেটেবল-সহায়তাতে প্রেরণ করুন ।
ম্যাট ডাউল

3
+1 তবে, দয়া করে হয় ডেটাটেবল-সহায়তাতে প্রেরণ করুন বা একটি বৈশিষ্ট্য অনুরোধ ফাইল করুন । আমি যুক্ত করতে কিছু মনে করি না joinতবে যতক্ষণ না এটি ট্র্যাকারের উপরে উঠে যায়, তা ভুলে যাবেন।
ম্যাট ডাউল

1
আমি দেখতে পাচ্ছি আপনি কিছু সময়ের জন্য এসও-তে লগ ইন করেন নি। সুতরাং আমি এফআর # 2301
ম্যাট ডাউলে

@ ম্যাটডোল, এই বৈশিষ্ট্যটির জন্য +1 করুন। ( এফআর # 2301 এর মাধ্যমে এটি করার চেষ্টা করা হয়েছে তবে আমি অনুমতি থেকে বঞ্চিত বার্তা পেয়েছি)।
আদিলাপায়

@ অ্যাডিলাপপায়া আমরা আরফর্জি থেকে গিটহাবে চলে এসেছি। দয়া করে এখানে +1 করুন: github.com/Rdatatable/data.table/issues/614 । অরুণ সমস্যাগুলি সমাধান করেছিলেন যাতে তারা হারিয়ে না যায়।
ম্যাট ডাউলে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.