Скажем, у меня есть набор данных, где последовательности длиной 1 являются незаконными, длина 2 законна, больше длины 5 являются незаконными, но разрешено прерывать более длинные последовательности до < = 5 последовательностей.Коды последовательности индексирования с использованием data.table
set.seed(1)
DT1 <- data.table(smp = 1, R=sample(0:1, 20000, rep=TRUE), Seq = 0L)
DT1[, smp:=1:length(smp)]
DT1[, Seq:=seq(.N), by=list(cumsum(c(0, abs(diff(R)))))]
Эта последняя линия идет непосредственно от: Creating a sequence in a data.table depending on a column
DT1[, fix_min:=ifelse((R==TRUE & Seq==1) | (R==FALSE), FALSE, TRUE)]
fixmin_idx2 <- which(DT1[, fix_min==TRUE])
DT1[fixmin_idx2 -1, fix_min:=TRUE]
Теперь мои длиной 2 правильно юридические дела отмечены. Разбейте> 5s.
DT1[R==1 & Seq==6, fix_min:=FALSE]
DT1[,Seq2:=seq(.N), by=list(cumsum(c(0, abs(diff(fix_min)))))]
DT1[R==1 & Seq2==6, fix_min:=FALSE]
fixSeq2_idx7 <- which(DT1[,fix_min==TRUE] & DT1[,Seq2==7])
fixSeq2_idx7
[1] 10203 13228
DT1[fixSeq2_idx7,]
smp R Seq fix_min Seq2
1: 10203 1 13 TRUE 7
2: 13228 1 13 TRUE 7
DT1[fixSeq2_idx7 + 1,]
smp R Seq fix_min Seq2
1: 10204 1 14 TRUE 8
2: 13229 0 1 FALSE 1
И теперь, чтобы проверить, если SEQ2 == 7 сопровождается SEQ2 == 8, который был бы законным 2 длины. Я один 7, а затем 8 и один, за которым не следует 8. И там я застрял. Все, что я пробовал, либо устанавливает все fix_min в TRUE, либо чередует TRUE и FALSE.
Любое руководство очень ценится.
Незначительное исправление: 'ifelse ((R == TRUE & Seq == 1) | (R == FALSE), FALSE, TRUE)' должно быть просто '! (R == 1 & Seq == 1) '. Обратите внимание, что 'R' равно 0/1, а не FALSE/TRUE.В другом месте я сильно подозреваю, что вам не нужно столько скобок. Например, в 'by =' вам не нужно обертывать один вектор в 'list()'. – Frank
Не уверен, но дает ли это то, что вы ожидаете? 'DT1 [, if (.N> 1L) .SD [rep (seq_len (min (.N, 5L)), length.out = .N)], by =. (Rleid (R), R)]'. Он удаляет строки, где 'Seq' является просто' 1', а если '1: 9', он изменяет его на' 1: 5, 1: 4'. Это должно быть выполнено после первого блока кода. – Arun
@Arun - Да, за исключением того, что я не хочу удалять строки в данных в этот момент, потому что нелегалы представляют другое условие интереса к данным. – Chris