Как отфильтровать фрейм данных на основе нескольких условий с другим фреймом данных - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть данные вызова - позвоните по номеру total_call, в котором хранятся все звонки, сделанные на наши телефонные номера и с них. Этот фрейм данных содержит call_id, номер звонящего и номер получателя, дата и время получения.

Имена столбцов перечислены соответственно следующим образом:

# total_call data
call_id | from_number | to_number | retrieved_date
1         1              2          2020-01-12 12:03:34
2         2              1          2020-01-12 12:06:34
3         1              3          2020-01-15 13:02:40
4         2              1          2020-01-15 13:05:40 

Второй имеющийся у меня фрейм данных - это missed_call данные, отфильтрованные по первому. Он имеет те же имена столбцов, что и первый, но в поле to_number это просто наши номера телефонов. У меня есть способ узнать, какой звонок поступил от наших клиентов и наоборот.

# missed_call data
call_id | from_number | to_number | retrieved_date
1         1              2          2020-01-12 12:03:34
3         1              3          2020-01-15 13:02:40

Теперь мне нужно узнать, был ли перезвонил пропущенный звонок или нет. Мое решение сопоставляет from_number данных missed_call с to_number данных total_call и ограничивает разницу между этими двумя retrieved_date максимум 2 часами. Я пытался объединить эти фреймы данных, затем использовал ifelse , но было много повторяющихся наблюдений за телефонными номерами, из-за которых процесс слияния был неверным.

# After merging, i have this (f_num: from_number; t_num: to_number)
f_num|call_id.x|t_num.x|retrieved_date.x   |call_id.y|f_num.y|retrieved_date.y
1     1         2       2020-01-12 12:03:34 2         2       2020-01-12 12:06:34
1     1         2       2020-01-12 12:03:34 4         2       2020-01-15 13:05:40  
1     3         3       2020-01-15 13:02:40 2         2       2020-01-12 12:06:34
1     3         3       2020-01-15 13:02:40 4         2       2020-01-15 13:05:40
# This is what i need
f_num|call_id.x|t_num.x|retrieved_date.x   |call_id.y|f_num.y|retrieved_date.y
1     1         2       2020-01-12 12:03:34 2         2       2020-01-12 12:06:34
1     3         3       2020-01-15 13:02:40 4         2       2020-01-15 13:05:40

Что может я делаю, чтобы отфильтровать данные, чтобы получить то, что я хочу? Большое спасибо.

1 Ответ

0 голосов
/ 26 февраля 2020

Пропущенный звонок - это когда клиент звонит на твой номер, верно? Если это так, я бы сделал:

library(tidyverse)
called_back <- missed_call %>%
  inner_join(total_call, by = c("from_number" = "to_number"), 
             suffix = c("_from_missed_call" , "_from_total_call)

# Then create a variable with the time difference and filter accordingly
called_back %>%
   mutate(time_difference = as.numeric(difftime(retrieved_date_from_missed_call, retrieved_date_from_total_call) %>%
filter(time_difference <= 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...