我的目标是使用tidyverse有条件地改变数据类型。下面是一个可重复的示例。例如,我想将列cyl
更改为因子。然而,因子levels
和labels
参数将取决于用户是否提供了对象bin.order
或将其保留为NULL
。我知道如何在tidyverse之外执行此操作。而是寻找一种更简洁的方式来使用tidyverse函数。
mtcars %>%
mutate(cyl = ifelse(is.null(bin.order),
factor(x = cyl, levels = sort(unique(cyl)), labels = sort(unique(cyl))),
factor(x = cyl, levels = bin.order, labels = bin.order)))
所期望的结果可能是这样的:
# if bin.order is null
mtcars %>%
mutate(cyl = factor(x = cyl, levels = sort(unique(cyl)), labels = sort(unique(cyl))))
# if bin.order is not null
bin.order = c(4, 6, 8)
mtcars %>%
mutate(cyl = factor(x = cyl, levels = bin.order, labels = bin.order))
2条答案
按热度按时间cbjzeqam1#
您可以使用
%||%
操作符(来自rlang,由purrr重新导出),如果不是NULL
,则使用左侧,否则使用右侧。例如,x %||% y
等效于if (is.null(x)) y else x
。对于您的情况:
还要注意,如果
labels
与levels
相同,则无需指定labels
,因为这是默认行为。mqxuamgl2#
可能的解决方案是构建一个函数