2013-10-10 4 views
34

यह यहां किसी अन्य प्रश्न के उत्तर में आया था।स्तंभ नामों को अनदेखा करने के लिए rbind प्राप्त करने का सबसे आसान तरीका

> df<-data.frame(x=1:2,y=3:4) 
> df 
    x y 
1 1 3 
2 2 4 
> rbind(df,df[,2:1]) 
    x y 
1 1 3 
2 2 4 
3 1 3 
4 2 4 
बेशक

, वहाँ कामकाज से जुड़े हैं: जब आप rbind दो डेटा फ्रेम, यह कॉलम नाम से नहीं बल्कि सूचकांक है, जो अनपेक्षित व्यवहार का कारण बन सकता से मेल खाता है। उदाहरण के लिए:

rbind(df,rename(df[,2:1],names(df))) 
data.frame(rbind(as.matrix(df),as.matrix(df[,2:1]))) 

संपादित करें पर: renameplyr पैकेज वास्तव में इस तरह से काम नहीं करता है से (हालांकि मैंने सोचा कि मैं यह काम कर रहा है जब मैं मूल रूप से यह लिखा था ...)।

rbind(df,setNames(df[,2:1],names(df))) 

इसके अलावा,, शायद आश्चर्य की बात सूचकांक द्वारा

data.frame(rbindlist(list(df,df[,2:1]))) 

काम करता है (और अगर हम एक डेटा तालिका कोई आपत्ति नहीं है, तो यह सुंदर है: जिस तरह से नाम बदलकर उसे ऐसा करने के लिए SimonO101 के समाधान का उपयोग करने के लिए है संक्षिप्त), तो यह do.call(rbind) के बीच एक अंतर है।

सवाल यह है कि rbind दो डेटा फ्रेमों का सबसे संक्षिप्त तरीका क्या है जहां नाम मेल नहीं खाते? मुझे पता है कि यह मामूली लगता है, लेकिन इस तरह की चीज अव्यवस्था कोड समाप्त कर सकती है। और मैं rbindByIndex नामक एक नया फ़ंक्शन लिखना नहीं चाहता हूं। आदर्श रूप से यह rbind(df,df[,2:1],byIndex=T) जैसा कुछ होगा।

+2

दिलचस्प। हालांकि व्यक्तिगत रूप से मैं डेटाफ्रेम पर 'rbind'' नामित सबसेट (यानी कॉलम) से मेल खाने की देखभाल करता हूं। जब आप नाम से चीजों को "ट्रैक" नहीं करना चाहते हैं, तो पहले स्थान पर 'matrix' का उपयोग करें? –

+0

एक (शायद एकमात्र) कारण 'मैट्रिक्स' का उपयोग न करने का कारण यह है क्योंकि यह प्रकारों के मिश्रण की अनुमति नहीं देता है। – mrip

उत्तर

36

आप मिल सकती है setNames यहाँ काम ...

rbind(df, setNames(rev(df), names(df))) 
# x y 
#1 1 3 
#2 2 4 
#3 3 1 
#4 4 2 

मुझे लगता है तुम्हारा असली यूज-केस कुछ और अधिक जटिल है। आप चाहें तो setNames के पहले तर्क में कॉलम को फिर से व्यवस्थित कर सकते हैं, दूसरे तर्क में केवल names(df) का उपयोग करें, ताकि पुनर्नवीनीकरण कॉलम के नाम मूल से मेल खाते हों।

+0

+1 अच्छा। काश मैं इससे पहले इस बारे में जानूंगा। – Thomas

+0

धन्यवाद, मैं 'plyr' पैकेज से 'नाम बदलें' का उपयोग कर रहा था, और अब जब मैं ओपी से अपना कोड पुन: प्रयास करने का प्रयास करता हूं, तो यह काम नहीं करता है। – mrip

+0

@ थॉमस हाँ यह वास्तव में आसान काम है! –

7

यह बहुत आसान लगता है:

mapply(c,df,df[,2:1]) 
    x y 
[1,] 1 3 
[2,] 2 4 
[3,] 3 1 
[4,] 4 2 

इस सरल मामले के लिए, हालांकि, आप इसे एक dataframe में बदलने के लिए वापस (क्योंकि mapply एक मैट्रिक्स के लिए यह सरल करता है):

as.data.frame(mapply(c,df,df[,2:1])) 
    x y 
1 1 3 
2 2 4 
3 3 1 
4 4 2 

महत्वपूर्ण नोट 1: आपके डेटाफ्रेम में विभिन्न प्रकार के वैक्टर होते हैं:

df<-data.frame(x=1:2,y=3:4,z=c('a','b')) 
mapply(c,df,df[,c(2:1,3)]) 
    x y z 
[1,] 1 3 2 
[2,] 2 4 1 
[3,] 3 1 2 
[4,] 4 2 1 

महत्वपूर्ण नोट 2: यदि आपके पास कारक हैं तो यह भी भयानक है।

df<-data.frame(x=factor(1:2),y=factor(3:4)) 
mapply(c,df[,1:2],df[,2:1]) 
    x y 
[1,] 1 1 
[2,] 2 2 
[3,] 1 1 
[4,] 2 2 

तो, जब तक आपके पास सभी संख्यात्मक डेटा हो, ठीक है।

+3

लेकिन अगर आपके पास डीएफ में अलग-अलग डेटा प्रकार हैं तो आपको परेशानी होगी। – Roland

+0

@ रोलैंड यूप, मैंने अभी उस प्रभाव में संपादित किया है। वैसे भी उसके आसपास? – Thomas

+1

हां, एक 'rbindByIndex' फ़ंक्शन लिखें, जिसे ओपी स्पष्ट रूप से नहीं करना चाहता ... – Roland

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