r语言 - 添加新数据时,累积计数序列号中的间隙会导致不同的答案



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

这是原始问题的链接: (R( 累积计数序列号中的间隙

我试图累积计算每个选择的唯一ID的序列号中的间隙。 这是我的数据集:

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    

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

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 以前值的信息?

任何帮助将不胜感激!

谢谢!

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

注意 - 正如其他人所评论的那样,问题中的结果与提供的代码之间似乎存在差异。例如,在问题帖子中,第 3 个月的 UniqueID GHI789 的 CountSkip 值为 1,尽管代码返回 0。此答案中的代码返回 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

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

最新更新