2014-11-20 4 views
5

मैं dplyr::arrange(dplyr::desc()) का उपयोग कैसे कर सकता हूं और कॉलम नाम के रूप में एक स्ट्रिंग में पास कर सकता हूं?कॉलम नाम के रूप में स्ट्रिंग का उपयोग करते समय dplyr :: arrange (desc()) का उपयोग कैसे करें?

df <- data.frame(a = 1:3, b = 3:1) 

उदाहरणों में काम करते हैं:

df %>% dplyr::arrange(b) 
df %>% dplyr::arrange_("b") 
df %>% dplyr::arrange(dplyr::desc(b)) 

लेकिन मैं दोनों arrange और desc के साथ एक स्ट्रिंग का उपयोग नहीं कर पा रहे, इन दो संस्करण मैं हैं

यहाँ एक नमूना डेटासेट है कोशिश की कि काम न करें:

df %>% dplyr::arrange(dplyr::desc("b")) 
df %>% dplyr::arrange_(dplyr::desc("b")) 

धन्यवाद!

+1

इस 'डीएफ%>% की तरह हो सकता है dplyr :: व्यवस्था (dplyr :: desc (df [ "बी"])) '? वाकई, मुझे यकीन नहीं है ... – KFB

+0

आपको इंटरप – hadley

+0

युक्तियों और डुप्ली निष्कर्षों के लिए धन्यवाद का उपयोग करना होगा, लेकिन मैं अभी भी यह सरल उदाहरण काम करने के लिए इंटरप (lazyeval पैकेज से) का उपयोग करने का तरीका नहीं समझ सकता। मैं एनएसई को समझने की कोशिश करता रहूंगा लेकिन यह आश्चर्यजनक होगा अगर आप समाधान पोस्ट कर सकते हैं यदि यह आपको बहुत अधिक समय नहीं लेता है। वैसे भी बहुत कुछ –

उत्तर

1

tl; डॉ:df %>% arrange(desc(!!sym("b")))

dplyr क्रियाओं के सभी मानक मूल्यांकनों के पहले पदावनत कर रहे हैं, तो बजाय:

library(dplyr) 
x <- "b" 
df %>% arrange_(x) 

यह अब टाइप करने के लिए सिफारिश की है:

library(dplyr) 
library(rlang) 
df %>% arrange(!!sym(x)) 

या:

df %>% arrange(UQ(sym(x))) 

जहां sym, !!, और UQrlang पैकेज से आते हैं।

?arrange_ देखें, यह Deprecated SE versions of main verbs. नामक एक सहायता विषय से लिंक है और कुछ विवरण प्रदान करता है।

वहां से उतरते यह नया निर्माण अनुकूल करने के लिए सीधा है सॉर्ट करने के लिए:

df %>% arrange(desc(!!sym(x))) 

लेकिन यह ठीक रूप में अच्छी तरह से काम करता है:

df %>% arrange(desc(.[[x]])) 

FYI करें, यह arrange_ साथ काम करने के लिए हम निम्नलिखित कर सकते थे। ये अनुशंसित दृष्टिकोण नहीं हैं लेकिन विचार प्रक्रिया के लिए यह दिलचस्प है।

df %>% arrange_(paste0("desc(",x,")")) 

अगर हम ओ पी के उदाहरण की तरह सांख्यिक चर है कौन सा सरल किया जा सकता:

df %>% arrange_(paste0("-",x)) 

या इसका उपयोग करते lazyeval::interp

df %>% arrange_(interp(~desc(y),y=as.name(x))) 

या @ के रूप में श्याम-saladi का प्रस्ताव:

desc_ <- function(x) lazyeval::interp(~desc(var), var = as.name(x)) 
# or just 
# desc_ <- function(x) paste0("desc(",x,")") 
df %>% arrange_(desc_(x)) 
संबंधित मुद्दे