快速比较R

时间:2016-02-23 03:47:52

标签: r data.table memory-efficient

这是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包含两行origpatrefpatdt包含一列pnum,它们捕获相同的数字作为origpatclass将每个pnum分配给三个类。

我想找到最快的方法来比较dt中的类与origpatrefpatdf类之间的重叠(或其他一些比较衡量标准) 1}}。

这提供了一个有效的解决方案

df[,compare := {x = dt[pnum== origpat, class]; y = dt[pnum == refpat, class]; sum(x %in% y)}, by = idx]

这个解决方案的问题在于它看起来很快但真正的数据集

  • 包含超过22个MIO行
  • 拥有超过92,000个pnum和超过5,000个class元素
  • 每个专利的class个元素数量在1到26之间不等
  • 不确定这是否有所不同,但pnumorigpatrefpat是字符,而不是数字。

出于一般目的,xy应该可以在不同的数据集中找到(因此dt中不能同时存在,并且解决方案应该适用于大数据集。当前的解决方案应用于我的数据需要大约1分钟100行。我有2000万行所以需要很长时间。

希望这提供了一个合理的可重复的例子,可以找到一个好的解决方案

1 个答案:

答案 0 :(得分:1)

这是一种通过重写循环来加快速度的简单方法,但我仍然对这个问题感到有点模糊:

setkey(dt, pnum)
df[, compare := {x = dt[.(origpat), class];
                 dt[.(refpat), sum(x %in% class), by = .EACHI]$V1}
   , by = origpat]