提问者:小点点

在data.table或快速子集中快速搜索


我有一个DF,有800k行重复(随机)值。对于每一行,我需要取一个值并找到具有相同值的新行的索引。例如“asd”-我还能在哪里看到它?不需要当前行的索引。

我目前的解决方案是:子集一个DF,并通过删除当前行来创建一个临时帧/表。问题-每1000次迭代需要一分钟。所以800 k排要花13个小时。有什么想法吗?谢谢!

在原始DF(未细分)上运行

编辑:我现实生活中的DF不止一列。下面的例子是简化的。我需要获取V1[1]并获取其他V1的行号,其值为V1[1],然后对每行重复V1[2],依此类推

library(fastmatch)
library(stringi)
set.seed(12345)
V1 = stringi::stri_rand_strings(800000, 3)
df0 = as.data.table(V1)
mapped = matrix("",nrow=800000)

print(Sys.time())
for (i in 1:1000) {
  tmp_df = df0[-i,] #This takes very long time!!!
  mapped[i] = fmatch(df0$V1[i],tmp_df$V1)
}
print(Sys.time())

View(mapped)

共1个答案

匿名用户

数据:

library("data.table")
set.seed(12345)
V1 = stringi::stri_rand_strings(80, 3)
df0 <- data.table( sample(V1, 100, replace = TRUE ))

代码:

df0[, id := list(list(.I)), by = V1]  # integer id

输出:

head(df0, 10)
#     V1          id
# 1: iuR      1,2,21
# 2: iuR      1,2,21
# 3: KXc           3
# 4: LwA           4
# 5: pYn           5
# 6: qoN        6,66
# 7: 5Xt           7
# 8: wBH        8,77
# 9: V9r     9,39,54
# 10: 9ks 10,28,42,48

编辑-删除当前索引:

df0[, id2 := 1:.N ]
df0[, id := list(list(unlist(id)[ unlist(id) != .I  ] )), by = id2 ]
df0[, id2 := NULL ]
df0[ lengths(id) > 0, ]
head( df0, 10 )
#     V1       id
# 1: iuR     2,21
# 2: iuR     1,21
# 3: KXc         
# 4: LwA         
# 5: pYn         
# 6: qoN       66
# 7: 5Xt         
# 8: wBH       77
# 9: V9r    39,54
# 10: 9ks 28,42,48