我有一个data.table说dt
dt <- data.table(reg = c("01", "01", "01", "01", "01", "02", "02", "02", "02", "02"),
seq = c(735052, 835182, 935447, 5642, 135795, 327855, 328497, 339842, 339979, 340176))
> dt
reg seq
1: 01 735052
2: 01 835182
3: 01 935447
4: 01 5642
5: 01 135795
6 02 327855
7: 02 328497
8: 02 339842
9: 02 339979
10: 02 340176
我想计算每个班级的总可用seq。例如,课程&#34; 02&#34;总可用序列为(340176 - 327855 +1 = 12322)。
如果是班级&#34; 01&#34;序列在达到最大值(1000000)后重新启动。所以在这种情况下,总可用序列必须是(1000000 - 735052 + 135795 = 400743),我该怎么做。
我需要生成一个单调的序列,并且需要得到该序列的总和等于(last seq - first seq + 1)。同样在序列在达到阈值后重新启动的情况下(例如reg = 01),seq之和为(阈值 - 第一个seq代码+最后一个seg代码)
答案 0 :(得分:1)
可能有不同的方式,但下面有一个选项:
dt[,.(ifelse(diff(.SD[c(1,.N)]$seq)<0,1000000-diff(.SD[c(.N,1)]$seq),diff(.SD[c(1,.N)]$seq))),by=.(reg)]
# reg V1
# 1: 01 400743
# 2: 02 12321
答案 1 :(得分:0)
这比上面的方式更长但更直接(对我来说):
dt[, num_reset := cumsum(shift(seq, fill = FALSE) > seq), by = reg]
dt[, new_seq := num_reset * 999999 + seq]
dt[, max(new_seq) - min(new_seq) + 1, by = reg]
步骤为1.计算重置次数,2。创建new_seq
和3.计算最大值和最小值之间的差值。