2012-11-28 32 views
6

मैं यह पता लगाने की कोशिश कर रहा हूं कि क्यों rbind फ़ंक्शन नाम के बिना डेटा.फ्रेम में शामिल होने के इरादे से काम नहीं कर रहा है।नाम के बिना rbind data.frames

test <- data.frame(
      id=rep(c("a","b"),each=3), 
      time=rep(1:3,2), 
      black=1:6, 
      white=1:6, 
      stringsAsFactors=FALSE 
      ) 

# take some subsets with different names 
pt1 <- test[,c(1,2,3)] 
pt2 <- test[,c(1,2,4)] 

# method 1 - rename to same names - works 
names(pt2) <- names(pt1) 
rbind(pt1,pt2) 

# method 2 - works - even with duplicate names 
names(pt1) <- letters[c(1,1,1)] 
names(pt2) <- letters[c(1,1,1)] 
rbind(pt1,pt2) 

# method 3 - works - with a vector of NA's as names 
names(pt1) <- rep(NA,ncol(pt1)) 
names(pt2) <- rep(NA,ncol(pt2)) 
rbind(pt1,pt2) 

# method 4 - but... does not work without names at all? 
pt1 <- unname(pt1) 
pt2 <- unname(pt2) 
rbind(pt1,pt2) 

यह मेरे लिए थोड़ा अजीब लगता है: यहाँ मेरी परीक्षण है। क्या मुझे एक अच्छा कारण याद आ रहा है कि यह बॉक्स से बाहर क्यों नहीं काम करना चाहिए? अतिरिक्त जानकारी

debug लिए @ JoshO'Brien के सुझाव का उपयोग के लिए

संपादित करें, मैं rbind.data.frame समारोह

if (is.null(pi) || is.na(jj <- pi[[j]])) 

(के ऑनलाइन संस्करण के इस if बयान भाग के दौरान होने वाली के रूप में त्रुटि पहचान कर सकते हैं यहां कोड: http://svn.r-project.org/R/trunk/src/library/base/R/dataframe.R से शुरू: "### यहां rbind और cbind के तरीके हैं।")

प्रोग्राम के माध्यम से कदम से, pi का मान इस बिंदु पर सेट नहीं किया गया प्रतीत होता है, इसलिए प्रोग्राम pi जैसे pi[[3]] और त्रुटियों को अनुक्रमित करने का प्रयास करता है।

if (is.null(clabs)) clabs <- names(xi) else { #pi gets set here 

मैं इस लगाने की कोशिश कर एक उलझन में हूँ:

मैं क्या समझ सकते हैं, आंतरिक pi वस्तु इस पहले लाइन जहां clabsNULL के रूप में शुरू कर दिया गया की वजह से स्थापित किया जाना प्रकट नहीं होता है बाहर, लेकिन यह एक साथ आता है के रूप में अद्यतन होगा।

+3

'rbind.data.frame' के कोड पर एक नज़र डालें ** जिनमें से अधिकांश ** कॉलम और पंक्ति नामों की जांच और मेल खाने से संबंधित हैं। आप 'डीबग (rbind.data.frame) 'कर सकते हैं और फिर यह निर्धारित करने के लिए कि आपकी त्रुटि कहां फेंक दी गई है, अपनी विधि 4 के माध्यम से कदम उठाएं। –

+0

@ जोशो'ब्रायन - ने कुछ और जानकारी प्रदान करने के लिए अपडेट किया है। मैं कोड की व्याख्या करने में बहुत अच्छा नहीं हूं और इसमें काम कर रहा हूं, लेकिन शायद यह किसी और के लिए स्पष्ट होगा। – thelatemail

उत्तर

5

क्योंकि unname() & स्पष्ट रूप से एनए को कॉलम हेडर के रूप में असाइन करने के समान कार्य नहीं हैं। जब कॉलम नाम सभी NA होते हैं, तो rbind() संभव है। चूंकि rbind() डेटा फ्रेम के नाम/उपनाम लेता है, इसलिए परिणाम & से मेल नहीं खाते हैं इसलिए rbind() विफल रहता है।

> c1 <- c(1,2,3) 
> c2 <- c('A','B','C') 
> df1 <- data.frame(c1,c2) 
> df1 
    c1 c2 
1 1 A 
2 2 B 
3 3 C 
> df2 <- data.frame(c1,c2) # df1 & df2 are identical 
> 
> #Let's perform unname on one data frame & 
> #replacement with NA on the other 
> 
> unname(df1) 
    NA NA 
1 1 A 
2 2 B 
3 3 C 
> tem1 <- names(unname(df1)) 
> tem1 
NULL 
> 
> #Please note above that the column headers though showing as NA are null 
> 
> names(df2) <- rep(NA,ncol(df2)) 
> df2 
    NA NA 
1 1 A 
2 2 B 
3 3 C 
> tem2 <- names(df2) 
> tem2 
[1] NA NA 
> 
> #Though unname(df1) & df2 look identical, they aren't 
> #Also note difference in tem1 & tem2 
> 
> identical(unname(df1),df2) 
[1] FALSE 
> 

मुझे आशा है कि इस मदद करता है:

यहाँ कुछ कोड मदद करने के लिए देखते हैं कि मैं क्या मतलब है। नाम प्रत्येक के रूप में दिखाए जाते हैं, लेकिन दो ऑपरेशन अलग हैं। इसलिए, उनके कॉलम हेडर के साथ 2 डेटा फ्रेम एनए में बदल दिए गए हैं, "राउंडबाउंड" हो सकते हैं लेकिन बिना किसी कॉलम हेडर के 2 डेटा फ्रेम (unname() का उपयोग करके हासिल किया जा सकता है) नहीं कर सकते हैं।

+2

यह अच्छी जानकारी है और मैंने +1 किया है। जबकि मैं देख सकता हूं कि 'NA' और 'unname' data.frames के अलग-अलग' नाम()' हैं, मुझे अभी भी लगता है कि आर 'अज्ञात' डेटा 'फ्रेम' को 'rbind' करने में सक्षम होना चाहिए यदि यह 'नाम()' जो सभी 'एनए हैं। – thelatemail