tidyverse 方法使用用户提供的参数(如果不是 NULL 或默认值)

Jst*_*d3r 1 r dplyr

我的目标是使用 tidyverse 有条件地改变数据类型。这是一个可重现的示例。例如,我想将列更改cyl为因子。然而,因子\xe2\x80\x99slevelslabels参数将取决于用户是否提供了对象bin.order或留下了它NULL。我知道如何在 tidyverse 之外执行此操作,但通过 tidyverse 函数寻找更简洁的方法。

\n
mtcars %>% \n  mutate(cyl = ifelse(is.null(bin.order), \n                      factor(x = cyl, levels = sort(unique(cyl)), labels = sort(unique(cyl))), \n                      factor(x = cyl, levels = bin.order, labels = bin.order)))\n
Run Code Online (Sandbox Code Playgroud)\n

期望的结果将是这样的:

\n
# if bin.order is null\nmtcars %>% \n  mutate(cyl = factor(x = cyl, levels = sort(unique(cyl)), labels = sort(unique(cyl))))\n\n# if bin.order is not null\nbin.order = c(4, 6, 8)\nmtcars %>% \n  mutate(cyl = factor(x = cyl, levels = bin.order, labels = bin.order))\n
Run Code Online (Sandbox Code Playgroud)\n

zep*_*ryl 5

您可以使用%||%运算符(来自 rlang,由 purrr 重新导出),如果没有,则使用左侧,NULL否则使用右侧。IE,x %||% y相当于if (is.null(x)) y else x.

\n

对于你的情况:

\n
library(dplyr)\nlibrary(purrr)\n\nfactor.bin.order <- function(x, bin.order = NULL) {\n  factor(x, bin.order %||% sort(unique(x)))\n}\n\nmtcars2 <- mtcars %>% \n  mutate(\n    cyl1 = factor.bin.order(cyl),\n    cyl2 = factor.bin.order(cyl, c(6, 4, 8))\n  )\n\nlevels(mtcars2$cyl1)\n# "4" "6" "8"\n\nlevels(mtcars2$cyl2)\n# "6" "4" "8"\n
Run Code Online (Sandbox Code Playgroud)\n

另请注意,\xe2\x80\x99s 无需指定labels它们\xe2\x80\x99 是否与levels,因为这是默认行为。

\n