2016-01-14 5 views
1
x <- letters[1:4] 
x 
# [1] "a" "b" "c" "d" 

t(combn(x, 2)) 
# [,1] [,2] 
# [1,] "a" "b" 
# [2,] "a" "c" 
# [3,] "a" "d" 
# [4,] "b" "c" 
# [5,] "b" "d" 
# [6,] "c" "d" 

Как написать код, если я также и какие обратные комбинации с b-a, c-a ... d-c. Всего 12 комбинаций.Возможные комбинации вектора по порядку

+1

Чтобы получить все 16 комбинаций вы можете использовать 'expand.grid (Rep (список (буквы [1: 4]), 2))'. Если вы не хотите тех, где Var1 == Var2, вы можете использовать 'subset (expand.grid (rep (список (буквы [1: 4]), 2)), Var1! = Var2)' –

+0

'library (gtools); перестановки (длина (x), 2, x, repeats = FALSE) ' –

ответ

3

Вы можете использовать expand.grid из базы R, чтобы получить все возможные комбинации вектора (т.е. 16 комбинаций), а затем использовать subset (или [.data.frame), так что значения в обоих столбцах никогда не равны в строке (в результате ожидаемые 12 комбинаций):

x <- letters[1:4] 
subset(expand.grid(rep(list(x),2)), Var1 != Var2) 
# Var1 Var2 
#2  b a 
#3  c a 
#4  d a 
#5  a b 
#7  c b 
#8  d b 
#9  a c 
#10 b c 
#12 d c 
#13 a d 
#14 b d 
#15 c d 

альтернативный кросс-присоединиться) функции data.table «s (CJ:

libraray(data.table) 
CJ(x, x)[V1 != V2] 
# V1 V2 
# 1: a b 
# 2: a c 
# 3: a d 
# 4: b a 
# 5: b c 
# 6: b d 
# 7: c a 
# 8: c b 
# 9: c d 
#10: d a 
#11: d b 
#12: d c 
3

пакета gtools имеет функцию permutations.

x <- letters[1:4] 
library(gtools) 
permutations(length(x), 2, x, repeats = FALSE) 
#  [,1] [,2] 
# [1,] "a" "b" 
# [2,] "a" "c" 
# [3,] "a" "d" 
# [4,] "b" "a" 
# [5,] "b" "c" 
# [6,] "b" "d" 
# [7,] "c" "a" 
# [8,] "c" "b" 
# [9,] "c" "d" 
# [10,] "d" "a" 
# [11,] "d" "b" 
# [12,] "d" "c" 
1

Другой вариант с dplyr/tidyr

library(dplyr) 
library(tidyr) 
data_frame(x1=x,x2=x) %>% 
     expand(x1, x2) %>% 
     filter(x1!=x2) 
#  x1 x2 
# (chr) (chr) 
#1  a  b 
#2  a  c 
#3  a  d 
#4  b  a 
#5  b  c 
#6  b  d 
#7  c  a 
#8  c  b 
#9  c  d 
#10  d  a 
#11  d  b 
#12  d  c