添加新数据时,累积计算序号中的差距会导致不同的答案

Cumulatively Count Gaps in Sequential Numbers Results in Different Answers When New Data Added

几天前我问了一个问题,你们帮我解决了,我永远感激不尽!然而,一个新的问题出现了,我再次需要你的帮助!

这是对原始问题的 link:

我试图累计计算每个选择的 UniqueID 的序列号差距。这是我的数据集:

UniqueID  Month  
ABC123    1       
ABC123    2      
ABC123    3      
ABC123    4      
ABC123    6      
ABC123    7      
DEF456    3      
DEF456    4      
DEF456    10     
DEF456    11     
DEF456    12     
DEF456    14     
GHI789    2      
GHI789    3  
JKL012    12     
JKL012    13     
JKL012    14    

在您的帮助下,我调整了上面 link 提供的代码,如下所示:

data2=data %>%
       group_by(UniqueID) %>%
       mutate(Skip = if_else(Month - lag(Month, default = first(Month) - 1) - 1 > 0, 1, 0),
       CountSkip = cumsum(Skip))

data2 = data2%>% 
       group_by(UniqueID) %>%
       mutate(LastValue = if_else(Month == last(Month), 1, 0))

data2=as.data.frame(data2)
data2$FinalTally=ifelse(data2$LastValue==1 & data2$Month!=14,1,0)
data2$SeqCount=data2$FinalTally+data2$CountSkip

这是生成的数据集:

UniqueID  Month  Skip CountSkip LastValue  FinalTally   SeqCount
ABC123    1      0    0         0          0            0
ABC123    2      0    0         0          0            0
ABC123    3      0    0         0          0            0 
ABC123    4      0    0         0          0            0
ABC123    6      1    1         0          0            1
ABC123    7      1    2         1          1            2
DEF456    3      0    0         0          0            0
DEF456    4      0    0         0          0            0
DEF456    10     1    1         0          0            1
DEF456    11     1    1         0          0            1
DEF456    12     1    1         0          0            1  
DEF456    14     2    2         1          0            2
GHI789    2      0    0         0          0            0
GHI789    3      0    1         1          1            1
JKL012    12     0    0         0          0            0
JKL012    13     0    0         0          0            0 
JKL012    14     0    0         1          0            0

这就是我想要的……或者我是这么想的。

在添加下个月 (15) 的新数据时,我编辑了代码的倒数第二行,以说明 15 是新的最后一个月。但是,我注意到 SeqCount 按月的总和与添加新数据之前同月的总和不同。我过滤到一个月,发现一个 UniqueID 的示例,其中 SeqCount 总和不同。

这是包含新数据之前的示例:

UniqueID  Month  Skip CountSkip LastValue  FinalTally   SeqCount
ZZZ999    2      0    0         0          0            0
ZZZ999    3      0    0         0          0            0
ZZZ999    4      0    0         0          0            0 
ZZZ999    5      0    0         0          0            0
ZZZ999    6      0    0         1          1            1

这是包含新数据时的示例:

UniqueID  Month  Skip CountSkip LastValue  FinalTally   SeqCount
ZZZ999    2      0    0         0          0            0
ZZZ999    3      0    0         0          0            0
ZZZ999    4      0    0         0          0            0 
ZZZ999    5      0    0         0          0            0
ZZZ999    6      0    0         0          0            0
ZZZ999    15     1    1         1          0            1

这是问题所在:第 6 个月在添加新数据时丢失了一个 SeqCount 值。

我的最终目标是 运行 每个月的回归模型,其中 SeqCount 作为响应,其他一些列作为预测变量(为了便于阅读,我没有包括它们)。每当我添加新数据时,响应都会发生变化,我的估计将不一致。

有没有一种方法可以让我的代码结构有所不同,这样当我添加新数据时,代码的逻辑不会更改 SeqCount 先前值的信息?

如有任何帮助,我们将不胜感激!

谢谢!

以下内容似乎可以重现您想要的内容,而无需将任何值硬编码到逻辑中。

注意 - 正如其他人评论的那样,问题中的结果与提供的代码之间似乎存在差异。例如,在问题 post 中,第 3 个月的 UniqueID GHI789 的 CountSkip 值为 1,但代码 returns 0。此答案中的代码 returns 0。

data <- cbind.data.frame(UniqueID = c('ABC123','ABC123','ABC123','ABC123','ABC123','ABC123','DEF456','DEF456','DEF456','DEF456','DEF456','DEF456','GHI789','GHI789','JKL012','JKL012','JKL012'),
                         Month = c(1,2,3,4,6,7,3,4,10,11,12,14,2,3,12,13,14))

cartesian <- expand.grid(UniqueID = unique(as.character(data$UniqueID)),
                  Month = seq(from=min(data$Month), to=max(data$Month), by=1))

BA <- cartesian %>% 
  left_join(data %>% mutate(Month_orig=Month), by=c("UniqueID","Month")) %>% 
  arrange(UniqueID, Month) %>% 
  group_by(UniqueID) %>% 
  mutate(Skip = ifelse(Month==Month_orig & 
                         is.na(lag(Month_orig,1)) & 
                         Month!=min(Month[!is.na(Month_orig)]), 
                       1, 0)) %>%
  mutate(Skip = ifelse(Skip==1 & is.na(lag(Month_orig,2)), 0, Skip)) %>% # contstrain to only one skipped period?
  filter(!is.na(Month_orig)) %>% 
  mutate(CountSkip = cumsum(Skip)) %>% 
  mutate(LastValue = ifelse(Month==max(Month), 1, 0)) %>%
  mutate(FinalTally = ifelse(LastValue==1 & Month != max(Month),1,0)) %>% 
  mutate(SeqCount = FinalTally + CountSkip) %>% 
  select(-Month_orig)
BA
# A tibble: 17 x 7
# Groups:   UniqueID [4]
   UniqueID Month  Skip CountSkip LastValue FinalTally SeqCount
   <fct>    <dbl> <dbl>     <dbl>     <dbl>      <dbl>    <dbl>
 1 ABC123       1     0         0         0          0        0
 2 ABC123       2     0         0         0          0        0
 3 ABC123       3     0         0         0          0        0
 4 ABC123       4     0         0         0          0        0
 5 ABC123       6     1         1         0          0        1
 6 ABC123       7     0         1         1          0        1
 7 DEF456       3     0         0         0          0        0
 8 DEF456       4     0         0         0          0        0
 9 DEF456      10     0         0         0          0        0
10 DEF456      11     0         0         0          0        0
11 DEF456      12     0         0         0          0        0
12 DEF456      14     1         1         1          0        1
13 GHI789       2     0         0         0          0        0
14 GHI789       3     0         0         1          0        0
15 JKL012      12     0         0         0          0        0
16 JKL012      13     0         0         0          0        0
17 JKL012      14     0         0         1          0        0

在更仔细地阅读问题和评论时 - 我同意需要参考 table 的先前版本才能实施解决方案。您可以尝试 rbind(old_data,new_rows),其中 new_rows 是处理所有数据并仅保留不包含在 old_data 中的唯一(UniqueID,月份)的结果。我没有完全遵循这里的逻辑或意图,所以这可能不是一个好主意。