2016-06-27 14 views
11

मैं स्ट्रिंग इनपुट के साथ arrange_() और अवरोही क्रम में कॉलम में से एक में उपयोग करने का प्रयास कर रहा हूं।arrange_() अवरोही क्रम के साथ एकाधिक कॉलम

#dynamic string 
myCol <- "x" 

#failed attempts 
df1 %>% arrange_("grp", desc(myCol)) 

Error: incorrect size (1), expecting : 5

df1 %>% arrange_("grp", "desc(myCol)") 

Error: object 'myCol' not found

:

df1 %>% arrange(grp, -x) 
df1 %>% arrange(grp, desc(x)) 
# grp x 
# 1 1 6.16 
# 2 1 3.39 
# 3 1 2.82 
# 4 2 9.17 
# 5 2 4.35 

मेरे मामले दूसरे कॉलम में एक स्ट्रिंग है:

library(dplyr) # R version 3.3.0 (2016-05-03) , dplyr_0.4.3 
# data 
set.seed(1) 
df1 <- data.frame(grp = factor(c(1,2,1,2,1)), 
        x = round(runif(5,1,10), 2)) 

# grp x 
# 1 1 3.39 
# 2 2 4.35 
# 3 1 6.16 
# 4 2 9.17 
# 5 1 2.82 

नीचे मैं क्या हासिल करने की आवश्यकता है 0

मैं समान समाधान here मिलीं लेकिन वे यह काम कर सकता था:

df1 %>% arrange_(.dots = c("grp", "desc(myCol)")) 

Error: object 'myCol' not found

Feels की तरह मैं कुछ बहुत स्पष्ट है, विचारों याद आ रही है?

उत्तर

8

हम मूल्यांकन करने के लिए एक स्ट्रिंग के रूप में paste 'desc' कर सकते हैं।

myCol1 <- paste0("desc(", "x)") 
df1 %>% 
    arrange_(.dots = c("grp", myCol1)) 
# grp x 
#1 1 6.16 
#2 1 3.39 
#3 1 2.82 
#4 2 9.17 
#5 2 4.35 

या 'myCol' के साथ

df1 %>% 
     arrange_(.dots = c("grp", paste0("desc(", myCol, ")"))) 

या का उपयोग lazyeval

library(lazyeval) 
df1 %>% 
    arrange_(.dots = c("grp", interp(~ desc(n1), n1 = as.name(myCol)))) 
# grp x 
#1 1 6.16 
#2 1 3.39 
#3 1 2.82 
#4 2 9.17 
#5 2 4.35 

"desc(myCol)" का उपयोग करके, यह एक एकल स्ट्रिंग और 'myCol' का मान है मूल्यांकित नहीं।

+0

हां, ये अच्छे विकल्प हैं, इच्छा है कि पेस्ट से बचने के लिए एक सुंदर समाधान था। – zx8754

+1

@ zx8754 मैंने 'इंटरप 'के साथ एक विकल्प जोड़ा, लेकिन मुझे लगता है कि' पेस्ट 'वाला एक कॉम्पैक्ट – akrun

+4

सहमत है, पेस्ट जाने का एक तरीका लगता है,' इंटरप 'इसे और भी खराब दिखता है (कोई अपराध नहीं)। – zx8754

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