Если бы у Вас есть очень немного возможных ключей, то я просто сохранил бы их как столбцы. Но если бы набор возможных ключей является большим тогда, Ваш первый подход хорош (и второй подход был бы невозможен).
Или он так, чтобы каждый объект мог только иметь конечное число ключей, но ключи могли быть чем-то от большого набора?
Вы могли также рассмотреть использование Объектного Реляционного Картопостроителя для создания запросов легче.
Функция expand.grid ()
, полезная для этого:
R> GG <- expand.grid(1:10,1:10)
R> GG <- GG[GG[,1]>=GG[,2],] # trim it to your 55 pairs
R> dim(GG)
[1] 55 2
R> head(GG)
Var1 Var2
1 1 1
2 2 1
3 3 1
4 4 1
5 5 1
6 6 1
R>
Теперь у вас есть подмножества 'n * (n + 1) / 2', и вы можете просто проиндексировать исходную матрицу .
Я не совсем понимаю, что вы делаете, поэтому просто выброшу кое-что, что может помочь, а может и не помочь.
Вот что я считаю декартовым произведением двух столбцов:
expand.grid(x[,1],x[,2])
Используя ответ Дирка:
idx <- expand.grid(1:nrow(x), 1:nrow(x))
idx<-idx[idx[,1] >= idx[,2],]
N <- cbind(x[idx[,2],], x[idx[,1],])
> all(M == N)
[1] TRUE
Всем спасибо!
Вы также можете попробовать пакет "Relations". Вот виньетка. Он должен работать следующим образом:
relation_table(x %><% x)