如何解决Tidyeval 拥抱不适用于默认值
我在 dplyr 的 perc_diff
中使用了一个函数 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
内完成的?
无论如何,我知道有很多方法可以解决这个问题,第一种是跳过默认值并始终输入它。但我仍然想知道是否有某种方法可以指定默认值,以便也工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。