【发布时间】:2017-10-15 13:13:10
【问题描述】:
鉴于 dplyr 工作流程:
require(dplyr)
mtcars %>%
tibble::rownames_to_column(var = "model") %>%
filter(grepl(x = model, pattern = "Merc")) %>%
group_by(am) %>%
summarise(meanMPG = mean(mpg))
我有兴趣根据applyFilter 的值有条件地应用filter。
解决方案
对于applyFilter <- 1,使用"Merc" 字符串过滤行,不返回过滤器所有行。
applyFilter <- 1
mtcars %>%
tibble::rownames_to_column(var = "model") %>%
filter(model %in%
if (applyFilter) {
rownames(mtcars)[grepl(x = rownames(mtcars), pattern = "Merc")]
} else
{
rownames(mtcars)
}) %>%
group_by(am) %>%
summarise(meanMPG = mean(mpg))
问题
建议的解决方案效率低下,因为总是评估 ifelse 调用;一种更理想的方法只会评估applyFilter <- 1 的filter 步骤。
尝试
低效的工作解决方案如下所示:
mtcars %>%
tibble::rownames_to_column(var = "model") %>%
# Only apply filter step if condition is met
if (applyFilter) {
filter(grepl(x = model, pattern = "Merc"))
}
%>%
# Continue
group_by(am) %>%
summarise(meanMPG = mean(mpg))
当然,上面的语法是不正确的。这只是一个说明,理想的工作流程应该是什么样子。
想要的答案
-
我对创建临时对象不感兴趣;工作流程应该类似于:
startingObject %>% ... conditional filter ... final object 理想情况下,我想找到一个解决方案,我可以控制是否正在评估
filter调用
【问题讨论】:
-
基于
ifelse()的解决方案中有一个错误:ifelse(1, rownames(mtcars)[grepl(x = rownames(mtcars), pattern = "Merc")], rownames(mtcars))给出了[1] "Merc 240D",而不是预期的[1] "Merc 240D" "Merc 230" "Merc 280" "Merc 280C" "Merc 450SE" [6] "Merc 450SL" "Merc 450SLC"。ifelse()的值与test的长度相同。例如,ifelse(c(T, F), 1:3, 4:9)给出了[1] 1 5并且没有警告出现了什么问题。 -
@Aurèle 谢谢,已修复。
标签: r dplyr conditional workflow pipeline