Соответствие строк на основе того же пользователя и самой последней даты - PullRequest
1 голос
/ 29 апреля 2019

У меня есть 2 разных данных (аренда и поиски). Я хочу сопоставить аренду с поиском по пользователю и времени.

Пример:

Id  Type    UserId  Time
1   Rental  1       15:35
2   Search  2       15:34
3   Search  1       15:33
4   Search  1       15:32

Я хочу найти последний запрос перед арендой, выполненный тем же пользователем.

Я хочу, чтобы результат был примерно таким.

Id  Type    UserId  Time    Search Id
1   Rental  1       15:35   3
2   Search  2       15:34   
3   Search  1       15:33   
4   Search  1       15:32   

Спасибо,

1 Ответ

0 голосов
/ 29 апреля 2019

Вот один из вариантов, использующий case_when и hm

 library(dplyr)
 library(lubridate)
 df %>% group_by(UserId) %>% 
  mutate(T = time_length(hm(Time)),   #We need time_length as hm returns a period object
         `Search Id`= case_when(
    n() >=2 & Type=='Rental' ~ Id[T==max(T[Type=='Search'])], #return the max where we have groups 
                                                  #with more than two obs and Type equal to Rental
    TRUE ~ NA_integer_
    ))


# A tibble: 4 x 6
# Groups:   UserId [2]
     Id Type   UserId Time      T `Search Id`
  <int> <chr>   <int> <chr> <dbl>       <int>
1     1 Rental      1 15:35 56100           3
2     2 Search      2 15:34 56040          NA
3     3 Search      1 15:33 55980          NA
4     4 Search      1 15:32 55920          NA

Однако я думаю, что проще разделить ваш фрейм данных на два фрейма и выполнить обычное левое или правое соединение, например,

dfren <- filter(df,Type=='Rental')
dfser <- filter(df,Type=='Search') %>% group_by(UserId) %>% 
       filter(time_length(hm(Time))==max(time_length(hm(Time)))) 

dfren %>% left_join(dfser,by='UserId', suffix = c(".Ren", ".Ser"))

  Id.Ren Type.Ren UserId Time.Ren Id.Ser Type.Ser Time.Ser
1      1   Rental      1    15:35      3   Search    15:33
...