【发布时间】:2021-04-20 05:52:40
【问题描述】:
我有一个函数 perc_diff,我在 dplyr 的 mutate 中使用它。默认情况下,它计算与组中第一个值的相对差异。但它也可以与mean、max、nth 或任何返回一个值以比较其他值的函数一起使用。
perc_diff <- function(num, fun = first, ...) {
(num - fun(num, ...)) / fun(num, ...) * 100
}
有时,我需要更好地控制要与哪个组进行比较。在这种情况下,我通过检测模式来订购 data.frame,然后使用first。
test_data <- data.frame(group = paste0("group_", rep(LETTERS[1:3], 3)), value = 1:9, other = rep(1:3, each = 3)) %>%
arrange(rnorm(9))
test_data %>%
group_by(other) %>%
arrange(other, desc(str_detect(group, "A$"))) %>%
mutate(pdiff = perc_diff(value))
如果找不到控制组,我想跳过安排步骤并将其构建到函数中,并让它返回 NA。我创建了一个get_control_value 函数,perc_diff 可以使用它来代替first。我使用了 dplyr 编程的拥抱技术来获取测试组列。
get_control_value <- function(value, test_group_column = test_group, control_group_pattern = "A$") {
test_vector <- stringr::str_detect({{test_group_column}}, control_group_pattern)
if (sum(test_vector) == 1) {
value[test_vector]
} else {
NA
}
}
如果我给它test_group_column 的值,它会很好用。
test_data %>%
group_by(other) %>%
mutate(pdiff = perc_diff(value, get_control_value, test_group_column = group)) %>%
arrange(other, group)
但它不适用于默认值。
test_data %>%
rename(group = test_group) %>%
group_by(other) %>%
mutate(pdiff = perc_diff(value, get_control_value)) %>%
arrange(other, group)
我的问题是 - 为什么它不适用于默认值?我猜这与str_detect 不是适当的准引用上下文有关。但是,如果我手动给它赋值,为什么它会起作用呢?因为我是在mutate 内做的?
无论如何,我知道有很多方法可以解决这个问题,第一种是跳过默认值并始终输入它。但我仍然想知道是否有某种方法可以指定默认值,所以它会也可以工作。
【问题讨论】: