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

按顺序获取每次运行或序列的最大值

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

    我试图获得指标每段的最大值,或重复值。

    A = c(28, 20, 23, 30, 26, 23, 25, 26, 27, 25, 30, 26, 25, 22, 24, 25, 24, 27, 29)
    B = c(0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1)
    
    
    df <- as.data.frame(cbind(A, B))
    df
    A B
    28 0
    20 1
    23 1
    30 0
    26 0
    23 1
    25 1
    26 1
    27 0
    25 0
    30 1
    26 1
    25 1
    22 0
    24 1
    25 0
    24 0
    27 0
    29 1
    

    对于B列中的每组或1的延伸,我想在A列中找到最大值。最大值列可以是A的指示器,它是A中的最大值或实际值,对于B的其他值,它可以是NA或0。

    A B  max
    28 0 0
    20 1 0
    23 1 1
    30 0 0
    26 0 0
    23 1 0
    25 1 0
    26 1 1
    27 0 0
    25 0 0
    30 1 1
    26 1 0
    25 1 0
    22 0 0
    24 1 1
    25 0 0
    24 0 0
    27 0 0
    29 1 1
    

    另外,如果这个问题的标题有任何改进,请告诉我。

    2 回复  |  直到 8 年前
        1
  •  3
  •   akrun    8 年前

    一种选择是 data.table

    library(data.table)
    setDT(df)[, Max := +((A== max(A)) & B), rleid(B) ]
    df
    #     A B Max
    # 1: 28 0   0
    # 2: 20 1   0
    # 3: 23 1   1
    # 4: 30 0   0
    # 5: 26 0   0
    # 6: 23 1   0
    # 7: 25 1   0
    # 8: 26 1   1
    # 9: 27 0   0
    #10: 25 0   0
    #11: 30 1   1
    #12: 26 1   0
    #13: 25 1   0
    #14: 22 0   0
    #15: 24 1   1
    #16: 25 0   0
    #17: 24 0   0
    #18: 27 0   0
    #19: 29 1   1
    

    或者正如@Frank提到的,为了提高效率,我们可以利用 gmax

    DT[, MA := max(A), by=rleid(B)][A == MA & B, Max := 1L][]
    
        2
  •  1
  •   pogibas    8 年前

    解决方案使用 dplyr

    library(dplyr)
    df %>% 
        group_by(with(rle(B), rep(seq_along(lengths), lengths))) %>% 
        mutate(MAX = ifelse(B == 0, 0, as.numeric(A == max(A)))) %>% 
        .[, c(1, 2, 4)]
    
           A     B   MAX
       <dbl> <dbl> <dbl>
     1    28     0     0
     2    20     1     0
     3    23     1     1
     4    30     0     0
     5    26     0     0
     6    23     1     0
     7    25     1     0
     8    26     1     1
     9    27     0     0
    10    25     0     0
    11    30     1     1
    12    26     1     0
    13    25     1     0
    14    22     0     0
    15    24     1     1
    16    25     0     0
    17    24     0     0
    18    27     0     0
    19    29     1     1