r - 是否有更有效的匹配版本来搜索数字的重复排列?
问题描述
我有一个包含 20 行和 n 列的数据集。我最初使用 n=10000,但发现我需要使用更大的数字,可能超过十倍。该数据集的每一列都是独立于其他列生成的,并且包含从 1 到 20 的整数的随机但有偏差的排列。我希望将每个数字在整个数据集中的位置求和。换句话说,我想知道对于每个 a 和 b,数字 a 在第 b 个位置出现了多少次(即我的最终结果是一个 20*20 的值表)。
我相信我已经有了实现这个目标的代码。例如,我的计算机在两分钟内处理了整个 n=10000 原因(即,它为我提供了每个 a 和 b 的计数)。但是,n=100000 和较小的 n=50000 都花了很长时间,以至于我的耐心耗尽了。我的大部分代码都非常简单,我相信效率低下是在match
以下几行中的使用(如上所述,a
是数据集):b
n
data
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))
将生成与我的数据集类似的列表。
解决方案
我认为主要的瓶颈是你正在增加循环中向量的大小。尝试在循环之前对其进行初始化并在向量中分配值。
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))
推荐阅读
- javascript - 语音合成在浏览器启动后首次加载时不会在谷歌浏览器中暂停
- c++ - C++17:显式转换函数 vs 显式构造函数 + 隐式转换——规则改变了吗?
- sql-server - 为什么从 sqlserver 中删除记录时 Elasticsearch 没有更新
- c# - 使用依赖注入时如何将通用接口解析为通用实现?
- java - Java 8 列表
到地图 >> - google-chrome - 如何解决现代浏览器的缓存问题?
- javascript - jQuery.scrollSpeed 脚本根本不允许我滚动
- web-services - Apache CXF WebServices 的 Websphere 安全配置
- android - 打开 Drive 应用程序以创建文件并取回链接
- javascript - 在保留类类型的同时为嵌套对象反应 setState