【发布时间】:2014-07-03 07:57:12
【问题描述】:
我必须在大约 10MM 值的向量中找到 1MM 数值的索引。我找到了包fastmatch,但是当我使用函数fmatch() 时,我只返回了第一个匹配项的索引。
有人可以帮助我使用此功能查找所有值,而不仅仅是第一个吗?我意识到这是一个基本问题,但在线文档非常稀少,fmatch 大大减少了计算时间。
非常感谢!
这是一些示例数据 - 出于本练习的目的,我们将此数据框称为 A:
DateTime Address Type ID
1 2014-03-04 20:21:03 982076970 1 2752394
2 2014-03-04 20:21:07 98174238211 1 2752394
3 2014-03-04 20:21:08 76126162197 1 2752394
4 2014-03-04 20:21:16 6718053253 1 2752394
5 2014-03-04 20:21:17 98210219176 1 2752510
6 2014-03-04 20:21:20 7622877100 1 2752510
7 2014-03-04 20:21:23 2425126157 1 2752510
8 2014-03-04 20:21:23 2425126157 1 2752510
9 2014-03-04 20:21:25 701838650 1 2752394
10 2014-03-04 20:21:27 98210219176 1 2752394
我想做的是找到每个Address 的唯一Type 值的数量。有几百万行数据具有大约 1MM 的唯一地址值……平均而言,每个地址在数据集中出现大约 6 次。而且,尽管上面列出的 Type 值都是 1,但它们可以取 0:5 之间的任何值。我还意识到Address 的值很长,这增加了匹配所需的时间。
我尝试了以下方法:
uvals <- unique(A$Address)
utypes <- matrix(0,length(uvals),2)
utypes[,1] <- uvals
for (i in 1:length(unique(Address))) {
b <- which(uvals[i] %in% A$Address)
c <- length(unique(A$Type[b]))
utypes[i,2] <- c
}
但是,上面的代码效率不高 - 如果我循环超过 1MM 的值,我估计这需要 10-15 小时。
我也在循环中尝试过这个......但速度并不快。
b <- which(A$Address == uvals[i])
我知道有一种更优雅/更快的方法,我对 R 相当陌生,希望能提供任何帮助。
【问题讨论】: