添加新数据时,累积计算序号中的差距会导致不同的答案
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,月份)的结果。我没有完全遵循这里的逻辑或意图,所以这可能不是一个好主意。
几天前我问了一个问题,你们帮我解决了,我永远感激不尽!然而,一个新的问题出现了,我再次需要你的帮助!
这是对原始问题的 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,月份)的结果。我没有完全遵循这里的逻辑或意图,所以这可能不是一个好主意。