dplyr

2014-10-21 35 views
18

में व्यवस्थित नामों का एक वेक्टर पास करें() arrange() {dplyr} वेरिएबल नामों के वेक्टर को क्रमबद्ध करने के लिए पास करना चाहते हैं। आम तौर पर मैं केवल वेरिएबल्स टाइप करता हूं जो मैं चाहता हूं, लेकिन मैं एक ऐसा फ़ंक्शन बनाने की कोशिश कर रहा हूं जहां सॉर्टिंग वेरिएबल फ़ंक्शन पैरामीटर के रूप में इनपुट हो सकें।dplyr

df <- structure(list(var1 = c(1L, 2L, 2L, 3L, 1L, 1L, 3L, 2L, 4L, 4L 
), var2 = structure(c(10L, 1L, 8L, 3L, 5L, 4L, 7L, 9L, 2L, 6L 
), .Label = c("b", "c", "f", "h", "i", "o", "s", "t", "w", "x" 
), class = "factor"), var3 = c(7L, 5L, 5L, 8L, 5L, 8L, 6L, 7L, 
    5L, 8L), var4 = structure(c(8L, 5L, 1L, 4L, 7L, 4L, 3L, 6L, 9L, 
    2L), .Label = c("b", "c", "d", "e", "f", "h", "i", "w", "y"), 
    class = "factor")), .Names = c("var1", "var2", "var3", "var4"), 
    row.names = c(NA, -10L), class = "data.frame") 

# this is the normal way to arrange df with dplyr 
df %>% arrange(var3, var4) 

# but none of these (below) work for passing a vector of variables 
vector_of_vars <- c("var3", "var4") 
df %>% arrange(vector_of_vars) 
df %>% arrange(get(vector_of_vars)) 
df %>% arrange(eval(parse(text = paste(vector_of_vars, collapse = ", ")))) 
+3

के लिए !!! गंदें शब्द बोलना,%>% का उपयोग, के रूप में यह एक कार्रवाई <के लिए बहुत बदसूरत है ... (- या = बस ठीक काम करता है ... – Kevin

उत्तर

21

हैडली ने मदद फ़ाइल में यह स्पष्ट नहीं किया है - केवल अपने एनएसई विग्नेट में। अंडरस्कोर के बाद वाले कार्यों के संस्करण मानक मूल्यांकन का उपयोग करते हैं, ताकि आप उन्हें तारों के वैक्टर और इसी तरह से पास कर सकें।

यदि मैं आपकी समस्या को सही ढंग से समझता हूं, तो आप arrange() को arrange_() के साथ प्रतिस्थापित कर सकते हैं और यह काम करेगा।

==== संपादित ===

.dots तर्क के रूप में स्ट्रिंग के वेक्टर दर्रा जब आप इसे करते हैं।

> df %>% arrange_(.dots=c("var1","var3")) 
    var1 var2 var3 var4 
1  1 i 5 i 
2  1 x 7 w 
3  1 h 8 e 
4  2 b 5 f 
5  2 t 5 b 
6  2 w 7 h 
7  3 s 6 d 
8  3 f 8 e 
9  4 c 5 y 
10 4 o 8 c 
+2

मैं यह भी सोच रहा था, लेकिन यदि आप 'df%>% arrange_ (vector_of_vars)' करते हैं, तो यह दूसरे तत्व को अनदेखा करता है और केवल पहले तत्व पर ही दिखता है। हालांकि, अगर आप 'df%>% arrange_ (vector_of_vars [1], vector_of_vars [2])', फिर यह दोनों मानों पर आधारित है। मुझे लगता है कि दूसरी विधि की तुलना में एक और अधिक सुरुचिपूर्ण दृष्टिकोण है, लेकिन मुझे यकीन नहीं है कि यह क्या है। – eipi10

+0

'' 'व्यवस्था _()' '' दूसरे कॉलम को अनदेखा कर रहा है। @ eipi10 आपका समाधान काम करेगा, लेकिन समस्या यह है कि तत्व की मनमानी संख्या हो सकती है '' 'vector_of_vars''' में है। – rsoren

+0

मैं दावा नहीं कर रहा था कि मेरी दूसरी विधि एक अच्छी थी। मैं बस यह समझने की समस्या को बांधने की कोशिश कर रहा था कि प्रतीत होता है कि "प्राकृतिक" दृष्टिकोण क्यों काम नहीं करता है और अस्थायी, समाधान अगर अस्थायी भी प्रदान करता है। उम्मीद है कि @ हैडली कूदेंगे और हमें शिक्षित करेंगे। – eipi10

3

इस प्रयास करें:

df %>% do(do.call(arrange_, . %>% list(.dots = vector_of_vars))) 

और वास्तव में इस रूप में और अधिक बस लिखा जा सकता है:

df %>% arrange_(.dots = vector_of_vars) 

हालांकि इस बिंदु पर मैं अपने ही farnsy के निहित समाधान के रूप में लगता है।

+0

यह मेरे लिए काम नहीं करता है, [मेरी पोस्ट] देखें (http://stackoverflow.com/questions/38052325)। – zx8754

4

नए संस्करण में (जल्द ही dplyr की 0.6.0 जारी होने की) एक से अधिक चर देखते हैं जब हम quosures

library(dplyr) 
vector_of_vars <- quos(var1, var3) 
df %>% 
    arrange(!!! vector_of_vars) 
# var1 var2 var3 var4 
#1  1 i 5 i 
#2  1 x 7 w 
#3  1 h 8 e 
#4  2 b 5 f 
#5  2 t 5 b 
#6  2 w 7 h 
#7  3 s 6 d 
#8  3 f 8 e 
#9  4 c 5 y 
#10 4 o 8 c 

का उपयोग कर सकते हैं, तो हम quos का उपयोग करें और एक एकल चर के लिए यह quo है । quos उद्धृत चर का एक list वापस आ जाएगी और arrange अंदर, हम इमो चेनिंग के लिए बचाया जाना चाहिए list का उपयोग कर मूल्यांकन