2013-12-03 3 views
0

У меня есть матрица, в которой каждая строка представляет собой точку данных (это nxp-матрица с n p-мерными точками), и мне нужно найти, существует ли пара одинаковых точек.Поиск равных матричных строк

Только с двумя точками я могу просто применить dist, но по мере увеличения количества очков, так же как и количества сравнений, которые мне нужно делать с dist (поскольку я сравниваю только два очка за раз).

Итак, когда я начинаю использовать большие матрицы, мне нужен быстрый способ найти, если любые две точки равны (или если в этой матрице есть две одинаковые строки).

Любые предложения?

Редактировать: поскольку мне не нужно возвращать числа равных строк (мне просто нужно проверить, равны ли какие-либо два), я думаю, что я мог бы создать матрицу без дублированных строк и просто сравнить количество линий между этой матрицей и исходной матрицей. Как вы думаете?

+1

Посмотрите на функцию 'duplicated'. – juba

ответ

0

Используйте функцию unique, которая специально настроена для проверки уникальных строк или столбцов в матрице. Или, в зависимости от того, хотите ли вы сохранить уменьшенную матрицу или нет, вы можете использовать duplicated, как указывала Джуба.

+1

спасибо! Мне просто нужно использовать 'nrow (x)! = Nrow (unique (x))', и он вернет true, если есть дублированная строка! – Chesco

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 раз быстрее. Конечно, вам нужно создать ключи (сортировки), которые занимают около 10 секунд, поэтому, если вы делаете это только один раз, лучше использовать таблицу без ключа.

Смежные вопросы