获取每次运行的最大值或序列中的系列

时间:2017-09-08 14:04:32

标签: r dplyr grouping

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

以下是一个例子:

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

对于BI列中的每个组或1段,希望在A列中找到最大值。最大列可以是A的最大值或A中的实际值,并且是NA或0代表B的其他值。

我希望的输出看起来像这样:

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

我尝试在B列的每个部分生成组= 1但我没有走得太远因为大多数分组函数需要组之间的唯一值。

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

2 个答案:

答案 0 :(得分:3)

一个选项是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][]

答案 1 :(得分:1)

使用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