2016-11-16 14 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 

現在我想看看組(x)中的每個可能的顏色對(y)。所以,我理想中的結果將是....

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 

要找到一個解決方案,我沒有Google上搜尋它,我發現一個函數,排列,這正是我期待的,但我覺得很難擠它進入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