在R

时间:2017-05-16 06:49:44

标签: r data.table

我有一个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代码)

2 个答案:

答案 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.计算最大值和最小值之间的差值。