2012-03-23 19 views
6

का उपयोग कर डेटा.फ्रेम से कॉलम की एक सूची को हटाकर मुझे अक्सर डेटा.फ्रेम से कॉलम की सूचियों को हटाने की आवश्यकता होती है।सबसेट

मैं आमतौर पर ऐसा करते हैं:

to.remove <- c("hp","drat","wt","qsec") 
mtcars[,-which(names(mtcars) %in% to.remove)] 

जो ठीक काम करता है।

लेकिन मैं इसे subset का उपयोग करके क्लीनर तरीके से ऐसा करने में सक्षम होना चाहता हूं। लेकिन ऐसा लगता है कि डेटा.फ्रेम को जोड़ रहा है और फिर कॉलिंग नामों को तारों के बजाए चर के रूप में एक्सेस कर रहा है।

उदाहरण के लिए इस मैं ऐसा करने में सक्षम होना चाहते हैं क्या है:

subset(mtcars,select=-to.remove) 

वहाँ select बयान में तार का एक वैक्टर का उपयोग करने के subset मजबूर करने के लिए एक तरीका है? या क्या कोई और बेहतर विकल्प है?

उत्तर

22

मैं शायद इसलिए इस तरह करना होगा:

to.remove <- c("hp","drat","wt","qsec") 
`%ni%` <- Negate(`%in%`) 
subset(mtcars,select = names(mtcars) %ni% to.remove) 

(मैं %ni% एक बहुत का उपयोग करें, तो मैं यह पहले से ही मेरे .Rprofile में बना हुआ है।)

+0

निगेट +1 –

+0

@TylerRinker मैं अब याद नहीं आ रहा के साथ बनाई गई एक द्विआधारी ऑपरेटर का अच्छा उपयोग मैं कहाँ से है कि समारोह का चुनाव किया। या तो एसओ या आर-सहायता होनी चाहिए। – joran

+0

नेगेट के बारे में जानने के लिए बहुत अच्छा है। मैं शायद ही कभी 'funprog' में चीजों का उपयोग करता हूं और यह इसके लिए एक महान उपयोग है। – Jesse

4

आप निश्चित रूप से चयन का उपयोग कर सकते हैं, लेकिन आप नामों में पास होना है, चरित्र नहीं। तो यह काम करेगा:

subset(mtcars, select = -c(hp, drat, wt, qsec)) 
संबंधित मुद्दे