Создать последовательность чисел, увеличивающуюся после n строк по группам в R data.table - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть data.table вот так:

        customer_id account_id       time count
 1:           1        AAA 2000-01-01     0
 2:           1        AAA 2000-02-01     1
 3:           1        AAA 2000-03-01     2
 4:           1        AAA 2000-04-01     3
 5:           1        AAA 2000-05-01     4
 6:           1        AAA 2000-06-01     5
 7:           1        AAA 2000-07-01     6
 8:           1        AAA 2000-08-01     7
 9:           2        BBB 2008-01-01     0
10:           2        BBB 2008-02-01     1
11:           2        BBB 2008-03-01     2
12:           2        BBB 2008-04-01     3
13:           2        BBB 2008-05-01     4
14:           2        BBB 2008-06-01     5
15:           2        BBB 2008-07-01     6
16:           2        BBB 2008-08-01     7
17:           2        BBB 2008-09-01     8
18:           2        BBB 2008-10-01     9
19:           2        BBB 2008-11-01    10
20:           2        BBB 2008-12-01    11
21:           2        BBB 2009-01-01    12
22:           2        BBB 2009-02-01    13
23:           2        BBB 2009-03-01    14
24:           2        BBB 2009-04-01    15

Код для создания этой таблицы данных находится здесь:

customer_id <- c(rep(1,8), rep(2,16))
account_id <- c(rep("AAA",8), rep("BBB",16))
time <- c(seq(as.Date("2000/1/1"), by = "month", length.out = 8), 
seq(as.Date("2008/1/1"), by = "month", length.out = 16))

count <- c(seq(from = 0, to = 7), seq(from = 0, to = 15))

my_data <- data.table(customer_id,account_id,time,count)

Я хотел бы сгенерировать новую переменную с именем, например, new_var, которая будет равна 0, если переменная count находится в диапазоне от 1 до 4, 1, если count находится в диапазоне от 5 до 8, 2, если coun t между 9 и 12 и т. д. То есть к customer_id, account_id я бы хотел создать новую переменную, которая начиналась бы с 1 и увеличивалась на 1 после каждых 4 значений count. Это будет выглядеть так:

        customer_id account_id       time count new_var
 1:           1        AAA 2000-01-01     0      NA
 2:           1        AAA 2000-02-01     1       0
 3:           1        AAA 2000-03-01     2       0
 4:           1        AAA 2000-04-01     3       0
 5:           1        AAA 2000-05-01     4       0
 6:           1        AAA 2000-06-01     5       1
 7:           1        AAA 2000-07-01     6       1
 8:           1        AAA 2000-08-01     7       1
 9:           2        BBB 2008-01-01     0      NA
10:           2        BBB 2008-02-01     1       0
11:           2        BBB 2008-03-01     2       0
12:           2        BBB 2008-04-01     3       0
13:           2        BBB 2008-05-01     4       0
14:           2        BBB 2008-06-01     5       1
15:           2        BBB 2008-07-01     6       1
16:           2        BBB 2008-08-01     7       1
17:           2        BBB 2008-09-01     8       1
18:           2        BBB 2008-10-01     9       2
19:           2        BBB 2008-11-01    10       2
20:           2        BBB 2008-12-01    11       2
21:           2        BBB 2009-01-01    12       2
22:           2        BBB 2009-02-01    13       3
23:           2        BBB 2009-03-01    14       3
24:           2        BBB 2009-04-01    15       3

Для счетчика, равного 0, эта новая переменная может быть, например, NA, это не имеет значения. Есть ли способ, как сделать эту последовательность (0,0,0,0,1,1,1,1,2,2,2,2, ...) в этой таблице data.table по группе?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Вот решение исключительно в синтаксисе «data.table»:

my_data[, new_var:=ifelse(count==0, NA, floor((count-1)/4)), by=.(customer_id, account_id)]
0 голосов
/ 08 ноября 2018

Вот решение dplyr. group_by ваш customer_id, а затем просто используйте оператор ifelse в вашем mutate для генерации новой переменной.

library(dplyr)
my_data %>% group_by(customer_id,account_id) %>% mutate(new_var = ifelse(count==0,NA,floor((count-1)/4)))


# A tibble: 24 x 5
# Groups:   customer_id [2], account_id [1]
#   customer_id account_id time       count new_var
#         <dbl> <chr>      <date>     <int>   <dbl>
# 1           1 AAA        2000-01-01     0      NA
# 2           1 AAA        2000-02-01     1       0
# 3           1 AAA        2000-03-01     2       0
# 4           1 AAA        2000-04-01     3       0
# 5           1 AAA        2000-05-01     4       0
# 6           1 AAA        2000-06-01     5       1
# 7           1 AAA        2000-07-01     6       1
# 8           1 AAA        2000-08-01     7       1
# 9           2 BBB        2008-01-01     0      NA
#10           2 BBB        2008-02-01     1       0
# ... with 14 more rows
...