Набор сводных данных и имена столбцов [R] - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть набор данных, который я хочу повернуть.

enter image description here

dataset <- data.frame(date = c("01/01/2020","02/01/2020", "02/01/2020", "03/01/2020")
              , camp_type = c("acquisition", "acquisition", "newsletter", "acquisition")
              , channel_type = c("email", "direct_mail","email","email")
              , sent = c(100, 200, 50, 250)
              , open = c(30, NA, 14, 148)
              , click = c(14, NA, 1, 100)
)

ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: у меня есть гораздо больше camp_types, чем показано в этот пример.

Я хочу получать по одной строке в день, а остальную информацию - в разных столбцах, например на рисунке ниже (переименование столбцов «отправлено», «открыто» и «нажать» на основе » channel_type "и" camp_type ").

enter image description here

Я пробовал что-то не очень элегантное и полностью ручное, но при переименовании я получаю сообщение об ошибке переменные (код ниже)

dataset %>%
  filter(camp_type == 'Acquisition' & channel_type == 'direct_mail') %>%
  rename (dm_acq_sent = sent
    , dm_acq_open = open
    , dm_acq_click = clicked
  )

Проблема с приведенным выше кодом заключается в том, что (как только я исправлю проблему с переименованием), он будет в значительной степени ручным, потому что мне приходится повторять один и тот же кусок кода несколько раз, и это необходимо кто-то регулярно проверяет, что больше нет комбинаций camp_type и channel_type.

Любая помощь / совет будут высоко оценены.

1 Ответ

2 голосов
/ 27 апреля 2020

С tidyr вы можете использовать pivot_wider:

library(tidyr)

pivot_wider(df, id_cols = date, names_from = c(camp_type, channel_type), values_from = c(sent, open, click))

Выход

# A tibble: 3 x 10
  date       sent_acquisition… sent_acquisition_… sent_newsletter_… open_acquisitio… open_acquisition… open_newsletter… click_acquisiti… click_acquisitio… click_newslette…
  <date>                 <dbl>              <dbl>             <dbl>            <dbl>             <dbl>            <dbl>            <dbl>             <dbl>            <dbl>
1 2020-01-01               100                 NA                NA               30                NA               NA               14                NA               NA
2 2020-02-01                NA                200                50               NA                NA               14               NA                NA                1
3 2020-03-01               250                 NA                NA              148                NA               NA              100                NA               NA

Данные

df <- structure(list(date = structure(c(18262, 18293, 18293, 18322), class = "Date"), 
    camp_type = structure(c(1L, 1L, 2L, 1L), .Label = c("acquisition", 
    "newsletter"), class = "factor"), channel_type = structure(c(2L, 
    1L, 2L, 2L), .Label = c("direct_email", "email"), class = "factor"), 
    sent = c(100, 200, 50, 250), open = c(30, NA, 14, 148), click = c(14, 
    NA, 1, 100)), class = "data.frame", row.names = c(NA, -4L
))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...