arrange_()具有降序的多个列

zx8*_*754 13 r dplyr

我试图使用arrange_()字符串输入,并在其中一列中按降序排列.

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
Run Code Online (Sandbox Code Playgroud)

以下是我需要实现的目标:

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
Run Code Online (Sandbox Code Playgroud)

在我的情况下,第二列是一个字符串:

#dynamic string
myCol <- "x"

#failed attempts
df1 %>% arrange_("grp", desc(myCol))
Run Code Online (Sandbox Code Playgroud)

错误:大小不正确(1),期待:5

df1 %>% arrange_("grp", "desc(myCol)")
Run Code Online (Sandbox Code Playgroud)

错误:找不到对象'myCol'

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
Run Code Online (Sandbox Code Playgroud)

我在这里找到了类似的解决方案,但无法使其工作:

df1 %>% arrange_(.dots = c("grp", "desc(myCol)"))
Run Code Online (Sandbox Code Playgroud)

错误:找不到对象'myCol'

感觉就像我错过了一些非常明显的想法?

akr*_*run 12

我们可以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
Run Code Online (Sandbox Code Playgroud)

或者使用'myCol'

df1 %>% 
      arrange_(.dots = c("grp", paste0("desc(", myCol, ")")))
Run Code Online (Sandbox Code Playgroud)

或者使用 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
Run Code Online (Sandbox Code Playgroud)

通过使用"desc(myCol)",它是一个单独的字符串,并且不评估'myCol'的值.

更新

或者另一种选择是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
Run Code Online (Sandbox Code Playgroud)

或者在OP的帖子中使用原始字符串.将字符串转换为symbol(sym),evaluate(!!)并按降序(desc)顺序排列

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
Run Code Online (Sandbox Code Playgroud)

  • 同意,粘贴似乎是一种方式,`interp`使它看起来更糟(没有冒犯). (4认同)