【发布时间】:2022-01-20 13:24:18
【问题描述】:
问题:我们需要一种大数据方法来计算点之间的距离。我们在下面概述了我们想用一个五观察数据框做的事情。但是,随着行数变大(> 100 万),这种特殊方法是不可行的。过去,我们使用 SAS 进行此类分析,但如果可能,我们更喜欢 R。 (注意:我不打算展示代码,因为虽然我在下面概述了一种在较小数据集上执行此操作的方法,但对于我们规模的数据来说,这基本上是一种不可能的方法。)
我们从商店的数据框开始,每个商店都有纬度和经度(虽然这不是空间文件,我们也不想使用空间文件)。
# you can think of x and y in this example as Cartesian coordinates
stores <- data.frame(id = 1:5,
x = c(1, 0, 1, 2, 0),
y = c(1, 2, 0, 2, 0))
stores
id x y
1 1 1 1
2 2 0 2
3 3 1 0
4 4 2 2
5 5 0 0
对于每个商店,我们想知道 x 距离内的商店数量。在一个小的数据框中,这很简单。创建另一个所有坐标的数据框,重新合并,计算距离,如果距离小于 x,则创建一个指标,然后将指标相加(商店本身减去一个,距离为 0)。这将产生一个如下所示的数据集:
id x y s1.dist s2.dist s3.dist s4.dist s5.dist
1: 1 1 1 0.000000 1.414214 1.000000 1.414214 1.414214
2: 2 0 2 1.414214 0.000000 2.236068 2.000000 2.000000
3: 3 1 0 1.000000 2.236068 0.000000 2.236068 1.000000
4: 4 2 2 1.414214 2.000000 2.236068 0.000000 2.828427
5: 5 0 0 1.414214 2.000000 1.000000 2.828427 0.000000
当您(任意)将 1.45 以下视为“收盘价”时,您最终会得到如下所示的指标:
# don't include the store itself in the total
id x y s1.close s2.close s3.close s4.close s5.close total.close
1: 1 1 1 1 1 1 1 1 4
2: 2 0 2 1 1 0 0 0 1
3: 3 1 0 1 0 1 0 1 2
4: 4 2 2 1 0 0 1 0 1
5: 5 0 0 1 0 1 0 1 2
最终产品应如下所示:
id total.close
1: 1 4
2: 2 1
3: 3 2
4: 4 1
5: 5 2
感谢所有建议。
非常感谢
【问题讨论】:
-
数据已经在 HPCC 上。问题是,要创建我上面描述的那种矩阵,它就像一个 1,000,000 x 1,000,000 数据帧,即使使用并行化和 HPC 也不理想。不过,如果我误解了你的建议,请纠正我。
-
我还应该补充一点,我们正在使用机密数据,因此我们可以使用或添加的软件包受到限制。任何连接到互联网的东西都是不允许的,如果我正确理解文档的话,这似乎排除了 Hadoop。
-
R 可以处理大约 2M 行(或列),因此您将不得不使用 HPC 中的聚类等方法。但是,由于您尝试执行的操作并不是特别复杂,您可能会发现
data.table包是您的最佳选择。我不确定您在坐标(即半正弦、文森蒂、欧几里得等)或比例(即英里、公里等)之间寻找什么度量标准,我只能提供一个包名字! -
一百万点?太多了,您必须计算 n(n-1)/2 距离,即约 5000 亿距离
标签: r dataframe matrix bigdata coordinates