Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中达到最大值后重新启动序列时,计算序列号的总和_R_Data.table - Fatal编程技术网

在R中达到最大值后重新启动序列时,计算序列号的总和

在R中达到最大值后重新启动序列时,计算序列号的总和,r,data.table,R,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: 0

我有一个数据表,比如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
dt
登记顺序
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。例如,“02”类的总可用序列为(340176-327855+1=12322)

对于“01”类,序列在达到最大值(1000000)后已重新启动。所以在这种情况下,总可用序列必须是(1000000-735052+135795=400743),我如何才能做到这一点


我需要生成一个单调序列,并且需要得到该序列的总和,它等于(last seq-first seq+1)。同样,如果序列在达到阈值后重新启动(示例reg=01),则序列和为(阈值-第一个序列代码+最后一个序列代码)

可能有不同的方法,但下面有一个选项:

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

dt[,(ifelse(diff(.SD[c(1,N)]$seq)这比上面的方法长一点,但更直接(对我来说):

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

您的条件不清楚,我需要生成一个单调序列,并需要得到该序列的总和,其等于(最后一个序列-第一个序列+1).同样,如果序列在达到阈值后重新启动(示例reg=01),则序列和为(阈值-第一个序列代码+最后一个序列代码)