gpt4 book ai didi

r - 在 `arrange` 数据管道函数中将排序方向传递给 `dplyr`

转载 作者:行者123 更新时间:2023-12-04 06:10:56 24 4
gpt4 key购买 nike

我有一个函数可以用我的数据做很多事情。但是我想添加一个排序顺序参数,允许我在将参数传递给函数时以相反的方向一步翻转数据。我需要该函数与 dbplyr 的 SQL 后端兼容。

我目前的解决方案似乎真的不够优雅。我有两个完整的数据管道,一个带有 desc() ,一个没有。这感觉真的很笨拙,但由于我必须在 dplyr 中围绕我的字段包装 desc() 我想不出还有什么办法可以做到这一点。一个想法可能是创建一个 1-1 的排序参数,并在排序前将其乘以我的字段。有没有更简单或更简单的方法来做到这一点?

这是一个简单的玩具示例,展示了我如何创建两个管道:

library(dplyr)

df <- data.frame(x = rnorm(10))

stupid_func <- function(df, sort_order = 'asc'){
## does many things in reality, this is a toy example

if (sort_order == 'asc') {
df %>% arrange(x) %>% return
} else if (sort_order == 'desc') {
df %>% arrange(desc(x)) %>% return
}

}

stupid_func(df, 'desc')
#> x
#> 1 1.6680607
#> 2 1.4853252
#> 3 1.1468913
#> 4 1.0447893
#> 5 0.5243115
#> 6 0.3784285
#> 7 -0.5693750
#> 8 -0.8744429
#> 9 -1.0346144
#> 10 -2.6256735

stupid_func(df)
#> x
#> 1 -2.6256735
#> 2 -1.0346144
#> 3 -0.8744429
#> 4 -0.5693750
#> 5 0.3784285
#> 6 0.5243115
#> 7 1.0447893
#> 8 1.1468913
#> 9 1.4853252
#> 10 1.6680607

这里使用了一个排序参数,该参数被映射到一个 fac,它是 1-1

stupid_func2 <- function(df, sort_order = 'asc'){
## does many things in reality

if (sort_order == 'asc') {
fac <- 1
} else {
fac <- -1
}

df %>% arrange(fac * x) %>% return

}

最佳答案

为了完全避免控制流,您可以将 descidentity 作为函数而不是字符串传递并调用它:

library(dplyr)
set.seed(47)

df <- data.frame(x = rnorm(2))

f <- function(data, sort_fun = identity){
arrange(data, sort_fun(x))
}

f(df)
#> x
#> 1 0.7111425
#> 2 1.9946963

f(df, desc)
#> x
#> 1 1.9946963
#> 2 0.7111425

如果你真的想输入字符串,你可以使用它们来查找合适的函数,可以用同样的方式调用:

f2 <- function(data, sort_order = c('asc', 'desc')){
sort_order <- match.arg(sort_order)
sort_fun <- list(asc = identity, desc = desc)[[sort_order]]
arrange(data, sort_fun(x))
}

f2(df)
#> x
#> 1 0.7111425
#> 2 1.9946963

f2(df, 'desc')
#> x
#> 1 1.9946963
#> 2 0.7111425

您可以类似地查找表达式,这可以让您完全避免 identity:

f3 <- function(data, sort_order = c('asc', 'desc')){
sort_order <- match.arg(sort_order)
sort_expr <- list(asc = expr(x), desc = expr(desc(x)))[[sort_order]]
arrange(df, !!sort_expr)
}

f3(df)
#> x
#> 1 0.7111425
#> 2 1.9946963

f3(df, 'desc')
#> x
#> 1 1.9946963
#> 2 0.7111425

关于r - 在 `arrange` 数据管道函数中将排序方向传递给 `dplyr`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50900246/

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