2011-12-22 12 views
8

मेरे पास प्रत्येक डेटा कॉलम के साथ 2 डेटा फ्रेम हैं। कुछ कॉलम 2 डेटा फ्रेम के बीच आम हैं। मैं दो डेटा फ्रेम के केवल सामान्य कॉलम को एक नए डेटा फ्रेम में कैसे रेबिंड कर सकता हूं?दो डेटा सेटों के केवल सामान्य स्तंभों को कैसे रेबिंड करें

मैंने library(plyr);rbind.fill(A,B) के साथ प्रयास किया हालांकि यह उन स्तंभों में एनए मान सेट करता है जो मेल नहीं खाते हैं, और यह मेरी मदद नहीं करता है।

धन्यवाद एक बहुत चुनाव आयोग

उत्तर

23

उपयोग intersect आम स्तंभों को पुनः प्राप्त करने।

dfr1 <- data.frame(x = 1:5, y = runif(5), z = rnorm(5)) 
dfr2 <- data.frame(w = letter[1:5], x = 6:10, y = runif(5)) 
common_cols <- intersect(colnames(dfr1), colnames(dfr2)) 
rbind(
    subset(dfr1, select = common_cols), 
    subset(dfr2, select = common_cols) 
) 

के रूप में टिप्पणी में कहा, यदि आप एक छोटे प्रदर्शन और टाइपिंग में सुधार के लिए

rbind(
    dfr1[, common_cols], 
    dfr2[, common_cols] 
) 

साथ अंतिम पंक्ति बदल सकते हैं।

rbind(
    dfr1[common_cols], 
    dfr2[common_cols] 
) 

भी काम करता है लेकिन मुझे लगता है कि यह थोड़ा सा स्पष्ट है।

+0

एक दूसरे को काटना का अच्छा उपयोग! +1 – ECII

+0

बहुत संक्षिप्त और समझने योग्य। +1 –

+2

यहां सबसेट का उपयोग करने की आवश्यकता नहीं है - और आम तौर पर आप गैर-मानक मूल्यांकन का उपयोग करने वाले किसी भी फ़ंक्शन के साथ प्रोग्रामिंग से बचना चाहते हैं। (और मुझे यकीन नहीं है कि आप इसका उपयोग क्यों करना चाहते हैं क्योंकि यह 'dfr1 [common_cols]' की तुलना में वर्बोज़ है) – hadley

2

यहाँ मेरी समाधान आशा है मैं सही

अपने प्रश्न मिला
df1 <- data.frame(a=rnorm(100), b=rnorm(100), not=rnorm(100)) 
df2 <- data.frame(a=rnorm(100), b=rnorm(100)) 

bind1 <- bind1 <- df1[, names(df1) %in% names(df2)] 
bind2 <- bind1 <- df1[, names(df2) %in% names(df1)] 

rbind(bind1, bind2) 
+0

क्या होता है यदि 'df2' में कॉलम हैं जो' df1' में नहीं हैं? –

+0

इसके अलावा, 'सबसेट' पर कॉल आवश्यक नहीं है। यदि आप बाद में अनुक्रमण का उपयोग करने जा रहे हैं, तो आप उन्हें% नामों (डीएफ 2)% में नामों (डीएफ 1)% द्वारा बनाए गए लॉजिकल वेक्टर को पास कर सकते हैं। –

+0

आपकी पहली टिप्पणी के लिए: यदि df2 में कॉलम हैं जो df1 में नहीं हैं - वे आम नहीं हैं और मैं उन्हें फ़िल्टर नहीं करना चाहता - या क्या मैं गलत हूं? आपकी दूसरी टिप्पणी के लिए: सही यह बेहतर होगा शायद मैंने इसे थोड़ा सा गड़बड़ कर दिया ... – Seb

संबंधित मुद्दे