能否使用ifelse语句动态调整dplyr::ntile的分箱顺序?
关于动态调整dplyr::ntile排序顺序的解答
结论
你给出的写法是完全可行的,可以实现根据全局参数动态切换分箱的排序方向。
原代码逻辑说明
你的示例中通过ifelse(y == "asc", x, -x)对分箱字段做预处理:
- 当全局变量
y取值为asc时,直接用原始x列正序排序分箱 - 当
y取其他值时,把x取反后再分箱,等价于对x做倒序排序分箱
运行你提供的示例代码,得到的分箱结果完全符合预期。
更优写法推荐
因为你判断条件用的y是全局单值变量,不是数据框内的列向量,不需要用到向量化的ifelse,直接用普通if判断性能更好,也更易读,还可以搭配dplyr自带的desc()函数避免对非数值类型字段不兼容的问题:
library(dplyr) dat <- data.frame(x = 1:10) y <- "asc" dat %>% mutate(tile = ntile(if (y == "asc") x else desc(x), 5))
如果y是数据框内的列,需要每行单独控制排序方向,才需要保留ifelse写法。
内容的提问来源于stack exchange,提问作者djc55
相关产品推荐
相关产品推荐

