स्ट्रिंग मैच के आधार पर कॉलम चुनें - dplyr :: चुनें


83

मेरे पास बहुत सारे और बहुत सारे स्तंभों के साथ एक डेटा फ़्रेम ("डेटा") है। कुछ स्तंभों में एक निश्चित स्ट्रिंग ("search_string") होती है।

मैं dplyr::select()केवल उप-कॉलम सहित मुझे एक सबसेट देने के लिए कैसे उपयोग कर सकता हूं जिसमें स्ट्रिंग शामिल है?

मैंने कोशिश की:

# columns as boolean vector
select(data, grepl("search_string",colnames(data)))

# columns as vector of column names names 
select(data, colnames(data)[grepl("search_string",colnames(data))]) 

दोनों में से कोई भी काम नहीं करता है।

मुझे पता है कि select()स्तम्भों के विकल्प के रूप में संख्यात्मक वैक्टर स्वीकार करता है जैसे:

select(data,5,7,9:20)

लेकिन मुझे नहीं पता कि IDमेरी grepl()अभिव्यक्ति से स्तंभों का एक संख्यात्मक वेक्टर कैसे प्राप्त किया जाए ।


कई तार और मैचों के लिए यह SO उत्तर भी देखें: stackoverflow.com/q/29018292/3871924
agenis

जवाबों:


114

Dplyr दुनिया के भीतर , प्रयास करें:

select(iris,contains("Sepal"))

में चयन अनुभाग देखें ?selectकई अन्य सहायकों की तरह के लिए starts_with, ends_withआदि


2
खबरदार कि आप इसे आसानी से देख सकते हैं जैसे कि रेगेक्स से बचने की कोशिश करके, रेगेक्स आपको काटने के लिए वापस आता है, उदाहरण के लिए: select(iris, contains(".") )निश्चित नहीं है कि आपको fixed=TRUEवास्तविक के लिए खोज करने के लिए कैसे गुजरना चाहिए"."
thelatemail

1
@thelatemail जो कोड या डॉक्स (जैसे हम मान रहे हैं fixed = TRUEया समकक्ष) में एक निरीक्षण की तरह महसूस करता है । अभी भी बहुत युवा है।
जोरन

@thelatemail उफ़! तो मैंने किया!
जोरान

6
खैर, यह तो मेरे गीथूब कैरियर के लिए एक लम्बी शुरुआत है। जल्द ही आ रहा है 'करीब से नकली'!
Thelatemail

1
@MattBannert मेरे द्वारा दिए गए समाधान को देखें
Boern

60

तुम कोशिश कर सकते हो:

select(data, matches("search_string"))

यह सामान्य से अधिक है contains- आप रेगेक्स (जैसे "one_string|or_the_other") का उपयोग कर सकते हैं ।

अधिक उदाहरण के लिए देखें: http://rpackages.ianhowson.com/cran/dplyr/man/select.html


1
regexp का समर्थन करने के बाद से बेहतर
Boern

लिंक अब नीचे है
pratikpc

30

इसके बजाय selectसिर्फ उपयोग करने की आवश्यकता नहीं है[

data[,grepl("search_string", colnames(data))]

चलो irisडाटासेट के साथ प्रयास करें

>iris[,grepl("Sepal", colnames(iris))]
  Sepal.Length Sepal.Width
1          5.1         3.5
2          4.9         3.0
3          4.7         3.2
4          4.6         3.1
5          5.0         3.6
6          5.4         3.9

6
@arumbay dplyrएक panceum है - जब आप इसे कर सकते हैं base, तब भी मानक वाक्यविन्यास उतना अच्छा / पठनीय / लिखने योग्य नहीं है - मेरा उत्तर देखें ।
पियोट्र मिगडाल

20

Piotr Migdals प्रतिक्रिया के आधार पर मैं एक वैकल्पिक समाधान देना चाहता हूं जिससे तार के वेक्टर के लिए संभावना को सक्षम किया जा सके:

myVectorOfStrings <- c("foo", "bar")
matchExpression <- paste(myVectorOfStrings, collapse = "|")
# [1] "foo|bar"
df %>% select(matches(matchExpression))

रेगेक्स ORऑपरेटर का उपयोग करना ( |)

ध्यान दें : यदि आपके पास वास्तव में स्तंभ नामों का एक सादा वेक्टर है (और RegExpression की शक्ति की आवश्यकता नहीं है), तो कृपया इस उत्तर के नीचे की टिप्पणी देखें (क्योंकि यह क्लीनर समाधान है)।


5
ज्ञात कॉलम नामों के वेक्टर के लिए, उपयोग करेंselect(df, one_of(array_of_colnames))
एलेक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.