создать пошаговую последовательность для дубликатов по количеству - PullRequest
1 голос
/ 06 марта 2019

У меня есть фрейм данных

library(data.table)
dt <- data.table(Customer = c("a", "a", "c"), 
  count = c(3, 4, 5), 
  Date = c("2019-02-01","2019-05-01","2019-10-01"))
  Customer count       Date
1:        a     3 2019-02-01
2:        a     4 2019-05-01
3:        c     5 2019-10-01

Я реплицирую этот фрейм данных путем подсчета, используя:

dt[rep(seq(1, nrow(dt)), dt$count)]
    Customer count       Date
 1:        a     3 2019-02-01
 2:        a     3 2019-02-01
 3:        a     3 2019-02-01
 4:        a     4 2019-05-01
 5:        a     4 2019-05-01
 6:        a     4 2019-05-01
 7:        a     4 2019-05-01
 8:        c     5 2019-10-01
 9:        c     5 2019-10-01
10:        c     5 2019-10-01
11:        c     5 2019-10-01
12:        c     5 2019-10-01

и далее с помощью months для увеличения поля месяца

dt %>%
  group_by(Customer) %>%
  mutate(Date = as.Date(Date[1]) + months(seq(0, length.out = n(), by = 3)))
  Customer count Date      
   <chr>    <dbl> <date>    
 1 a            3 2019-02-01
 2 a            3 2019-05-01
 3 a            3 2019-08-01
 4 a            4 2019-11-01
 5 a            4 2020-02-01
 6 a            4 2020-05-01
 7 a            4 2020-08-01
 8 c            5 2019-10-01
 9 c            5 2020-01-01
10 c            5 2020-04-01
11 c            5 2020-07-01
12 c            5 2020-10-01

Однако дата в строке 4 является шагом 3-й строки (поскольку она сгруппирована по клиенту, и в этом случае имена клиентов совпадают). Я ищу, чтобы получить вывод, который начинается на «2019-05-01», который является исходной датой против исходного фрейма данных. Поэтому я надеюсь получить что-то вроде этого:

  Customer count Date      
   <chr>    <dbl> <date>    
 1 a            3 2019-02-01
 2 a            3 2019-05-01
 3 a            3 2019-08-01
 4 a            4 2019-05-01
 5 a            4 2019-08-01
 6 a            4 2019-11-01
 7 a            4 2020-02-01
 8 c            5 2019-10-01
 9 c            5 2020-01-01
10 c            5 2020-04-01
11 c            5 2020-07-01
12 c            5 2020-10-01

1 Ответ

1 голос
/ 06 марта 2019

Я думаю, что добавление номера строки и группировка по нему должны работать:

dt %>% mutate(Date = as.Date(Date), rn = row_number()) %>% 
  slice(rep(row_number(), count)) %>%
  group_by(Customer, rn) %>%
  mutate(Date = seq(first(Date), by="3 months", length.out=n()))

# A tibble: 12 x 4
# Groups:   Customer, rn [3]
   Customer count Date          rn
   <chr>    <dbl> <date>     <int>
 1 a            3 2019-02-01     1
 2 a            3 2019-05-01     1
 3 a            3 2019-08-01     1
 4 a            4 2019-05-01     2
 5 a            4 2019-08-01     2
 6 a            4 2019-11-01     2
 7 a            4 2020-02-01     2
 8 c            5 2019-10-01     3
 9 c            5 2020-01-01     3
10 c            5 2020-04-01     3
11 c            5 2020-07-01     3
12 c            5 2020-10-01     3

Кстати, вот аналог data.table:

dt[, Date := as.IDate(Date)][, rn := .I]
res <- dt[rep(1:.N, count)][, 
  Date := seq(first(Date), by="3 months", length.out=.N)
, by=.(Customer, rn)][]

    Customer count       Date rn
 1:        a     3 2019-02-01  1
 2:        a     3 2019-05-01  1
 3:        a     3 2019-08-01  1
 4:        a     4 2019-05-01  2
 5:        a     4 2019-08-01  2
 6:        a     4 2019-11-01  2
 7:        a     4 2020-02-01  2
 8:        c     5 2019-10-01  3
 9:        c     5 2020-01-01  3
10:        c     5 2020-04-01  3
11:        c     5 2020-07-01  3
12:        c     5 2020-10-01  3

или более кратко (невозможно)с обычными глаголами dplyr):

dt[, Date := as.IDate(Date)][, rn := .I]
dt[, 
  .(Customer, count, Date = seq(first(Date), length.out=count, by="3 months"))
, by=.(rn)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...