代码之家  ›  专栏  ›  技术社区  ›  Alexander

分组数据中的记录编号

  •  1
  • Alexander  · 技术社区  · 8 年前

    当某些条件匹配时,我需要给唱片贴上标签。 例如,当 sw1=='q' &安培 type=='good' 它是一个 record_1 记录1 需要重复直到下一次击中 sw1='q' &安培 类型=‘好’ 是的。

    这就是我的意思

    df <- data.frame(gr = rep(letters[1:2],each=8), 
                 sw1=rep(c(letters[17:20],sw2=letters[c(17,21,17,23)]),2),
    
                 type =c(c("good", "bad",'Visky','Wine',"good", "good","Visky","bad"),c("good","Wine","Visky","bad","good","Visky","good","bad")))
    
        gr sw1  type
    1   a   q  good   #record 1
    2   a   r   bad
    3   a   s Visky
    4   a   t  Wine
    5   a   q  good   #record 2
    6   a   u  good
    7   a   q Visky
    8   a   w   bad
    9   b   q  good   #record 1
    10  b   r  Wine
    11  b   s Visky
    12  b   t   bad
    13  b   q  good   #record 2
    14  b   u Visky
    15  b   q  good   #record 3
    16  b   w   bad
    

    所以我试着跟着

    library(dplyr)
    
    
    df%>%
      group_by(gr)%>%
      mutate(label=cummax(type=="good"&sw1=="q"))
    

    哪些输出

    # A tibble: 16 x 4
    # Groups:   gr [2]
       gr    sw1   type  label
       <fct> <fct> <fct> <int>
     1 a     q     good      1
     2 a     r     bad       1
     3 a     s     Visky     1
     4 a     t     Wine      1
     5 a     q     good      1
     6 a     u     good      1
     7 a     q     Visky     1
     8 a     w     bad       1
     9 b     q     good      1
    10 b     r     Wine      1
    11 b     s     Visky     1
    12 b     t     bad       1
    13 b     q     good      1
    14 b     u     Visky     1
    15 b     q     good      1
    16 b     w     bad       1
    

    但预期的产出是

       gr    sw1   type  label   record
     1 a     q     good      1   record_1
     2 a     r     bad       1   record_1 
     3 a     s     Visky     1   record_1
     4 a     t     Wine      1   record_1
     5 a     q     good      2   record_2 
     6 a     u     good      2   record_2
     7 a     q     Visky     2   record_2
     8 a     w     bad       2   record_2
     9 b     q     good      1   record_1
    10 b     r     Wine      1   record_1
    11 b     s     Visky     1   record_1
    12 b     t     bad       1   record_1
    13 b     q     good      2   record_2
    14 b     u     Visky     2   record_2
    15 b     q     good      3   record_3
    16 b     w     bad       3   record_3
    

    忘了说我也试过 dense_rank 但产出甚至还没有接近预期的产出。

    2 回复  |  直到 8 年前
        1
  •  1
  •   PKumar    8 年前

    你应该用 cumsum 如下所示:

    library(tidyverse)
    
    df%>%
        group_by(gr)%>%
        mutate(label=cumsum(type=="good"&sw1=="q")+0L,
               record = paste0("record_",label))
    
        2
  •  1
  •   MKR    8 年前

    您可以尝试:

    library(dplyr)
    
    
    df%>%
      group_by(gr)%>%
      mutate(label=cumsum(type=="good"&sw1=="q"))
    
    推荐文章