R 如何加快在数据表中查找反向行的过程

R 如何加快在数据表中查找反向行的过程,r,data.table,reverse,R,Data.table,Reverse,给定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 对于第1行,代码应返回第3行。对于第5行,代码应返回第6行。最后,我想删除“反向”行 真实数据集有50万行和2列。目前,我正在使用这段代码,它完成以下工作: requir

给定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
对于
第1行
,代码应返回
第3行
。对于
第5行
,代码应返回
第6行
。最后,我想删除“反向”行

真实数据集有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])
}      
require(foreach)
要求(doMC)
寄存器DOMC(4)

rm.idx要查找这些,可以使用一些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
>dt
V1 V2
1:A-B
2:AC
3:BA
4:BF
5:NP
6:P N
>dt1 dt1
[1] “AB”“AC”“BA”“BF”“NP”“PN”
>dt2 dt2
[1] “BA”“CA”“AB”“FB”“PN”“NP”
>火柴
M
1:  3
2:NA
3:  1
4:NA
5:  6
6:  5
>哪个(匹配[,.I>m])
[1] 3 6

我使用的是
match()
函数,速度非常快。首先我要把它们转换成两种方式的字符向量。然后我第一次发现第一个字符向量在第二个字符向量中的位置(我知道这是一个令人困惑的句子)。我想再次将结果设置为data.table,以利用那里的
.I
。我制作了一个包含60万行的data.table,所有这些都在不到一秒钟的时间内完成。

它是否只需要紧靠前一行,或者它之前的任何一行?在速度方面,答案与你的答案相比如何?你是只有两列,还是可能有更多?@AndrewTaylor。谢谢,这里的答案很快就对我有用了。尝试
DT[!复制(粘贴(pmin(V1,V2),pmax(V1,V2))]
Hi Laurik。谢谢评论中有人指出另一个答案也解决了我的问题。我把它附在这里,以防对你有用。与您的方法非常相似:。再次感谢,是的。取决于数据的大小。基于data.frame的解决方案将以相当快的速度处理多达几十万行的所有内容。一旦有数百万行,就需要data.table(和/或plyr/dplyr)。对于我自己来说,这是一段相当长的学习曲线,但我发现学习data.table包技巧是非常有益的。