как заполнить отсутствующую категорию 0 с помощью dplyr - PullRequest
0 голосов
/ 18 октября 2019

У меня есть набор данных, как показано ниже. Есть 4 периода. P1-P4. Для segment A нет продаж в P3. поэтому P3 отсутствует для A. В segment B нет продаж в P2, поэтому P2 отсутствует для B.

data.frame(period = c('P1', 'P2',  'P4', 'P1', 'P3', 'P4'),
           seg = c('A', 'A', 'A', 'B', 'B', 'B'),
           sales = c(100, 200, 150, 450, 333, 832))


period seg  sales
P1     A    100     
P2     A    200     
P4     A    150     
P1     B    450     
P3     B    333     
P4     B    832 

Мне нужно заполнить пропущенный период 0 для каждого сегмента. Как мне сгенерировать набор данных, как показано ниже:

   period seg  sales
    P1     A    100     
    P2     A    200
    P3     A     0      
    P4     A    150     
    P1     B    450
    P2     B    0       
    P3     B    333     
    P4     B    832 

Ответы [ 2 ]

3 голосов
/ 18 октября 2019

Вот один вариант с complete после группировки по 'seg'

library(dplyr)
library(tidyr)
un1 <- as.character(unique(df1$period))
df1 %>%
   group_by(seg) %>%
   complete(period = un1, fill = list(sales = 0))
# A tibble: 8 x 3
# Groups:   seg [2]
#  seg   period sales
#  <fct> <chr>  <dbl>
#1 A     P1       100
#2 A     P2       200
#3 A     P3         0
#4 A     P4       150
#5 B     P1       450
#6 B     P2         0
#7 B     P3       333
#8 B     P4       832

data

df1 <- data.frame(period = c('P1', 'P2',  'P4', 'P1', 'P3', 'P4'),
           seg = c('A', 'A', 'A', 'B', 'B', 'B'),
           sales = c(100, 200, 150, 450, 333, 832))
1 голос
/ 18 октября 2019

Поворот к широкоформатному формату и обратно к длинному формату

library(dplyr)
library(tidyr)
df1 %>%
    spread(period, sales, fill = 0) %>%
    gather(period, sales, -seg) %>%
    arrange(seg, period)
#  seg period sales
#1   A     P1   100
#2   A     P2   200
#3   A     P3     0
#4   A     P4   150
#5   B     P1   450
#6   B     P2     0
#7   B     P3   333
#8   B     P4   832
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...