【问题标题】:Calculate large number of permutations in R计算R中的大量排列
【发布时间】:2018-11-05 12:50:49
【问题描述】:

我在 R 中有 2 个大型数据框,它们都有大约 100k 行,其中包含地理坐标列表(纬度/经度)。我希望遍历它们以获取项目之间的所有组合,然后对其应用函数。

因为组合的数量大约是 110 亿(11 x 1.000.000.000),所以我最初使用循环的想法不适用。

数据框类似于:

A<-as.data.frame(cbind(rbind(-0.1822,-0.4419,0.2262),rbind(51.5307,51.4856,51.4535)))

(...)
<!-- -->

V1 . V2

-0.1822 . 51.5307 

-0.4419 . 51.4856

 0.2262 . 51.4535

B<- as.data.frame(cbind(rbind(-0.4764,-0.2142,-0.2197),rbind(51.5221,51.4593,51.5841))) 
(...)
<!-- -->

V1 . V2

-0.4764 . 51.5221

-0.2142 . 51.4593

-0.2197 . 51.5841

我希望输出看起来像:

V1a .   V2a .   V1b .   V2b


-0.1822 . 51.5307 . -0.4764 . 51.5221  

-0.4419 . 51.4856 . -0.4764 . 51.5221

 0.2262 . 51.4535 . -0.4764 . 51.5221

-0.1822 . 51.5307 . -0.2142 . 51.4593

-0.4419 . 51.4856 . -0.2142 . 51.4593

(...)

stackoverflow 中的另一篇文章([a link]Calculating great-circle distance matrix)建议使用:

应用(A, 1, FUN=function(X) distHaversine(X, B))

但是,我怀疑创建的矩阵太大而无法完成计算。

关于如何有效解决这个问题的任何想法?请记住,此后我的目标是应用 Haversine 函数来计算点之间的距离。

谢谢 J

【问题讨论】:

  • 你试过combn()吗?
  • 是的,我看过它,但并不完全奏效。您使用它的方法是什么?最好的问候
  • 顺便说一句 cran.r-project.org/web/packages/geodist/index.html 可以在这里为您提供帮助。
  • 两个data.frames都只包含数字吗?
  • 是的,这些都是数字

标签: r combinations permutation large-data geosphere


【解决方案1】:
cmb<-expand.grid(1:nrow(A),1:nrow(B))
cbind(A[cmb[,1],],B[cmb[,2],])

与 Andre 的解决方案不同,这不会在 A 和 B 中创建列的组合(他创建了 81 行,而对于此示例,只需要 9 行)。不过,不确定这是否适用于更大的数据集。

【讨论】:

  • 谢谢你,这是一个很好的呼喊,但实际上,对于更大的数据集,它会耗尽内存:“错误:向量内存耗尽(达到限制?)”
  • 可能是您的系统根本无法处理这么大的文件。解决此问题的一种方法是分几个部分执行此操作,并且每次都保存到一个文件中。通过在 cmb 中循环几个断点,我的解决方案可以很容易地实现这一点。
  • 谢谢,@iod,是的,我正在运行该试用版,它看起来运行良好,至少目前是这样。也就是说,它不会让机器太慢。
  • 太棒了。如果它对您有用,请不要忘记投票并接受。
【解决方案2】:

你想要的是:

# expand.grid(A$V1,A$V2,B$V1,B$V2)
expand.grid(cbind(A,B))

但是正如你所知道的,结果会非常大,所以我不确定你的代码是否会运行。

【讨论】:

  • 嗨,是的,expand.grip 也是我想到的第一个例子。出现以下错误:“rep.int(rep.int(seq_len(nx), rep.int(rep.fac, nx)), orep) 中的错误:'times' 值无效”
  • 您的示例数据和我的解决方案是否出错?
  • 它适用于样本数据集,而不适用于具有较大数据的实时数据集。
  • @JoCosta 发布 str(df1) 和 str(df2) 的结果
猜你喜欢
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
相关资源
最近更新 更多