यह डेटा के बारे में एक दार्शनिक सवाल है। वाक्य रचना में शामिल होने के लिए। मैं data.tables के लिए अधिक से अधिक उपयोग पा रहा हूं, लेकिन अभी भी सीख रहा हूं ...
X[Y]
Data.tables के लिए शामिल होने का प्रारूप बहुत संक्षिप्त, आसान और कुशल है, लेकिन जहां तक मैं बता सकता हूं, यह केवल आंतरिक जोड़ और सही बाहरी जोड़ का समर्थन करता है। बाएं या पूर्ण बाहरी जुड़ने के लिए, मुझे उपयोग करने की आवश्यकता है 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 = TRUE
। चूंकि X[Y]
ऑपरेशन की merge
तुलना में बहुत अधिक है match
, क्यों नहीं के merge
बजाय जोड़ के लिए वाक्यविन्यास का उपयोग करेंmatch
फ़ंक्शन के nomatch
पैरामीटर के ?
यहाँ 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
अद्यतन: data.table v1.9.6 ने on=
सिंटैक्स पेश किया , जो प्राथमिक कुंजी के अलावा अन्य क्षेत्रों पर तदर्थ जुड़ने की अनुमति देता है। jangorecki का जवाब सवाल का (मर्ज) डेटा फ्रेम (आंतरिक, बाहरी, बाएँ, दाएँ) में शामिल होने के लिए कैसे? अतिरिक्त शामिल होने के कुछ उदाहरण प्रदान करता है जो data.table को संभाल सकते हैं।
unique()
कि पूर्ण दृष्टिकोण के लिए नीचे आपका दृष्टिकोण बेहतर है rbind(Y[X],X[Y])
, क्योंकि rbind में तालिका की प्रतिलिपि शामिल होगी। क्या वह सही है?
unique(c(unique(X[,t]), unique(Y[,t]))
- यह अधिक मेमोरी कुशल होनी चाहिए क्योंकि यह केवल दो सूचियों का संयोजन है जो एक्स और वाई में पंक्तियों की संख्या से कम या बराबर होने वाली हैं ।
Y[X]
अगर आप चाहते हैं छोड़ दिया बाहरी में शामिल होने केX[Y]
औरrbind(Y[X],X[Y])
अगर आप एक पूर्ण बाहरी चाहते में शामिल होने के