我正在使用原始目的地(OD)数据,该数据在单独的列中包含一个原始ID和一个目标ID。有时,重要的是汇总相同的OD对,但要交换起点和终点。
OD数据如下所示:
orign dest value
E02002361 E02002361 109
E02002361 E02002363 38
E02002361 E02002367 10
E02002361 E02002371 44
E02002363 E02002361 34
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,第一行和最后一行可以被视为同一对,但方向相反。面临的挑战是如何有效地识别它们是否重复。
我创建了一个包stplanr,它可以回答这个问题,如下面的可重现示例所示:
x = read.csv(stringsAsFactors = FALSE, text = "orign,dest,value
E02002361,E02002361,109
E02002361,E02002363,38
E02002361,E02002367,10
E02002361,E02002371,44
E02002363,E02002361,34")
duplicated(stplanr::od_id_order(x)[[3]])
#> Registered S3 method overwritten by 'R.oo':
#> method from
#> throw.default R.methodsS3
#> [1] FALSE FALSE FALSE FALSE TRUE
Run Code Online (Sandbox Code Playgroud)
由reprex软件包(v0.3.0)创建于2019-07-27
这种方法的问题在于,对于大型数据集,它的速度很慢。
我已经研究了从矩阵的每一列中获取最小值的最快方法?这表明这pmin是跨多个列(而不是2个)获取最小值的最有效方法,而我们已经在使用它。
与删除重复组合(不考虑顺序)不同,此问题是关于仅两列的重复标识和效率。删除重复组合中发布的解决方案(与顺序无关)似乎比以下时间所示的最慢解决方案要慢。
比szudzik_pairing我的同事马尔科姆·摩根(Malcolm Morgan)创建的功能更快的解决方案是基于Matthew Szudzik开发的方法 …