как дать следующий номер с условием по ID - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь дать тот же seq_number, пока type$AA не появится ID

Я пытался

dt_1[seq:=seq(.N),by=c("ID","type")] 

, но это не работает.Есть ли способ дать seq, как это?

dt_1<-fread("ID    type
         1        AA
         1        B
         1        C
         1        D
         1        AA
         1        B
         1        D
         1        AA
         1        C
         2        AA
         2        C
         2        F
         2        D
         3        AA
         3        E
         3        C")


dt_2<-fread("ID    type   seq
         1        AA     1
          1        B     1
          1        C     1
          1        D     1
          1        AA    2
          1        B     2
          1        D     2
          1        AA    3
          1        C     3
          2        AA    1
          2        C     1
          2        F     1
          2        D     1
          3        AA    1
          3        E     1
          3        C     1")

Ответы [ 2 ]

0 голосов
/ 05 марта 2019
Подход

data.table с использованием rowidv()

dt_1[, seq := rowidv( dt_1, cols= c( "ID", "type" ) ) ][]

#     ID type seq
#  1:  1   AA   1
#  2:  1    B   1
#  3:  1    C   1
#  4:  1    D   1
#  5:  1   AA   2
#  6:  1    B   2
#  7:  1    D   2
#  8:  1   AA   3
#  9:  1    C   2
# 10:  2   AA   1
# 11:  2    C   1
# 12:  2    F   1
# 13:  2    D   1
# 14:  3   AA   1
# 15:  3    E   1
# 16:  3    C   1

из файла справки: rowidv(DT, cols=c("x", "y")) эквивалентен столбцу N в коде DT[, N := seq_len(.N), by=c("x", "y")].

0 голосов
/ 05 марта 2019

A dplyr способ:

> dt_1 %>%
+   group_by(ID) %>%
+   mutate(seq = cumsum(type == "AA"))
# A tibble: 16 x 3
# Groups:   ID [3]
      ID type    seq
   <int> <chr> <dbl>
 1     1 AA        1
 2     1 B         1
 3     1 C         1
 4     1 D         1
 5     1 AA        2
 6     1 B         2
 7     1 D         2
 8     1 AA        3
 9     1 C         3
10     2 AA        1
11     2 C         1
12     2 F         1
13     2 D         1
14     3 AA        1
15     3 E         1
16     3 C         1
...