【问题标题】:How to give seq number with condition by ID如何通过 ID 给出带有条件的序列号
【发布时间】:2019-07-26 14:24:16
【问题描述】:

type$AAID 出来之前,我会尝试给出相同的 seq_number

我试过了

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")

【问题讨论】:

  • 也许是dt_1[, seq := cumsum(type=="AA"), by=.(ID)]
  • dt_1$seq &lt;- with(dt_1, ave(type == "AA", ID, FUN = cumsum)) 使用基数 R。

标签: r data.table conditional-statements seq


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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")) 相当于代码DT[, N := seq_len(.N), by=c("x", "y")] 中的N 列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      • 2022-01-06
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      相关资源
      最近更新 更多