我有一个矩阵,其中每一行代表一个数据点(它是一个nxp矩阵,有n个p维点),我需要找出是否有一对相等的点。
只有两点,我可以申请dist
,但随着点数的增加,我需要对dist
进行比较的数量也是如此(因为我只比较两个一次点。)
所以,当我开始使用大矩阵时,我需要一种快速的方法来查找是否有两个点是相等的(或者如果这个矩阵中有两个相等的行)。
有什么建议吗?
编辑:因为我不需要返回相等行的数字(我只需要验证任何两个是否相等),我想我可以创建一个没有重复行的矩阵,只需比较行数在这个矩阵和原始矩阵之间。你觉得怎么样?
答案 0 :(得分:0)
使用unique
功能,该功能专门设置为允许您检查矩阵中的唯一行或列。或者,根据您是否要保存简化矩阵,您可以使用duplicated
作为朱巴指出。
答案 1 :(得分:0)
如果矩阵很大,请考虑使用数据表。
library(data.table)
n <- 1e6
set.seed(1)
df <- data.frame(x.1=round(runif(n,0,100)),
x.2=round(runif(n,0,100)),
x.3=round(runif(n,0,100)),
x.4=round(runif(n,0,100)))
dt <- data.table(df)
system.time(df.dupe <- duplicated(df))
# user system elapsed
# 16.55 0.01 16.60
system.time(dt.dupe <- duplicated(dt))
# user system elapsed
# 9.79 0.05 9.83
setkeyv(dt,colnames(dt))
system.time(dt.dupe <- duplicated(dt))
# user system elapsed
# 0.08 0.00 0.07
因此,没有密钥,数据表的速度提高约40%。使用按键,它们的速度提高了约160倍。当然你必须创建密钥(sort),这需要大约10秒,所以如果你只做一次,最好使用无键数据表。