2015-06-29 2 views
0

Я пишу функцию для агрегирования кадра данных, и она должна быть в целом применима к широкому спектру наборов данных. Одним из шагов этой функции является функция filter dplyr, используемая для выбора из данных только типов рекламной кампании, соответствующих задаче. Поскольку мне нужна функция должна быть гибкой, я хочу 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")) 

Я думаю, что выше будет работать, но в то время как он работает, как ни странно это возвращает только малую долю того, что должен быть фильтрованный набор данных. Есть лучший способ сделать это?

Другой крошечный пример сменного кода:

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 

ответ

5

Для нескольких критериев использования %in% функция:

filter(data, ad_types %in% c("a", "b", "d")) 

вы можете также использовать "не в" критерия:

filter(data, !(ad_types %in% c("a", "b", "d"))) 

Однако обратите внимание, что поведение %in% немного отличается от ==:

> c(2, NA) == 2 
[1] TRUE NA 
> c(2, NA) %in% 2 
[1] TRUE FALSE 

некоторые находят один из тех, кто более интуитивным, чем другие, но вы должны помнить о разнице.

Что касается использования нескольких различных критериев просто использовать цепочки критериев с и/или заявления:

filter(mtcars, cyl > 2 & wt < 2.5 & gear == 4) 
0

Тим является правильным для фильтрации dataframe. Однако, если вы хотите сделать функцию с dplyr, вам необходимо следовать инструкциям на этой веб-странице: https://rpubs.com/hadley/dplyr-programming.

Код, который я бы предложил.

library(tidyverse) 
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) 
df <- data_frame(ad_types = as.factor(ad_types), revenue = revenue) 

aggregate_data <- function(df, ad_types, my_list) { 
     ad_types = enquo(ad_types) # Make ad_types a quosure 
     df %>% 
      filter(UQ(ad_types) %in% my_list) # Unquosure 
} 

new_data <- aggregate_data(df = df, ad_types = ad_types, 
          my_list = c("a", "b", "c")) 

Это должно сработать!

Смежные вопросы