2016-05-06 10 views
8

पर आधारित कॉलम का सब्सक्राइब चुनें मेरे पास डेटा के 300 कॉलम के साथ डेटा फ्रेम है। मैंने 126 तत्वों के साथ एक वेक्टर बनाया जो 300 के 126 के कॉलम नाम हैं। मैं अपने 126 में नहीं होने के आधार पर 300 को सब्सक्राइब करना चाहता हूं। वे क्रम में नहीं हैं, इसलिए मैं बस निर्दिष्ट करके हटा नहीं सकता - 1: -126।वेक्टर आर

मैंने grep और matrix परिचालनों के साथ विभिन्न चीजों की कोशिश की, लेकिन वे काम नहीं कर पाए। जैसे कि निम्नलिखित काम नहीं किया। एक्स में 300 कॉलम हैं। एफ में 126 स्तंभ नामों के वेक्टर शामिल हैं जिन्हें मैं x1 से बाहर करना चाहता हूं।

x1<-x[,-which(names(x), %in% f)] 

अगर मैं बिल्कुल एक चर नाम या कई का उपयोग करें, मैं यह काम करने के लिए प्राप्त कर सकते हैं, लेकिन मैं च में 126 तत्वों को टाइप करने के लिए नहीं करना चाहती।

+0

आगे स्पष्टीकरण के लिए, मैं f में तत्वों का उपयोग करने में सक्षम होना चाहता हूं जैसे कि मैंने f = c (element1of_f, element2of_f, ..., element126of_f) – akaDrHouse

+4

'x [,! नाम (x)%% च] '? – Sotos

+1

क्या आपने तर्कों के साथ dplyr से चयन का उपयोग किया था: start_with, end_with, इसमें शामिल है ...? –

उत्तर

1

सभी को इतनी जल्दी उत्तर देने के लिए धन्यवाद। आपके कुछ समाधान काम करते थे। मुझे एहसास हुआ कि मेरी सबसे बड़ी समस्या यह थी कि मैं एक सच्चे वेक्टर एफ नहीं था! और एक बार मैंने किया, यह अभी भी एक कारक के रूप में माना जा रहा था! तो मैंने सोचा कि मैं इसे ठीक करने के लिए आपकी मदद से जो किया था, उसे पोस्ट करूंगा।

f <- select(filter(hash_t,(variable %in% c("a",...,"z"))),X) #wasn't a vector... 
f[,1]<-sapply(f[,1],as.character) # had to remove factor info from f; still not a vector... 
f<-f[,1] # Now I had a vector! 
x1<-x[,!names(x) %in$ f] #worked! 

पोस्ट किए गए कई विचारों ने काम किया। मुझे बस मेरे चयन मानदंडों में एक उचित वेक्टर नहीं होने और इसके साथ जुड़े कुछ कारक मुद्दों के साथ समस्या थी।

+0

कुछ समाधान काम किया? आपके अलावा केवल दो जवाब हैं। आम तौर पर, जब आप एक प्रश्न पूछते हैं तो आपको एक उत्तर सही सही चिह्नित करना चाहिए। यदि कोई भी वास्तव में आपके प्रश्न का उत्तर नहीं देता है तो आप चिह्नित नहीं होते हैं, लेकिन अंकन आपके प्रश्न को समान समस्या वाले अन्य लोगों के लिए अधिक मूल्यवान बनाता है। –

+0

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

3

उपयोग %in%:

names.use <- names(df)[!(names(df) %in% f)] 

फिर names.use सभी स्तंभों जो नाम f के अपने वेक्टर में शामिल नहीं हैं के नाम शामिल होंगे।

वांछित कॉलम का उपयोग कर अपने डेटा फ्रेम सबसेट के लिए, आपको निम्न का उपयोग कर सकते हैं:

df.subset <- df[, names.use] 
+0

के लिए काम करना चाहिए मैंने कोशिश की और यह अन्य नामों का चयन किया, लेकिन डेटा नहीं। यह एक वेक्टर को परिभाषित करता है जो मैं चाहता था कि उपनाम, लेकिन कोई डेटा नहीं। – akaDrHouse

+0

बस अपने इच्छित कॉलम का उपयोग करके अपने मूल डेटा फ्रेम को सबसेट करें। –

3

यहाँ एक प्रतिलिपि प्रस्तुत करने योग्य उदाहरण के साथ एक data.table समाधान है।

# load library 
    library(datat.table) 

# get data 
    data(iris) 

# convert your dataset into data.table 
    setDT(iris) 

# vector of columns you DON'T want 
    f <- c("Sepal.Width","Petal.Length") 


# subset 
    output <- iris[, !f, with = FALSE] 
1

तुम भी कर सकते हैं:

% में% का उपयोग कर के विपरीत
subset(x, select=f) 

, यह एक त्रुटि फेंक देंगे अगर में से एक मान एक्स में एक स्तंभ नाम है, जो सहायक हो सकता है नहीं है टाइपो को स्पॉट करने के लिए यदि आपने उनमें से कुछ मैन्युअल रूप से टाइप किया है।