我有一个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))
我开始怀疑这是否需要循环。
答案 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
这是有效的,因为布尔值表示为0
和1
。
答案 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