Проверьте R data.frame столбец для равных значений в другом столбце - PullRequest
0 голосов
/ 29 марта 2020

Я ищу векторизованное решение следующей проблемы. Есть клиенты, которые могут иметь один или два разных продукта, x или y, одновременно. Я хотел бы идентифицировать все строки продукта x, за которыми следует продукт y для одного и того же покупателя. В этом случае to_date продукта x будет таким же, как from_date продукта y. Вот пример:

customerid = c(rep(1,2),rep(2,3))
product = c("x", "y", "x", "x", "y")
from_date = as.Date(c("2000-01-01", "2000-06-07","2001-02-01","2005-01-01","2005-11-01"))
to_date = as.Date(c("2000-06-07", "2000-10-31","2002-04-01","2005-11-01","2006-01-01"))

data.frame(customerid, product, from_date, to_date)

      customerid product  from_date    to_date
1          1       x 2000-01-01 2000-06-07
2          1       y 2000-06-07 2000-10-31
3          2       x 2001-02-01 2002-04-01
4          2       x 2005-01-01 2005-11-01
5          2       y 2005-11-01 2006-01-01

Желаемый результат будет выглядеть следующим образом:

  customerid product  from_date    to_date followed_by_y
1          1       x 2000-01-01 2000-06-07             yes
2          1       y 2000-06-07 2000-10-31             no
3          2       x 2001-02-01 2002-04-01             no
4          2       x 2005-01-01 2005-11-01             yes
5          2       y 2005-11-01 2006-01-01             no

На данный момент мой подход заключается в группировке data.frame по costumerid с помощью dplyr. Но тогда я не знаю, как проверить to_date на равные значения в from_date.

1 Ответ

1 голос
/ 29 марта 2020

Вы можете проверить все условия, как показано ниже:

library(dplyr)

df %>%
  group_by(customerid) %>%
  mutate(followed_by_y = c('no', 'yes')[(product == 'x' &
                                         lead(product) == 'y' &
                                         to_date == lead(from_date)) + 1])

Вывод:

# A tibble: 5 x 5
# Groups:   customerid [2]
  customerid product from_date  to_date    followed_by_y
       <dbl> <fct>   <date>     <date>     <chr>        
1          1 x       2000-01-01 2000-06-07 yes          
2          1 y       2000-06-07 2000-10-31 no           
3          2 x       2001-02-01 2002-04-01 no           
4          2 x       2005-01-01 2005-11-01 yes          
5          2 y       2005-11-01 2006-01-01 no   

Обратите внимание, это по сути то же самое, что сказать:

library(dplyr)

df %>%
  group_by(customerid) %>%
  mutate(followed_by_y = case_when(
    product == 'x' & lead(product) == 'y' & to_date == lead(from_date) ~ 'yes',
    TRUE ~ 'no')
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...