gpt4 book ai didi

r - 按降序排列_() 多列

转载 作者:行者123 更新时间:2023-12-03 23:47:27 26 4
gpt4 key购买 nike

我正在尝试使用 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

以下是我需要实现的目标:
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

在我的情况下,第二列是一个字符串:
#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

我找到了类似的解决方案 here ,但无法使其工作:
df1 %>% arrange_(.dots = c("grp", "desc(myCol)"))

Error: object 'myCol' not found



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

最佳答案

我们可以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' 的值。
更新
或者另一个选项是 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 <- "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





关于r - 按降序排列_() 多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38052325/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com