2016-11-16 4 views
3

В настоящее время я борюсь с проблемой, связанной с получением всех возможных перестановок внутри группы с использованием data.table.Извлечь все возможные пары внутри группы в data.table

Чтобы объяснить мою проблему, позвольте мне показать вам пример.

x <- c(1, 1, 1, 2, 2) 
y <- c('red', 'blue', 'black', 'orange', 'red') 
dt1 <- as.data.table(cbind(x,y)) 
dt1 
    x  y 
1: 1 red 
2: 1 blue 
3: 1 black 
4: 2 orange 
5: 2 red 

Теперь я хочу видеть каждую возможную пару цветов (y) внутри группы (x). Так что мой идеальный результат был бы ....

x y1  y2 
1 black blue 
1 black red 
1 blue black 
1 blue red 
1 red  black 
1 red  blue 
2 orange red 
2 red  orange 

Чтобы найти решение для этого, я не прибегая к помощи, и я нашел функцию, перестановку, которая является то, что я ищу, но я считаю, что это трудно сжать это в рамки data.table.

y <- c('red', 'blue', 'black') 
permutations(n=3, r=2, v=y, repeats.allowed=F) 

    [,1] [,2] 
[1,] "black" "blue" 
[2,] "black" "red" 
[3,] "blue" "black" 
[4,] "blue" "red" 
[5,] "red" "black" 
[6,] "red" "blue" 

Так что я попытался сделать следующее, но очевидно, что есть ошибки ..

dt1[, .(j = lapply(.SD, permutations, n=.N, r=2, v=y, repeats.allowed=F)), by=x] 

Любое предложение для этого? Я буду очень признателен.

+2

Возможно, 'dt1 [, CJ (y, y), by = x] [V1! = V2]' – Henrik

ответ

4

Прежде всего, не используйте as.data.table(cbind(...)) для создания таблицы данных. Вы получите неожиданные классы столбцов из-за cbind, принуждающих к матрице. Используйте

dt1 <- data.table(x, y) 

Это сказало, что вы можете сделать

dt1[, { 
     p <- gtools::permutations(.N, 2, y, repeats=FALSE) 
     .(y1 = p[, 1], y2 = p[, 2]) 
    }, by = x] 

который дает

x  y1  y2 
1: 1 black blue 
2: 1 black red 
3: 1 blue black 
4: 1 blue red 
5: 1 red black 
6: 1 red blue 
7: 2 orange red 
8: 2 red orange 

Там нет необходимости в цикле, так как мы работаем на группах. permutations создает матрицу, поэтому мы создаем нужные столбцы результата из полученных столбцов матрицы permutations.

+0

Это действительно замечательно !! Большое спасибо вам! – joon