2016-07-21 2 views
0

Я хотел бы сделать эквивалент следующего SQL запроса в R с dplyr:dplyr мин на конкретные значения

SELECT 
    user_id, 
    min(case when product = 'ProductA' then purchase_date end) AS min_purchase_date_product_A, 
    min(case when product = 'ProductB' then purchase_date end) AS min_purchase_date_product_B 
FROM fact_purchase 
GROUP BY user_id; 

Я думаю, что нужно было бы использовать функцию min() в сочетании с which() (см предложение ниже), но синтаксис неправильный, и я не знаю, как объединить эти две функции!

min_purchase_dates_per_product = 
fact_purchase %>% 
group_by(user_id) %>% 
mutate(
min_purchase_date_product_A = min(which(product == 'ProductA')), 
min_purchase_date_product_B = min(which(product == 'ProductB')) 
) 

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

+0

Добро пожаловать в StackOverflow. Пожалуйста, предоставьте [MCVE] –

ответ

0

Идея заключается в том, чтобы группе как пользователя, так и продукта:

min_purchase_dates_per_product <- 
    fact_purchase %>% 
    group_by(user_id, product) %>% 
    summarize(min(x)) 

Я поставил x в качестве переменной, минимум которой мы пытаемся найти.

Вы можете позже присоединиться к этому исходному фрейму данных на user_id, если это необходимо.

0

Как @ луис-usier предложил вам необходимо (также в вашем SQL) группа пользователя и продукт:

библиотеки (dplyr)

productTable <- data.frame(user = sample(1:2, size = 10, replace = T), 
          product = paste0("p", sample(1:2, size = 10, replace = T)), 
          purchaseDate = sample(seq(as.Date('2016/01/01'), as.Date('2016/07/01'), by="day"), 10)) 
productTable 
productTable %>% 
    group_by(user, product) %>% 
    summarise(minPurchase = min(purchaseDate)) 

как таковых данные остается аккуратным! Если вам действительно нужно, чтобы преобразовать данные в матрицу переменных, то вы можете использовать tidyr:

productTable %>% 
    group_by(user, product) %>% 
    summarise(minPurchase = min(purchaseDate)) %>% 
    tidyr::spread(key = "product", value = "minPurchase") 
Смежные вопросы