R 按降序排列多个列

R 按降序排列多个列,r,dplyr,R,Dplyr,我正在尝试使用字符串输入并按降序排列其中一列 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.1

我正在尝试使用字符串输入并按降序排列其中一列

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
在我的例子中,第二列是一个字符串:

#dynamic string
myCol <- "x"

#failed attempts
df1 %>% arrange_("grp", desc(myCol))
错误:找不到对象“mycl”

我找到了类似的解决方案,但无法实现:

df1 %>% arrange_(.dots = c("grp", "desc(myCol)"))
错误:找不到对象“mycl”


感觉我遗漏了一些非常明显的东西,想法?

我们可以
粘贴为字符串来评估它

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
或者使用
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(mycl)”
,它是一个字符串,“mycl”的值不会被计算

更新 或者另一个选项是
parse_expr
(从
rlang
)并使用
进行计算

df1 %>%
    arrange(grp, !! rlang::parse_expr(myCol1))
#grp    x
#1   1 6.16
#2   1 3.39
#3   1 2.82
#4   2 9.17
#5   2 4.35

或者在OP的帖子中使用原始字符串。将字符串转换为符号(
sym
),计算(
!!
)并按降序(
desc
)排列

myCol%
排列(grp,desc(!!rlang::sym(mycl)))
#玻璃钢x
#1   1 6.16
#2   1 3.39
#3   1 2.82
#4   2 9.17
#5   2 4.35
这可能会起到以下作用:
排列(grp,穿过(c(x),描述))


dplyr
version
1.0.5

是的,这些都是很好的选择,希望有一个更漂亮的解决方案来避免粘贴。@zx8754我添加了一个
interp
选项,但我认为使用
paste
的选项是一致同意的,粘贴似乎是一个好办法,
interp
使它看起来更糟(没有冒犯).你介意加上“quosures”方法吗?无法使其工作。@zx8754我添加了一个带有
rlang
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
df1 %>% 
      arrange_(.dots = c("grp", paste0("desc(", myCol, ")")))
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
df1 %>%
    arrange(grp, !! rlang::parse_expr(myCol1))
#grp    x
#1   1 6.16
#2   1 3.39
#3   1 2.82
#4   2 9.17
#5   2 4.35
myCol <- "x"
df1 %>% 
    arrange(grp, desc(!! rlang::sym(myCol)))
# grp    x
#1   1 6.16
#2   1 3.39
#3   1 2.82
#4   2 9.17
#5   2 4.35