2017-02-10 36 views
0

我有一個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)) 

我開始想知道這是否需要循環。

回答

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

或者,'評級= ROW_NUMBER()的另一種方法 - 1L' – Frank

+0

哇它永遠不會發生到我建立這樣的基團。這像一個魅力。謝謝 – sgp667

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