2014-07-14 8 views
5

मैं जानना चाहता हूं कि को विकल्प कमांड के माध्यम से एक अभिव्यक्ति में पारित एक स्ट्रिंग को संभव है या नहीं।आर के विकल्प कमांड में Unquote स्ट्रिंग

विशेष रूप से, मैं dplyr उपयोग कर रहा हूँ को फ़िल्टर और एक डेटा फ्रेम से चयन करने के लिए:

> w 
     subject sex response 
    1  1 M 19.08 
    2  2 M 16.46 
    ...  ... ... ... 
    6  6 M 23.60 
    7  7 M 23.96 
    8  8 F 22.48 
    9  9 F 25.79 
    ...  ... ... ... 
    16  16 F 26.66 

निम्नलिखित वांछित परिणाम पैदा करता है:

> w %.% filter(sex == "M") %.% select(response)   
     response 
    1 19.08 
    2 16.46 
    3 22.81 
    4 18.62 
    5 18.75 
    6 23.60 
    7 23.96 

लेकिन मैं एक अधिक सामान्य में ऐसा करना चाहते हैं मार्ग। निम्नलिखित आवश्यक परिणाम उत्पन्न नहीं करता है क्योंकि स्ट्रिंग "लिंग" उद्धरण चिह्नों में संलग्न है।

स्थानापन्न (%। डब्ल्यू% फिल्टर (y == "एम"), सूची (y = पेस्ट (नाम (डब्ल्यू) [2])))

w %.% filter("sex" == "M") 
    > eval(substitute(w %.% filter(y == "M"), list(y = paste(names(w)[2])))) 
    [1] subject sex  response 
    <0 rows> (or 0-length row.names) 

मैं हमेशा कर सकते हैं निम्न कार्य करें:

eval(parse(text = paste("w %.% filter(", names(w)[2], " == 'M')"))) 

हालांकि, यह थोड़ा बेकार दिखता है।

क्या ऐसा करने के और अधिक शानदार तरीके हैं? आखिरकार, मैं इसे एक समारोह में लपेटना चाहता हूं और इसे और भी सामान्य बनाना चाहता हूं।

कोई भी मदद/सुझाव की सराहना की जाएगी।

सधन्यवाद,

स्टीफन

+0

इसी प्रकार के क्यू एंड ए [** यहाँ **] (http://stackoverflow.com/questions/22005419/dplyr-without-hard-coding-the-variable-names/22012451#22012451) – Henrik

+4

'as.nam' आज़माएं ई() ' – hadley

+0

धन्यवाद, मुझे 'as.name()' के बारे में पता नहीं था जब तक अक्रुन ने इसका जवाब नहीं दिया। – Stefan

उत्तर

2

हो सकता है आप की कोशिश कर सकते हैं:

w <- structure(list(subject = c(1L, 2L, 6L, 7L, 8L, 9L, 16L), sex = structure(c(2L, 
2L, 2L, 2L, 1L, 1L, 1L), .Label = c("F", "M"), class = "factor"), 
response = c(19.08, 16.46, 23.6, 23.96, 22.48, 25.79, 26.66 
)), .Names = c("subject", "sex", "response"), class = "data.frame", row.names = c("1", 
"2", "6", "7", "8", "9", "16")) 

@ हैडली की टिप्पणी के आधार पर

eval(substitute(w%>% filter(y=="M"), list(y=as.name(names(w)[2])))) 
+0

+1। यदि आप एक उदाहरण के साथ अपडेट करना चाहते हैं (जिसे मैं पोस्ट करने वाला था), तो आप 'mtcars%>% फ़िल्टर का उपयोग कर सकते हैं (प्राप्त करें (पेस्ट (नाम (mtcars) [2]), envir = as.environment (mtcars)) = = 4)%>% का चयन करें (एमपीजी) ':-) – A5C1D2H2I1M1N2O1R2T1

+0

@ आनंद महतो, धन्यवाद। मैंने पोस्ट में दिखाए गए डेटासेट के साथ अपडेट किया। मुझे लगता है कि 'पेस्ट' की आवश्यकता नहीं है। – akrun

+0

नहीं। ऐसा नहीं है - मुझे लगता है कि मैं सिर्फ ओपी के दृष्टिकोण का अनुवाद कर रहा था और वास्तव में ध्यान नहीं दे रहा था :-) – A5C1D2H2I1M1N2O1R2T1

संबंधित मुद्दे