R - поднабор по статусу столбца и подсчет уникальных записей в другом кадре данных - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть набор данных, который выглядит следующим образом:

customer_id    group_a    group_b    group_c    group_d
123            true       false      true       false
456            false      true       false      true
789            false      true       true       false

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

customer_id    date
123            01/01/2019
123            01/02/2019
123            01/03/2019
123            01/04/2019
123            01/04/2019  

456            01/01/2019
456            01/02/2019
456            01/03/2019

789            01/01/2019
789            01/03/2019
789            01/03/2019

Я хотел бы иметь возможность получить количество уникальных записей по дате для каждой групповой итерации, где клиент "истинен", и общее количество клиентов для каждой группы . Результат которого будет выглядеть так:

date         group    record   total
01/01/2019   a        1        1
01/02/2019   a        1        1
01/03/2019   a        1        1
01/04/2019   a        1        1

01/01/2019   b        2        2
01/02/2019   b        1        2
01/03/2019   b        2        2
01/04/2019   b        0        2

01/01/2019   c        2        2
01/02/2019   c        1        2
01/03/2019   c        2        2
01/04/2019   c        1        2

01/01/2019   d        1        1
01/02/2019   d        1        1
01/03/2019   d        1        1
01/04/2019   d        0        1

1 Ответ

1 голос
/ 03 апреля 2019

Не думаю, что это очень элегантно, но результат соответствует ожидаемому результату, поэтому: Вот оно.


library(lubridate)
library(dplyr)
library(tidyr)

df2$date <- mdy(df2$date)

df2 %>% 
  inner_join(df1, by = "customer_id", copy = TRUE) %>%
  gather(key = "group", value = "member", group_a:group_d) %>%
  filter(member == "true") %>% 
  complete(date, group) %>%
  select(date, group, customer_id) ->  df3

df3 %>%
  group_by(group, date) %>% 
  summarise(record = n_distinct(customer_id, na.rm = TRUE)) %>% 
  left_join( df3 %>%
             group_by(group) %>%
             summarise(total = n_distinct(customer_id, na.rm = TRUE)),
             by = "group") %>% ungroup() %>%
  select(date, group, record, total) -> result

, что дает:

# A tibble: 16 x 4
   date       group   record total
   <date>     <chr>    <int> <int>
 1 2019-01-01 group_a      1     1
 2 2019-01-02 group_a      1     1
 3 2019-01-03 group_a      1     1
 4 2019-01-04 group_a      1     1
 5 2019-01-01 group_b      2     2
 6 2019-01-02 group_b      1     2
 7 2019-01-03 group_b      2     2
 8 2019-01-04 group_b      0     2
 9 2019-01-01 group_c      2     2
10 2019-01-02 group_c      1     2
11 2019-01-03 group_c      2     2
12 2019-01-04 group_c      1     2
13 2019-01-01 group_d      1     1
14 2019-01-02 group_d      1     1
15 2019-01-03 group_d      1     1
16 2019-01-04 group_d      0     1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...