如何有效地识别数据 table 中跨多列的顺序变化?
How to efficiently identify sequential changes across multiple columns in a data table?
我有一个非常大的数据 table,其中包含以下列。其中 pos1 和 pos2 给出了跨不同类别 cat1 和 cat2 的对齐序列。
set.seed(1)
library(data.table)
x <- 1:60
y <- 100:41
dt <- data.table(cat1 = c(rep("A", 40), rep("B", 60)),
cat2 = c(rep("A", 75), rep("C", 25)),
pos1 = c(x[-sample(x, 10)], x[-sample(x, 10)]),
pos2 = c(x[-sample(x, 10)], y[-sample(x, 10)])
我需要创建一个分组列,当 cat1 或 cat2 之一发生变化时,或者 pos1 或 pos2 之间的差异大于 1 时,id 会发生变化。
我试过如下:
dt$grp <- as.numeric(paste0(rleid(c(0,cumsum(as.numeric(with(dt, cat1[1:(length(cat1)-1)] != cat1[2:length(cat1)]))))),
rleid(c(0,cumsum(as.numeric(with(dt, cat2[1:(length(cat2)-1)] != cat2[2:length(cat2)]))))),
rleid(c(0, cumsum(abs(diff(dt$pos1)) > 1))),
rleid(c(0, cumsum(abs(diff(dt$pos2)) > 1))) ))
但是,这种方法很慢并且会在我的数据集中产生一些错误。有人对如何改进有任何建议吗?
任何帮助将不胜感激!
因为您使用的是 data.table
包,所以我会执行如下操作。
dt[,`:=`(pos1id=rleid(cumsum(abs(diff(c(0,pos1)))>1)),
pos2id=rleid(cumsum(abs(diff(c(0,pos2)))>1)),
cat1id=rleid(cat1),
cat2id=rleid(cat2))][
, `:=`(grp=.GRP), by = c("pos1id","pos2id",
"cat1id","cat2id")
]
:=
运算符修改数据的位置通常很快。此外,您不需要一次完成所有这些操作,您可以创建多个列,然后根据 data.table.
的内部 .GRP
参数对它们进行索引
我有一个非常大的数据 table,其中包含以下列。其中 pos1 和 pos2 给出了跨不同类别 cat1 和 cat2 的对齐序列。
set.seed(1)
library(data.table)
x <- 1:60
y <- 100:41
dt <- data.table(cat1 = c(rep("A", 40), rep("B", 60)),
cat2 = c(rep("A", 75), rep("C", 25)),
pos1 = c(x[-sample(x, 10)], x[-sample(x, 10)]),
pos2 = c(x[-sample(x, 10)], y[-sample(x, 10)])
我需要创建一个分组列,当 cat1 或 cat2 之一发生变化时,或者 pos1 或 pos2 之间的差异大于 1 时,id 会发生变化。
我试过如下:
dt$grp <- as.numeric(paste0(rleid(c(0,cumsum(as.numeric(with(dt, cat1[1:(length(cat1)-1)] != cat1[2:length(cat1)]))))),
rleid(c(0,cumsum(as.numeric(with(dt, cat2[1:(length(cat2)-1)] != cat2[2:length(cat2)]))))),
rleid(c(0, cumsum(abs(diff(dt$pos1)) > 1))),
rleid(c(0, cumsum(abs(diff(dt$pos2)) > 1))) ))
但是,这种方法很慢并且会在我的数据集中产生一些错误。有人对如何改进有任何建议吗?
任何帮助将不胜感激!
因为您使用的是 data.table
包,所以我会执行如下操作。
dt[,`:=`(pos1id=rleid(cumsum(abs(diff(c(0,pos1)))>1)),
pos2id=rleid(cumsum(abs(diff(c(0,pos2)))>1)),
cat1id=rleid(cat1),
cat2id=rleid(cat2))][
, `:=`(grp=.GRP), by = c("pos1id","pos2id",
"cat1id","cat2id")
]
:=
运算符修改数据的位置通常很快。此外,您不需要一次完成所有这些操作,您可以创建多个列,然后根据 data.table.
.GRP
参数对它们进行索引