r - 使用 data.table 索引序列 block

标签 r indexing data.table sequence chunks

假设我有一个数据集,其中长度为 1 的序列是非法的,长度为 2 的序列是合法的,大于长度 5 的序列是非法的,但允许将较长的序列分解为 <=5 个序列。

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 的合法字符已正确标记。打破 >5 秒。

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。

非常感谢任何指导。

最佳答案

如果我正确理解你的问题,你想设置 fix_minFALSER == 0或当 R == 1 & (1 =< Seq < 6 | Seq > 6) 。那么以下应该会给你你想要的:

# recreating the data from your first code block
set.seed(1)
DT1 <- data.table(R=sample(0:1, 20000, rep=TRUE))[, smp:=.I
                                                  ][, Seq:=seq(.N), by=rleid(R)
                                                    ][, Seq2 := Seq[.N], by=rleid(R)]

# adding the needed 'fix_min' column
DT1[, fix_min := (R==1 & Seq[.N] > 1 & Seq%%6!=0), by=rleid(R)
    ][R==1 & Seq%%6==1 & Seq2%%6==1 & Seq==Seq2, fix_min := FALSE]

说明:

  • data.table(R=sample(0:1, 20000, rep=TRUE))创建data.table
  • 的基础
  • [, smp:=.I]创建索引并将其添加到data.table
  • by=rleid(R)识别序列;看看它会尝试什么:data.table(R=sample(0:1, 20000, rep=TRUE))[, seq.id:=rleid(R)]
  • [, Seq:=seq(.N), by=rleid(R)]为每个序列创建一个索引并将其添加到data.table;序列由 rleid(R) 标识。
  • [, Seq2 := Seq[.N], by=rleid(R)]创建一个变量,其中包含指示序列长度的值
  • fix_min := (R==1 & Seq[.N] > 1 & Seq%%6!=0)使用 TRUE 创建一个逻辑向量值其中 R==1 & 序列的长度大于一 ( Seq[.N] > 1 ),不包括序列号为 6 倍数的值(Seq%%6!=0)
  • R==1 & Seq%%6==1 & Seq2%%6==1 & Seq==Seq2按如下方式过滤 data.table:仅包含 R==1 的行& 序列值为7 , 13 , 19等( Seq%%6==1 )且序列的长度为 7 , 13 , 19等,并且仅从满足其他条件的序列中选择最后一行( Seq==Seq2 )。与fix_min := FALSE您将它们设置为 FALSE .

关于r - 使用 data.table 索引序列 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33416084/

相关文章:

r - 使用条件将数据从一个表子集到不同的表中

r - 在具有多个向量的 R 中使用相同()

r - R 中的 as.character() 和 as( ,"character") 有什么区别

r - tidyverse pivot_longer 几组列,但避免中间 mutate_wider 步骤

python - 在 Julia 中获取满足多个 boolean 值的矩阵的列

R 数据表优化。 overdraw 财务数据

r - 在 R 中使用 if、else if、else 创建函数

mysql - 如何设置 MySQL 索引以获得最佳结果

python - 屏蔽数组索引问题

r - 具有 integer64 数字的 dcast 的意外行为