在 data.table 或快速子集中快速搜索
Quick search in data.table or quick subset
我有一个 DF,其中包含 800k+ 行和重复(随机)值。对于每一行,我需要取一个值并找到具有相同值的新行的索引。例如。 "asd" - 我还能在哪里看到它?不需要当前行的索引。
我当前的解决方案:子集一个 DF 并通过删除当前行创建一个临时 frame/table。问题 - 每 1000 次迭代需要一分钟。所以 800+k 行需要我 13 个小时才能 运行。有任何想法吗?谢谢!
运行 在原始 DF(未子集化)上小于 1 秒,但正如您可以想象的那样,它为我提供了当前行的索引。
编辑:我的现实生活中的 DF 不止 1 列。下面的例子被简化了。我需要获取 V1[1]
并获取值为 V1[1]
的其他 V1
的行号,然后对 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)
数据:
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
我有一个 DF,其中包含 800k+ 行和重复(随机)值。对于每一行,我需要取一个值并找到具有相同值的新行的索引。例如。 "asd" - 我还能在哪里看到它?不需要当前行的索引。
我当前的解决方案:子集一个 DF 并通过删除当前行创建一个临时 frame/table。问题 - 每 1000 次迭代需要一分钟。所以 800+k 行需要我 13 个小时才能 运行。有任何想法吗?谢谢!
运行 在原始 DF(未子集化)上小于 1 秒,但正如您可以想象的那样,它为我提供了当前行的索引。
编辑:我的现实生活中的 DF 不止 1 列。下面的例子被简化了。我需要获取 V1[1]
并获取值为 V1[1]
的其他 V1
的行号,然后对 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)
数据:
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