2016-06-27 11 views
11

Próbuję użyć arrange_() z ciągiem znaków i w jednej z kolumn w porządku malejącym.arran_() wiele kolumn z porządku malejącym

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 

Poniżej jest to, czego potrzebujesz, aby osiągnąć:

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 

w moim przypadku drugiej kolumny jest ciągiem:

#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_(c("grp", "desc(myCol)")) 
#wrong output 
# grp x 
# 1 1 3.39 
# 2 1 6.16 
# 3 1 2.82 
# 4 2 4.35 
# 5 2 9.17 

Znalazłem podobne rozwiązanie here, ale nie mogła ona działać:

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

Error: object 'myCol' not found

Czuje jak mi brakuje czegoś bardzo oczywistego, pomysły?

Odpowiedz

8

Możemy paste "desc" jako ciąg znaków do oceny.

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 

Albo z 'Mycol'

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

Albo użyć 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 

Korzystając "desc(myCol)", jest to pojedynczy łańcuch i wartość 'Mycol' jest nie oceniono.

+0

Tak, to są dobre alternatywy, życzę sobie, aby były ładniejsze rozwiązania unikające wklejania. – zx8754

+1

@ zx8754 Dodałem opcję z 'interp', ale myślę, że ta z' wklejką' jest kompaktowa – akrun

+4

Zgadzam się, wklejanie wydaje się być sposobem na przejście, "interp" sprawia, że ​​wygląda jeszcze gorzej (bez urazy). – zx8754

Powiązane problemy