2016-08-03 26 views
8

हटाएं आज सुबह डेटा फ्रेम के साथ कुछ विश्लेषण करते समय मुझे डुप्लिकेट कॉलम नामों की उपस्थिति के कारण त्रुटि मिली। मैंने विशेष रूप से dplyr का उपयोग करके समाधान खोजने की कोशिश की लेकिन मुझे कुछ भी नहीं मिला जो काम करता है। समस्या का वर्णन करने के लिए यहां एक उदाहरण दिया गया है। एक डुप्लिकेट कॉलम नाम के साथ एक डेटा फ्रेम।डुप्लीकेट कॉलम dplyr

x <- data.frame(matrix(c(1, 2, 3), 
       c(2,2,1),nrow=2,ncol=3)) 
colnames(x) <- c("a", "a", "b") 

जब मैं मूल्य

द्वारा फिल्टर करने के लिए चयन करें आदेश मैं एक त्रुटि

x %>% 
    select(-1)%>%filter(b>1) 

Error: found duplicated column name: a 

मैं आसानी से स्तंभ से छुटकारा पा सकते पारंपरिक अनुक्रमण का उपयोग कर पाने और dplyr का उपयोग कर का उपयोग करते हुए पहले कॉलम ड्रॉप करने की कोशिश

x<-x[,-1]%>%filter(b>1) 

कौन सा वांछित आउटपुट का उत्पादन

> x 
    a b 
1 2 3 
2 2 3 

केवल dplyr व्याकरण का उपयोग करके इसे करने के तरीके पर कोई विचार?

+2

नाम बदलने सकता है अच्छी तरह से आधार आर में पहले स्तंभ से छुटकारा पाने के लिए चाहते थे, तो "सही" रास्ता शायद 'x [! डुप्लिकेट (नाम (x), सेला = TRUE)]'। बस इसे dplyr के 'select' क्रिया में टॉस करने का एक तरीका खोजें। हू, यहां तक ​​कि 'x%>% चयन (2,3)' काम नहीं करता है, 'चयन' खंड को देखने से पहले एलएचएस के बारे में चिल्ला रहा है। मैं उसे एक बग कहूंगा। क्रूड वर्कअराउंड: 'x%>% do (। [! डुप्लीकेट (नाम (।), सेला = TRUE)]) – Frank

+0

मैं आमतौर पर कानूनी रूप से सबकुछ नाम बदलने के लिए 'make.names' का उपयोग करता हूं। – alistaire

+1

यदि आप चारों ओर खुदाई करते हैं तो मुझे लगता है कि आपको बुराई की जड़ मिल जाएगी, इस तथ्य में निहित है कि प्लीयर और डिपर डेटा चुनने के लिए कॉलम नामों का उपयोग करते हैं। यह आवश्यक है कि कॉलम के अद्वितीय नाम हों, यह नाम और सामग्री द्वारा नहीं चुना जाता है। मूल पैकेज इंडेक्स का उपयोग करता है, जो पैराडाइम्स नामकरण के संबंध में काम करेगा। यह पैकेज की एक सीमा है, जो अधिकांश समय सीमा के बराबर है। – sconfluentus

उत्तर

2

यह make.names व्यवहार का लाभ उठाकर काम कर सकता है। पता नहीं है कि मैंने यहां धोखा दिया है, लेकिन ऐसा लगता है कि ज्यादातर डीलर कार्यों का लाभ उठाने के लिए लगता है।

x %>% 
    setNames(make.names(names(.), unique = TRUE)) %>% 
    select(-matches("*\\.[1-9]+$")) 
0

आप पूरी तरह से मैं सिर्फ

x <- x[, c(2:3)] 

करना होगा या वैकल्पिक रूप से आप इसे

colnames(x)[1] <- "a.1"