Вот один из вариантов, использующий 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