Проверьте, существует ли значение в определенной группе строк в кадре данных - PullRequest
1 голос
/ 05 апреля 2019

У меня есть этот фрейм данных (df):

structure(list(from = c("(192) 242-2345", NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "(832) 345-3168", 
NA, NA), to = c("(900) 301-3451", NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "(900) 234-1231", 
NA, NA), action_result = c("Voicemail", "No Answer", "No Answer", 
"No Answer", "No Answer", "No Answer", "No Answer", "No Answer", 
"No Answer", "IP Phone Offline", "No Answer", "No Answer", "Busy", 
"Busy", "No Answer", "No Answer", "No Answer", "No Answer", "No Answer", 
"No Answer", "No Answer", "Busy", "IP Phone Offline", "Busy", 
"No Answer", "No Answer", "No Answer", "No Answer", "No Answer", 
"IP Phone Offline", "IP Phone Offline", "No Answer", "No Answer", 
"IP Phone Offline", "No Answer", "No Answer", "Busy", "Missed", 
"Hang Up", "Hang Up")), class = c("spec_tbl_df", "tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -40L))

Первая строка содержит номера телефонов, которые сделали вызов и получили вызов.Затем строки, идущие после первой строки, являются значениями NA.Таким образом, строки 1-37 рассматриваются как одна группа, а строки с 38 по 40 считаются второй группой.Я хотел бы проверить, содержит ли каждая группа значение Call Connected в столбце action_result.

Я пробовал group_by значения from и to, но весь набор данных, с которым я работаю, содержит повторяющиеся пары значений from и to, так что это неРабота.Мне бы хотелось, чтобы решение dplyr проверило, содержат ли первые 37 строк Call Connected, и выдает кадр данных со столбцами:

from, to, CallConnected, где CallConnected равно 1для Да и 0 для Нет.

S0, глядя на df, результирующий набор данных будет иметь 2 строки:

from          | to           | CallConnected
--------------------------------------------------
(192) 242-2345|(900) 301-3451| 0
(832) 345-3168|(900) 234-1231| 0

1 Ответ

2 голосов
/ 05 апреля 2019

Решение, использующее пакет tidyverse, или вы можете просто загрузить пакеты dplyr и tidyr для достижения этого.

Идея состоит в том, чтобы заполнить NA ближайшимне-значение NA в столбцах from и to.После этого используйте action_result == "CallConnected", чтобы проверить, есть ли элементы, соответствующие "CallConnected", сгруппируйте по from и to и summarize с sum, чтобы подсчитать общее количество совпадающих записей.

library(tidyverse)

df2 <- df %>%
  fill(from) %>%
  fill(to) %>%
  mutate(CallConnected = action_result == "CallConnected") %>%
  group_by(from, to) %>%
  summarize(CallConnected = sum(CallConnected)) %>%
  ungroup()
df2
# # A tibble: 2 x 3
#   from           to             CallConnected
#   <chr>          <chr>                  <int>
# 1 (192) 242-2345 (900) 301-3451             0
# 2 (832) 345-3168 (900) 234-1231             0

Обновление

Если возникают проблемы с дубликатами, мы можем использовать rleid из пакета data.table для создания идентификатора после функции fill.Ниже приведен пример.

library(tidyverse)
library(data.table)

# Create an example with duplication
df_dup <- bind_rows(df, df %>% slice(1:5))

df_dup2 <- df_dup %>%
  fill(from) %>%
  fill(to) %>%
  mutate(ID = rleid(from, to)) %>%
  mutate(CallConnected = action_result == "CallConnected") %>%
  group_by(ID, from, to) %>%
  summarize(CallConnected = sum(CallConnected)) %>%
  ungroup()
df_dup2
# # A tibble: 3 x 4
#      ID from           to             CallConnected
#   <int> <chr>          <chr>                  <int>
# 1     1 (192) 242-2345 (900) 301-3451             0
# 2     2 (832) 345-3168 (900) 234-1231             0
# 3     3 (192) 242-2345 (900) 301-3451             0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...