Я застрял с этой проблемой и не могу придумать ничего простого dplyr
, чтобы решить ее:
У меня есть два data.frames df1
и df2
. Я хочу отсортировать «cbind» значения столбца time2
от df2
до df1
, но только если совпадения user_id
и place_id
:
> head(df1)
time1 user_id place_id
1 2018-06-09 12:56:12 sdkID1 place_ID1
2 2018-06-24 05:15:07 sdkID1 place_ID1
3 2018-06-12 04:15:21 sdkID1 place_ID10
4 2018-06-12 14:56:42 sdkID1 place_ID17
5 2018-05-16 18:21:51 sdkID1 place_ID20
6 2018-07-11 12:19:27 sdkID1 place_ID21
> head(df2)
time2 user_id place_id
1 2018-06-09 13:12:39 sdkID1 place_ID1
2 2018-06-24 06:52:51 sdkID1 place_ID1
3 2018-06-12 05:50:19 sdkID1 place_ID10
4 2018-05-16 19:42:59 sdkID1 place_ID20
5 2018-07-11 12:23:44 sdkID1 place_ID21
6 2018-06-13 11:56:05 sdkID1 place_ID34
Однако у меня нет никакой переменной id
, чтобы проверить, что time2
из df2
принадлежит df1
. Чтобы оживить ситуацию, для некоторых событий у меня нет отметки времени, чтобы соответствовать df1
.
Я хочу что-то вроде:
> head(result)
time1 user_id place_id time2
1 2018-06-09 12:56:12 sdkID1 place_ID1 2018-06-09 13:12:39
2 2018-06-24 05:15:07 sdkID1 place_ID1 2018-06-24 06:52:51
3 2018-06-12 04:15:21 sdkID1 place_ID10 2018-06-12 05:50:19
4 2018-06-12 14:56:42 sdkID1 place_ID17 NA
5 2018-05-16 18:21:51 sdkID1 place_ID20 2018-05-16 19:42:59
6 2018-07-11 12:19:27 sdkID1 place_ID21 2018-07-11 12:23:44
Есть ли способ взять time2-time1
только оставить строки с
положительная разница во времени? Я знаю, что есть. Но тогда у меня есть случаи
как первые две строки, которые имеют одинаковые user_id
и place_id
и таким образом я получаю результаты 2018-06-24 06:52:51
- 2018-06-24 05:15:07
и 2018-06-24 06:52:51
- 2018-06-09 12:56:12
. Мне нужно только первое отличие.
Представьте, что время1 - это прибытие, а время2 - это отправление. В основном моя проблема сводится к тому, чтобы выяснить, какие поезда или самолеты работают. Мне нужен какой-то способ понять, что 2018-06-24 06:52:51
- 2018-06-24 05:15:07
то же самое, и что
2018-06-24 06:52:51
- 2018-06-09 12:56:12
- это не тот же поезд или самолет.
Поскольку я хочу перевести код на SQL
, решение должно основываться на dplyr
. Я пробовал что-то вроде df1 %>% group_by(user_id,place_id)
, но сейчас я определенно застрял. Вот некоторые примеры данных
set.seed(42)
u <- runif(1000, 0, 60) # "noise" to add or subtract from some timepoint
df1<-data.frame(time1=as.POSIXlt(sort(u)*100000, origin = "2018-05-03 08:00:00"),
user_id=sample(rep(paste0('sdkID',1:60)),1000,replace=TRUE),
place_id=sample(rep(paste0('place_ID',1:60)),1000,replace=TRUE))
df1=df1[order(df1$user_id,df1$place_id,df1$time1),]
df2=df1[-sample(1:1000,200),]
df2$time1<-df2$time1+u[-sample(1:1000,200)]*100
## cleaning up
colnames(df2)[1]='time2'
rownames(df1)=1:1000
rownames(df2)=1:800