如何加快在数据中查找反转行的过程 table
How to speed up the process of finding reversed rows in a data table
给定 R 中的 data.table
,我想找到与前一行相反的版本的行。例如:
>head(DT)
V1 V2
1 nameA nameB
2 nameA nameC
3 nameB nameA
4 nameB nameF
5 nameN nameP
6 nameP nameN
在row 1
的情况下,代码应该returnrow 3
。在 row 5
的情况下,代码应 return row 6
。最后,我想删除 "reversed" 行。
真实数据集有50万行2列。目前我正在使用这段代码来完成工作:
require(foreach)
require(doMC)
registerDoMC(4)
rm.idx <- c()
rm.idx <- foreach(i=1:nrow(DT), .combine = 'c')%dopar%{
if (!(i %in% rm.idx)) which(DT[i,1] == DT[,2] & DT[i,2] == DT[,1])
}
代码 "returns" 一个向量 (rm.idx
),其中包含那些行的索引,这些行是前一行的反转版本。
但是相对"small"大小的数据集,需要很长时间(超过30min)。我经常发现 R 有一些调整或一些功能可以更快地完成这个技巧(或者,我的代码也不是很有效)。因此,我想知道是否有人知道查找与前一行相反的行的更快方法。
提前感谢您的宝贵时间。
要找到这些,您可以使用一些 data.table 函数,例如:
> dt <- data.table(V1 = c("A", "A", "B", "B", "N","P"), V2 = c("B","C","A","F","P","N"))
> dt
V1 V2
1: A B
2: A C
3: B A
4: B F
5: N P
6: P N
> dt1 <- dt[, paste0(V1, V2)]
> dt1
[1] "AB" "AC" "BA" "BF" "NP" "PN"
> dt2 <- dt[, paste0(V2, V1)]
> dt2
[1] "BA" "CA" "AB" "FB" "PN" "NP"
> matches <- data.table(m = match(dt1, dt2))
> matches
m
1: 3
2: NA
3: 1
4: NA
5: 6
6: 5
> which(matches[, .I > m])
[1] 3 6
我正在使用 match()
函数,它非常快。因此,首先我将它们以两种方式制作成字符向量。然后我第一次找到第一个字符向量在第二个字符向量中的位置(我知道这是一个令人困惑的句子)。我想再次使结果成为 data.table 以利用那里的 .I
。我制作了一个包含 600 000 行的 data.table,所有这些都在不到一秒的时间内完成。
给定 R 中的 data.table
,我想找到与前一行相反的版本的行。例如:
>head(DT)
V1 V2
1 nameA nameB
2 nameA nameC
3 nameB nameA
4 nameB nameF
5 nameN nameP
6 nameP nameN
在row 1
的情况下,代码应该returnrow 3
。在 row 5
的情况下,代码应 return row 6
。最后,我想删除 "reversed" 行。
真实数据集有50万行2列。目前我正在使用这段代码来完成工作:
require(foreach)
require(doMC)
registerDoMC(4)
rm.idx <- c()
rm.idx <- foreach(i=1:nrow(DT), .combine = 'c')%dopar%{
if (!(i %in% rm.idx)) which(DT[i,1] == DT[,2] & DT[i,2] == DT[,1])
}
代码 "returns" 一个向量 (rm.idx
),其中包含那些行的索引,这些行是前一行的反转版本。
但是相对"small"大小的数据集,需要很长时间(超过30min)。我经常发现 R 有一些调整或一些功能可以更快地完成这个技巧(或者,我的代码也不是很有效)。因此,我想知道是否有人知道查找与前一行相反的行的更快方法。
提前感谢您的宝贵时间。
要找到这些,您可以使用一些 data.table 函数,例如:
> dt <- data.table(V1 = c("A", "A", "B", "B", "N","P"), V2 = c("B","C","A","F","P","N"))
> dt
V1 V2
1: A B
2: A C
3: B A
4: B F
5: N P
6: P N
> dt1 <- dt[, paste0(V1, V2)]
> dt1
[1] "AB" "AC" "BA" "BF" "NP" "PN"
> dt2 <- dt[, paste0(V2, V1)]
> dt2
[1] "BA" "CA" "AB" "FB" "PN" "NP"
> matches <- data.table(m = match(dt1, dt2))
> matches
m
1: 3
2: NA
3: 1
4: NA
5: 6
6: 5
> which(matches[, .I > m])
[1] 3 6
我正在使用 match()
函数,它非常快。因此,首先我将它们以两种方式制作成字符向量。然后我第一次找到第一个字符向量在第二个字符向量中的位置(我知道这是一个令人困惑的句子)。我想再次使结果成为 data.table 以利用那里的 .I
。我制作了一个包含 600 000 行的 data.table,所有这些都在不到一秒的时间内完成。