这是this question的后续行动,人们发现这是一个不好的例子。尽管如此,它仍然有一个相当不错的解决方案,但它仍然非常慢。
我希望有更快的方式;
可重复的例子(我知道它看起来很奇怪,但它有效)
set.seed(1)
class <- sample(LETTERS, 15)
origpat <- data.table(c(rep(sample(1:100),3), rep(sample(1:500), 4), sample(1:600), sample(200:299)))
set.seed(3)
refpat <- data.table(rep(seq(1,600,1),5))
dt <- data.table(rep.int(1:600,3))
dt$class <- rep(sample(LETTERS, 15),120)
dt <- dt[order(dt$V1, ascending = T)]
setnames(dt, "V1", "pnum")
df <- data.table(origpat, refpat)
colnames(df) <- c("origpat","refpat")
setkey(df, origpat)
df[, idx := .I] # you might get warning but ignore
所以我们有两个data.frames:df
包含两行origpat
和refpat
,dt
包含一列pnum
,它们捕获相同的数字作为origpat
和class
将每个pnum
分配给三个类。
我想找到最快的方法来比较dt
中的类与origpat
和refpat
中df
类之间的重叠(或其他一些比较衡量标准) 1}}。
这提供了一个有效的解决方案
df[,compare := {x = dt[pnum== origpat, class]; y = dt[pnum == refpat, class]; sum(x %in% y)}, by = idx]
这个解决方案的问题在于它看起来很快但真正的数据集
pnum
和超过5,000个class
元素class
个元素数量在1到26之间不等pnum
,origpat
和refpat
是字符,而不是数字。出于一般目的,x
和y
应该可以在不同的数据集中找到(因此dt
中不能同时存在,并且解决方案应该适用于大数据集。当前的解决方案应用于我的数据需要大约1分钟100行。我有2000万行所以需要很长时间。
希望这提供了一个合理的可重复的例子,可以找到一个好的解决方案
答案 0 :(得分:1)
这是一种通过重写循环来加快速度的简单方法,但我仍然对这个问题感到有点模糊:
setkey(dt, pnum)
df[, compare := {x = dt[.(origpat), class];
dt[.(refpat), sum(x %in% class), by = .EACHI]$V1}
, by = origpat]