【发布时间】:2016-02-23 03:47:52
【问题描述】:
这是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 中的类与df 中的两个专利origpat 和refpat 之间的重叠(或其他一些比较度量)。
这提供了一个可行的解决方案L
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 之间变化 - 不确定这是否会有所不同,但
pnum、origpat和refpat是字符,而不是数字。
出于一般目的,x 和 y 应该有可能在不同的数据集中找到(因此不是在 dt 中都存在,并且该解决方案应该适用于大数据集。应用于我的数据的当前解决方案大约需要100 行需要 1 分钟。我有 2000 万行,所以需要很长时间。
希望这提供了一个合理的可重现示例,以便找到一个好的解决方案
【问题讨论】:
-
在
df中,你有两列同名,每一行都是相同的(因为你有ordered/setkeyorigpat&refpat)。这似乎很奇怪 -
更正这不是应该的样子。会更新
-
对不起,你错了。会立即改变
-
不,origpat 和 refpat 列的长度相同。 sum(x == y) 旨在捕获 x 和 y 中重叠元素的数量(在此示例中为
class)。使用我目前正在运行的sum(x %in% y)可能会更好 -
我会考虑这一点,但只是为了澄清一下 - 这是与您之前链接的问题不同的问题,对吧?特别是
df这里没有“class”/“mainprim”列。
标签: r data.table memory-efficient