如何通过多个灵活的条件筛选列

Dr.*_*gan 0 r function dplyr

我正在编写一个聚合数据帧的函数,它通常需要适用于各种各样的数据集.此功能的一个步骤是dplyr的filter功能,用于仅从数据中选择与手头任务相关的广告活动类型.由于我需要灵活的功能,我想要ad_campaign_types作为输入,但这会使过滤变得多毛,如下所示:

aggregate_data <- function(ad_campaign_types) {
  raw_data %>%
    filter(ad_campaign_type == ad_campaign_types) -> agg_data
  agg_data
}
new_data <- aggregate_data(ad_campaign_types = c("campaign_A", "campaign_B", "campaign_C"))
Run Code Online (Sandbox Code Playgroud)

我认为上面的方法可行,但是当它运行时,奇怪的是它只返回过滤数据集的一小部分.有一个更好的方法吗?

另一个可替换代码的小例子:

ad_types <- c("a", "a", "a", "b", "b", "c", "c", "c", "d", "d")
revenue <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
data <- as.data.frame(cbind(ad_types, revenue))

# Now, filtering to select only ad types "a", "b", and "d",
# which should leave us with only 7 values
new_data <- filter(data, ad_types == c("a", "b", "d"))
nrow(new_data)
[1] 3
Run Code Online (Sandbox Code Playgroud)

Tim*_*Tim 5

对于多个标准使用%in%功能:

filter(data, ad_types %in% c("a", "b", "d"))
Run Code Online (Sandbox Code Playgroud)

你也可以使用"不在"标准:

filter(data, !(ad_types %in% c("a", "b", "d")))
Run Code Online (Sandbox Code Playgroud)

但请注意,这种%in%行为与以下内容略有不同==:

> c(2, NA) == 2
[1] TRUE   NA
> c(2, NA) %in% 2
[1]  TRUE FALSE
Run Code Online (Sandbox Code Playgroud)

有些人发现其中一个比其他更直观,但你必须记住差异.

至于使用多个不同的标准,只需使用标准链和/或语句:

filter(mtcars, cyl > 2 & wt < 2.5 & gear == 4)
Run Code Online (Sandbox Code Playgroud)