2013-06-10 2 views
3

У меня есть следующий результат расширения сетки (половину!):Как expand.grid со строковыми элементами

< д - expand.grid (с ("х", "у", "г «), с (» х»,„у“,„г“))

Примечание вектора может быть длиннее, чем 3, и длиной строки может быть больше или различного рисунок?

То, что я хочу, чтобы создать комбинацию строк , но только половина из всех комбинаций:

Var1 Var2 
1 x x 
2 y x 
3 y y 
4 z y 
5 x z 
6 z z 

ответ

4

Вы можете избавиться от дубликатов (x - y == y - x) по первому сортировка строк в ваших данных, а затем избавившись от дублей с помощью duplicated:

d2 = t(apply(d, 1, sort)) 
d2[!duplicated(d2),] 
    [,1] [,2] 
[1,] "x" "x" 
[2,] "x" "y" 
[3,] "x" "z" 
[4,] "y" "y" 
[5,] "y" "z" 
[6,] "z" "z" 

в качестве альтернативы, вы можете использовать combn чтобы получить комбинации, то вам нужно всего лишь несколько попыток данных, чтобы получить то, что вам нужно:

levs = c("x", "y", "z") 
comb_level1 = combn(levs, 1) 
comb_level2 = combn(levs, 2) 
t(cbind(rbind(comb_level1, comb_level1), comb_level2)) 
    [,1] [,2] 
[1,] "x" "x" 
[2,] "y" "y" 
[3,] "z" "z" 
[4,] "x" "y" 
[5,] "x" "z" 
[6,] "y" "z" 

Я думаю, что решение с использованием duplicated лучше.

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