Как группировать по customer_name и считать mail_sent? - PullRequest
1 голос
/ 24 июня 2019

Я ищу руководство для решения сценария в R, где у меня есть таблица со следующими столбцами - customer_name, zip_code, date_applied (дата их применения), date_mail_sent (дата, когда были отправлены рекламные объявления по почтеоб услуге) .

Я рассчитываю получить счетчик группы по имени клиента и количеству отправленных писем, в результате которых было получено заявление.Даты, отправленные по почте в течение 90 дней, должны быть сгруппированы.Последние из этих писем должны быть в пределах 90 дней от даты подачи заявки.

Пример набора данных:

customer_name   zip_code    date_applied    date_mail_sent
aaaa            12345           1/15/2017   4/3/2016
aaaa            12345           1/15/2017   9/15/2016
aaaa            12345           1/15/2017   12/5/2016
aaaa            12345           5/15/2017   4/1/2017
aaaa            12345           5/15/2017   4/15/2017
bbbb            45667           3/3/2017    1/2/2017
bbbb            45667           3/3/2017    2/2/2017
bbbb            45667           3/3/2017    3/2/2017
bbbb            45667           12/15/2017  6/30/2017
bbbb            45667           12/15/2017  7/30/2017

Желаемый результат:

customer_name   zip_code    date_applied    count_of_mail_sent
aaaa            12345           1/5/2016    2
aaaa            12345           5/15/2016   2
bbbb            45667           3/3/2017    3
bbbb            45667           12/15/2017  0

Ответы [ 3 ]

1 голос
/ 24 июня 2019
library(tidyverse)
library(lubridate)
df %>%
  mutate_at(vars(contains("date")), mdy) %>%
  mutate(days_prior = (date_applied - date_mail_sent) / ddays(1)) %>%
  count(customer_name, date_applied, wt = days_prior <= 90)

# A tibble: 4 x 3
  customer_name date_applied     n
  <chr>         <date>       <int>
1 aaaa          2017-01-15       2
2 aaaa          2017-05-15       2
3 bbbb          2017-03-03       3
4 bbbb          2017-12-15       0
1 голос
/ 24 июня 2019

Логически, это то же самое, что и другие опубликованные решения, преобразовать в дату, получить разницу между date_applied и date_mail_sent и найти число случаев, где разница была меньше 90, но сделать это в базе R

df[3:4] <- lapply(df[3:4], as.Date, "%m/%d/%Y")
df$is_less_than_90 <- as.numeric(df$date_applied - df$date_mail_sent, "days") <= 90

aggregate(is_less_than_90~customer_name + zip_code + date_applied, df, sum)

#  customer_name zip_code date_applied is_less_than_90
#1          aaaa    12345   2017-01-15               2
#2          bbbb    45667   2017-03-03               3
#3          aaaa    12345   2017-05-15               2
#4          bbbb    45667   2017-12-15               0
1 голос
/ 24 июня 2019

Вы можете сделать:

library(dplyr)
df %>% 
  mutate(interval = difftime(date_applied, date_mail_sent, units = "days") <= 90) %>% 
  group_by(customer_name, zip_code, date_applied) %>%
  summarise(count_of_mail_sent = sum(interval))

  customer_name zip_code date_applied count_of_mail_sent
  <fct>            <int> <date>                    <int>
1 aaaa             12345 2017-01-15                    2
2 aaaa             12345 2017-05-15                    2
3 bbbb             45667 2017-03-03                    3
4 bbbb             45667 2017-12-15                    0

Или даже:

df %>% 
  group_by(customer_name, zip_code, date_applied) %>%
  summarise(count_of_mail_sent = sum(difftime(date_applied, date_mail_sent, units = "days") <= 90))

Используемые данные:

df = read.table(text = "customer_name   zip_code    date_applied    date_mail_sent
aaaa            12345           1/15/2017   4/3/2016
aaaa            12345           1/15/2017   11/28/2016
aaaa            12345           1/15/2017   12/5/2016
aaaa            12345           5/15/2017   4/1/2017
aaaa            12345           5/15/2017   4/15/2017
bbbb            45667           3/3/2017    1/2/2017
bbbb            45667           3/3/2017    2/2/2017
bbbb            45667           3/3/2017    3/2/2017
bbbb            45667           12/15/2017  6/30/2017
bbbb            45667           12/15/2017  7/30/2017", h = T)

df$date_applied <- as.Date(df$date_applied, format = "%m/%d/%Y")
df$date_mail_sent <- as.Date(df$date_mail_sent, format = "%m/%d/%Y")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...