按数据中的差距排名

时间:2017-02-10 17:24:03

标签: r dplyr

我有一个data.frame,我已经识别出有错误/缺失数据的行。

我需要计算连续的缺失值。我缺少的是一个可以排名的函数,但是在每个间隙重新开始排名,并随着每个连续的差距递增。

基本上我的数据框如下所示:

df <- data.frame(Date = as.Date("2017-02-10") + 1:10, Missing = c(F,F,T,F,T,T,T,F,T,T))

我想得到这个:

data.frame(Date = as.Date("2017-02-10") + 1:10, Missing = c(F,F,T,F,T,T,T,F,T,T),
           Rank = c(0,0,1,0,1,2,3,0,1,2))
#          Date Missing Rank
# 1  2017-02-11   FALSE    0
# 2  2017-02-12   FALSE    0
# 3  2017-02-13    TRUE    1
# 4  2017-02-14   FALSE    0
# 5  2017-02-15    TRUE    1
# 6  2017-02-16    TRUE    2
# 7  2017-02-17    TRUE    3
# 8  2017-02-18   FALSE    0
# 9  2017-02-19    TRUE    1
# 10 2017-02-20    TRUE    2           

我熟悉dplyr并且我尝试使用cummax但是没有重新启动计数,我不知道如何将其重置为零:

library(dplyr)
df %>% mutate(Rank = if_else(Missing == T, cummax(Rank), 0))

我开始怀疑这是否需要循环。

2 个答案:

答案 0 :(得分:4)

您需要创建Missing列的累积总和,分组所有FALSE值的累计总和:

library(dplyr)   
test.df %>% group_by(group = cumsum(Missing == FALSE)) %>% 
    mutate(Rank = cumsum(Missing))
#         Date Missing group  Rank
#       <date>   <lgl> <int> <int>
#1  2017-02-11   FALSE     1     0
#2  2017-02-12   FALSE     2     0
#3  2017-02-13    TRUE     2     1
#4  2017-02-14   FALSE     3     0
#5  2017-02-15    TRUE     3     1
#6  2017-02-16    TRUE     3     2
#7  2017-02-17    TRUE     3     3
#8  2017-02-18   FALSE     4     0
#9  2017-02-19    TRUE     4     1
#10 2017-02-20    TRUE     4     2

这是有效的,因为布尔值表示为01

答案 1 :(得分:0)

以下是使用data.table

的替代方法
library(data.table)
setDT(df)[, Rank := cumsum(Missing), rleid(Missing)]

df
#          Date Missing Rank
# 1: 2017-02-11   FALSE    0
# 2: 2017-02-12   FALSE    0
# 3: 2017-02-13    TRUE    1
# 4: 2017-02-14   FALSE    0
# 5: 2017-02-15    TRUE    1
# 6: 2017-02-16    TRUE    2
# 7: 2017-02-17    TRUE    3
# 8: 2017-02-18   FALSE    0
# 9: 2017-02-19    TRUE    1
#10: 2017-02-20    TRUE    2