2012-03-22 21 views
8

में डुप्लिकेट कॉलम की पहचान करना मैं एक आर नौसिखिया हूं और एक बड़े पैमाने पर डेटाफ्रेम (50 के पंक्तियों, 215 कॉलम) से डुप्लिकेट कॉलम हटाने का प्रयास कर रहा हूं। फ्रेम में निरंतर निरंतर और स्पष्ट चर का मिश्रण होता है।आर डेटा फ्रेम

मेरे दृष्टिकोण एक सूची में फ्रेम में प्रत्येक स्तंभ के लिए एक मेज उत्पन्न करने के लिए है, तो, duplicated() फ़ंक्शन का उपयोग सूची है कि डुप्लिकेट हैं में पंक्तियों को खोजने के लिए इस प्रकार किया गया है:

age=18:29 
height=c(76.1,77,78.1,78.2,78.8,79.7,79.9,81.1,81.2,81.8,82.8,83.5) 
gender=c("M","F","M","M","F","F","M","M","F","M","F","M") 
testframe = data.frame(age=age,height=height,height2=height,gender=gender,gender2=gender) 

tables=apply(testframe,2,table) 
dups=which(duplicated(tables)) 
testframe <- subset(testframe, select = -c(dups)) 

यह 'isn टी बहुत कुशल, विशेष रूप से बड़े निरंतर चर के लिए। हालांकि, मैं इस मार्ग नीचे चले गए हैं, क्योंकि मैं सारांश का उपयोग करते हुए एक ही परिणाम प्राप्त करने में असमर्थ किया गया है (ध्यान दें, निम्नलिखित एक मूल testframe युक्त डुप्लिकेट मान लिया गया):

summaries=apply(testframe,2,summary) 
dups=which(duplicated(summaries)) 
testframe <- subset(testframe, select = -c(dups)) 

आपको लगता है कि कोड चलाते हैं तो आप करेंगे देखें कि यह केवल पहले डुप्लिकेट को हटा देता है। मुझे लगता है कि ऐसा इसलिए है क्योंकि मैं कुछ गलत कर रहा हूं। क्या कोई यह बता सकता है कि मैं कहां गलत हो रहा हूं या इससे भी बेहतर, डेटाफ्रेम से डुप्लिकेट कॉलम को हटाने के बेहतर तरीके की दिशा में मुझे इंगित कर सकता हूं?

उत्तर

16

आप lapply के साथ क्या कर सकते हैं: जबकि आदेश की अनदेखी कर

testframe[!duplicated(lapply(testframe, summary))] 

summary वितरण का सारांश है।

नहीं 100%, लेकिन मैं पचाने का प्रयोग करेंगे, तो डेटा बहुत बड़ा है:

library(digest) 
testframe[!duplicated(lapply(testframe, digest))] 
+2

इसके अलावा 'digest' उपयोग करने के लिए की सुझाव @kohske, यह' उपयोग करने के लिए बजाय 'सु की c' पर्याप्त हो सकता है 'लापरवाही' समारोह के रूप में mmary'। – BenBarnes

+1

यह ध्यान दिया जाना चाहिए कि चरित्र वैक्टर के लिए सारांश एक ही सारांश का उत्पादन करेगा, भले ही वे अलग हों। ऐसा इसलिए है क्योंकि एक चरित्र वेक्टर पर सारांश केवल वेक्टर की लंबाई – hshihab

3
unique(testframe, MARGIN=2) 

काम नहीं करता है, हालांकि मुझे लगता है कि यह होना चाहिए, इसलिए कोशिश

as.data.frame(unique(as.matrix(testframe), MARGIN=2)) 

या यदि आप कारकों में बदलने की संख्या के बारे में चिंतित हैं,

testframe[,colnames(unique(as.matrix(testframe), MARGIN=2))] 

जो

age height gender 
1 18 76.1  M 
2 19 77.0  F 
3 20 78.1  M 
4 21 78.2  M 
5 22 78.8  F 
6 23 79.7  F 
7 24 79.9  M 
8 25 81.1  M 
9 26 81.2  F 
10 27 81.8  M 
11 28 82.8  F 
12 29 83.5  M 
10

पैदा करता है के बारे में कैसे:

testframe[!duplicated(as.list(testframe))] 
+0

आउटपुट करता है यह डेटा की सबसे बड़ी विधि है जिसे मैंने डेटा पर डेटा के लिए परीक्षण के लिए उपयोग किया है। फ्रेम – Zelazny7

2

एक अच्छा चाल आप उपयोग कर सकते हैं कि है अपने डेटा फ्रेम स्थानांतरित करने के लिए और फिर डुप्लिकेट की जांच।

duplicated(t(testframe)) 
-1

वास्तव में आप सिर्फ और अपने कोड में दोहराया गया-परिणाम को उलटने की आवश्यकता होगी subset का प्रयोग करने के लिए (जो अधिक पठनीय ब्रैकेट अंकन imho की तुलना में)

require(dplyr) 
iris %>% subset(., select=which(!duplicated(names(.)))) 
0

से चिपक सकता है एक साधारण आदेश है कि यदि आपके डेटा फ्रेम के दोहराया कॉलम में एक ही नाम भी थे काम करेगा:

testframe[names(testframe)[!duplicated(names(testframe))]] 
संबंधित मुद्दे