Получить все строки для определенного текста после группировки по приложению и идентификатору пользователя - PullRequest
0 голосов
/ 21 ноября 2018

Когда пользователь завершает шаг, цифровой столбец is_digitally_signed изменяется на YES.Что я пытаюсь сделать: если какой-либо шаг завершен в цифровом виде, я хочу получить все строки для одинаковых application_id и user_id.Пожалуйста, проверьте под моим желаемым выводом.

R код для репликации моего набора данных

df <- data.table(application_id = c(1,1,1,2,2,2,3,3,3), 
                 user_id = c(123,123,123,456,456,456,789,789,789), 
                 application_status = c("incomplete", "details_verified", "complete"),
                 date = c("01/01/2018", "02/01/2018", "03/01/2018"),
                 is_digitally_signed = c("NULL", "NULL", "YES", "NULL", "NULL", "NULL", "NULL", "YES", "NULL")) %>%
  mutate(date = as.Date(date, "%d/%m/%Y"))

С выводом

df
  application_id user_id application_status       date is_digitally_signed
              1     123         incomplete  2018-01-01                NULL
              1     123   details_verified  2018-01-02                NULL
              1     123           complete  2018-01-03                 YES
              2     456         incomplete  2018-01-01                NULL
              2     456   details_verified  2018-01-02                NULL
              2     456           complete  2018-01-03                NULL
              3     789         incomplete  2018-01-01                NULL
              3     789   details_verified  2018-01-02                 YES
              3     789           complete  2018-01-03                NULL

Мои (неудачные) усилия

df %>% group_by(application_id,user_id) %>% filter_all(all.vars(. == "YES"))

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

application_id user_id application_status       date is_digitally_signed
              1     123         incomplete 2018-01-01                NULL
              1     123   details_verified 2018-01-02                NULL
              1     123           complete 2018-01-03                 YES
              3     789         incomplete 2018-01-01                NULL
              3     789   details_verified 2018-01-02                 YES
              3     789           complete 2018-01-03                NULL

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Поскольку существует только один столбец для тестирования, мы можем просто использовать filter с any

library(dplyr)
df %>% 
   group_by(application_id,user_id) %>% 
    filter(any(is_digitally_signed  == "YES"))
# A tibble: 6 x 5
# Groups:   application_id, user_id [2]
#  application_id user_id application_status date       is_digitally_signed
#           <dbl>   <dbl> <chr>              <date>     <chr>              
#1              1     123 incomplete         2018-01-01 NULL               
#2              1     123 details_verified   2018-01-02 NULL               
#3              1     123 complete           2018-01-03 YES                
#4              3     789 incomplete         2018-01-01 NULL               
#5              3     789 details_verified   2018-01-02 YES                
#6              3     789 complete           2018-01-03 NULL               

Или другой вариант использует %in% для возврата одного TRUE/FALSE вывод, который перерабатывается

df %>% 
   group_by(application_id,user_id) %>% 
   filter("YES" %in% is_digitally_signed)

Или мы можем использовать base R

df[with(df, ave(is_digitally_signed == "YES", application_id,user_id, FUN = any)),]
0 голосов
/ 21 ноября 2018

dplyr

Мы можем использовать filter с any, который проверяет для данной группы, существует ли хотя бы одна запись с is_digitally_signed == 'YES':

library(dplyr)

df %>% 
  group_by(application_id, user_id) %>%
  filter(any(is_digitally_signed == "YES"))

или использоватьфункция all для поднабора групп, где не все is_digitally_signed == "NULL":

df %>% 
  group_by(application_id, user_id) %>%
  filter(!all(is_digitally_signed == "NULL"))

data.table

Мы также можем использовать data.table, так как вы уже загрузили свои данные какDT:

library(data.table)
dt = setDT(df)
dt[dt[,.I[any(is_digitally_signed == "YES")], by=.(application_id, user_id)]$V1,]

или .SD:

dt[,.SD[any(is_digitally_signed == "YES")], by=.(application_id, user_id)]

Выход:

# A tibble: 6 x 5
# Groups:   application_id, user_id [2]
  application_id user_id application_status date       is_digitally_signed
           <dbl>   <dbl> <fct>              <date>     <fct>              
1              1     123 incomplete         2018-01-01 NULL               
2              1     123 details_verified   2018-01-02 NULL               
3              1     123 complete           2018-01-03 YES                
4              3     789 incomplete         2018-01-01 NULL               
5              3     789 details_verified   2018-01-02 YES                
6              3     789 complete           2018-01-03 NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...