R 如何加快在数据表中查找反向行的过程
给定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
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包技巧是非常有益的。