Проверьте, следуют ли два значения столбца в каждой группе друг за другом - PullRequest
0 голосов
/ 12 марта 2019

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

 id  date        customer_id
 1   02/03/2018   undefined
 1   04/23/2018   12
 1   05/22/2018   12
 1   06/25/2018   undefined
 2   01/14/2017   undefined
 2   02/23/2018   undefined
 2   03/04/2018   23
 2   04/04/2018   23

Я хочу сгруппировать эти данные по идентификатору и отсортировать их внутри группы по дате.Теперь вот часть, которую я не могу понять.Я хочу, чтобы был способ проверить, что для каждой отсортированной группы за значением customer_id "undefined" следуют цифры, а это означает, что в приведенном выше случае id == 2 - это то, что я хочу сохранить, поскольку у него есть "undefined" s.вместе и после этого у нас есть только номер.Идея состоит в том, что когда customer_id не определен, они не являются клиентами, но со временем, как только они становятся клиентами, «значение» меняется на число, которое является идентификатором клиента.Так что в этом случае id == 1 - плохая запись, и я хочу отменить ее и оставить только id == 2.

data %>% group_by(id) %>%
         arrange(date) %>% "code to keep only records that have all 
         the undefined in customer_id together and after only numbers,
         in this case, I want to only keep id == 2 records"

Спасибо.

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Вы можете попробовать:

library(dplyr)

df %>%
  group_by(id) %>%
  filter(all(diff(row_number()[customer_id == 'undefined']) == 1) & customer_id[n()] != 'undefined')

Вывод:

# A tibble: 4 x 3
# Groups:   id [1]
     id date       customer_id
  <int> <fct>      <fct>      
1     2 01/14/2017 undefined  
2     2 02/23/2018 undefined  
3     2 03/04/2018 23         
4     2 04/04/2018 23     

Этот код предполагает, что ваш фрейм данных уже упорядочен.В противном случае:

df %>%
  arrange(date = as.Date(date, "%m/%d/%Y")) %>%
  group_by(id) %>%
  filter(all(diff(row_number()[customer_id == 'undefined']) == 1) &
           customer_id[n()] != 'undefined')

По сути, мы проверяем для каждой группы, всегда ли различия между номерами строк для случаев undefined равны 1 (т. Е. Являются последовательными), и не является ли последнее значение undefined.

Такие записи хранятся (id 2 в вашем случае).

1 голос
/ 12 марта 2019

Этого можно добиться, проверив, имеет ли кодировка длины серии для столбца customer_id 2 или 1, что означает, что идентификатор не был определен или не определен более одного раза:

data <- read.table(text="id  date        customer_id
                   1   02/03/2018   undefined
                   1   04/23/2018   12
                   1   05/22/2018   12
                   1   06/25/2018   undefined
                   2   01/14/2017   undefined
                   2   02/23/2018   undefined
                   2   03/04/2018   23
                   2   04/04/2018   23", header = T, stringsAsFactors=F)

data$date <- as.Date(data$date, "%m/%d/%Y")
data$customer_id <- as.integer(data$customer_id)

data %>%
    dplyr::group_by(id) %>%
    dplyr::arrange(date, .by_group=T) %>% 
    dplyr::filter(length(rle(is.na(customer_id))$values < 3) && !is.na(tail(customer_id, 1))) 

# A tibble: 4 x 3
# Groups:   id [1]
     id date       customer_id
  <int> <date>           <int>
1     2 2017-01-14          NA
2     2 2018-02-23          NA
3     2 2018-03-04          23
4     2 2018-04-04          23

Обратите внимание, что вы также должны убедиться, что последний элемент каждой группы является действительным, в противном случае группы, которые переходят от действительного идентификатора к undefined, пройдут тест.

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