我的目标是使用 tidyverse 有条件地改变数据类型。这是一个可重现的示例。例如,我想将列更改cyl为因子。然而,因子\xe2\x80\x99slevels和labels参数将取决于用户是否提供了对象bin.order或留下了它NULL。我知道如何在 tidyverse 之外执行此操作,但通过 tidyverse 函数寻找更简洁的方法。
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)))\nRun 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))\nRun Code Online (Sandbox Code Playgroud)\n
您可以使用%||%运算符(来自 rlang,由 purrr 重新导出),如果没有,则使用左侧,NULL否则使用右侧。IE,x %||% y相当于if (is.null(x)) y else x.
对于你的情况:
\nlibrary(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"\nRun Code Online (Sandbox Code Playgroud)\n另请注意,\xe2\x80\x99s 无需指定labels它们\xe2\x80\x99 是否与levels,因为这是默认行为。