【问题标题】:How to speed up the process of finding reversed rows in a data table如何加快在数据表中查找反向行的过程
【发布时间】:2015-01-23 14:38:13
【问题描述】:

给定 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,代码应返回row 3。对于row 5,代码应返回row 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])
}      

代码“返回”一个向量 (rm.idx),其中包含那些行的索引,这些行是前一行的反转版本。

但是,对于相对“小”的数据集大小来说,需要很长时间(超过 30 分钟)。我经常发现 R 有一些调整或一些功能可以更快地完成这个技巧(或者,我的代码效率不高)。因此,我想知道是否有人知道找到与前一行相反的行的更快方法

提前感谢您的宝贵时间。

【问题讨论】:

  • 它只需要是前一行,还是它之前的任何行?
  • 在速度方面,here 上的答案与您的答案相比如何?
  • 您只有两列,还是可能有更多?
  • @AndrewTaylor。谢谢,这里的答案很快就对我有用。 stackoverflow.com/questions/22756392/…
  • 试试DT[!duplicated(paste(pmin(V1, V2),pmax(V1,V2)))]

标签: r data.table reverse


【解决方案1】:

要找到这些,您可以使用一些 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,所有这些都在不到一秒的时间内完成。

【讨论】:

  • 嗨劳瑞克。谢谢。 cmets中的某个人指出了另一个答案,该答案也解决了我的问题。我把它附在这里,以防对你有用。与您的方法非常相似:stackoverflow.com/questions/22756392/…。再次感谢。
  • 是的。取决于数据的大小。基于 data.frame 的解决方案可以在几十万行的情况下运行得相当快。一旦达到数百万行,您就真的需要 data.table(和/或 plyr/dplyr)。这对我自己来说是一条学习曲线,但我发现学习 data.table 包的技巧非常有益。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多