首页 > 解决方案 > 是否有更有效的匹配版本来搜索数字的重复排列?

问题描述

我有一个包含 20 行和 n 列的数据集。我最初使用 n=10000,但发现我需要使用更大的数字,可能超过十倍。该数据集的每一列都是独立于其他列生成的,并且包含从 1 到 20 的整数的随机但有偏差的排列。我希望将每个数字在整个数据集中的位置求和。换句话说,我想知道对于每个 a 和 b,数字 a 在第 b 个位置出现了多少次(即我的最终结果是一个 20*20 的值表)。

我相信我已经有了实现这个目标的代码。例如,我的计算机在两分钟内处理了整个 n=10000 原因(即,它为我提供了每个 a 和 b 的计数)。但是,n=100000 和较小的 n=50000 都花了很长时间,以至于我的耐心耗尽了。我的大部分代码都非常简单,我相信效率低下是在match以下几行中的使用(如上所述,a是数据集):bndata

list<-c()
  for(k in 1:n)
  {
    position<-match(a, data[,k])
    list<-c(list,position)
  }
  return(sum(list==b))

我该如何改进呢?match 似乎是出了名的慢,但我见过的所有解决方案(示例)既不是通用解决方案,也不适用于这种情况。

如果您希望对您的解决方案进行基准测试,replicate(n,sample(20))将生成与我的数据集类似的列表。

标签: roptimizationindexingmatch

解决方案


我认为主要的瓶颈是你正在增加循环中向量的大小。尝试在循环之前对其进行初始化并在向量中分配值。

list_vec <- numeric(length = n)

for(k in 1:n) {
  list_vec[k] <- match(a, data[,k])
}

或使用sapply

sapply(data, function(x) match(a, x))

推荐阅读