【发布时间】:2020-04-02 13:46:26
【问题描述】:
我正在尝试做类似的事情:
R - indices of matching values of two data.tables
这里是上述问题的原始可复制示例:
S.disc <- c(2000,2000)
S.max <- c(6200,2300)
S.min <- c(700,100)
Traces.num <- 3
Class.str <- lapply(1:2,function(x) seq(S.min[x],S.max[x],S.disc[x]))
Class.inf <- seq_len(Traces.num)
Actions <- data.table(expand.grid(Class.inf, Class.str[[2]], Class.str[[1]], Class.str[[2]], Class.str[[1]])[,c(5,4,1,3,2)])
setnames(Actions,c("k1","k2","i","l1","l2"))
States <- unique(Actions[,list(k1,k2,i)])
作为 R 初学者,我正在努力将这个示例扩展到所有列。
就我而言,我的第一个 data.table 有 60 列和 220 万行。第二个 data.table 是第一个的子集,即它具有相同的列数 = 60,但行数少得多 = 10 万。
最后,我想要一个长度为 data.table one = 220 万的向量,如果该行同样存在于 data.table 2 中的某处,则值为 TRUE,否则为 FALSE。
我做了一个 for 循环,但效率非常低,需要几个小时才能完成:
S.disc <- c(2000,2000)
S.max <- c(6200,2300)
S.min <- c(700,100)
Traces.num <- 3
Class.str <- lapply(1:2,function(x) seq(S.min[x],S.max[x],S.disc[x]))
Class.inf <- seq_len(Traces.num)
Actions <- data.table(expand.grid(Class.inf, Class.str[[2]], Class.str[[1]], Class.str[[2]], Class.str[[1]])[,c(5,4,1,3,2)])
setnames(Actions,c("k1","k2","i","l1","l2"))
States <- as.data.table(sample_n(Actions, 10))
idx_filter <- rep(NA,dim(Actions)[1])
for (a in 1:dim(Actions)[1]){
for (b in 1:nrow(States))
if (sum(Actions[a,] == States[b,]) == ncol(Actions)) { idx_filter[a] <- T }
}
idx_filter[is.na(idx_filter)] <- F
如何有效地对 data.table 做同样的事情?
【问题讨论】:
-
您的意思是
b in 1:nrow(States)而不是b in 1:length(States)?如果您使用length,您有5 个States,使用nrow,您将有10 个(States中的10 行)。 -
是的,你是对的!我的意思是 nrow(States),非常感谢!
标签: r data.table query-optimization