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

だろうそれをdata.tableフレームワークに変換します。

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

...このための任意の提案を

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" 

は、だから私は、次の操作を実行しようとしたが、明らかにそれはエラーを持っていますか? 本当に感謝します。

+2

恐らく 'dt1 [、CJ(y、y)、by = x] [V1!= V2]' – Henrik

答えて

4

最初に、as.data.table(cbind(...))を使用してデータテーブルを作成しないでください。行列に強制的に強制するcbindのため、予期しない列クラスが発生します。言っ

dt1 <- data.table(x, y) 

使用し、あなたは

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 

私たちはグループで動作しているので、ループする必要はありませんを与える

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

行うことができます。 permutationsは行列を作成するので、結果の行列列permutationsから目的の結果列を作成します。

+0

これは本当に素晴らしいです!!あなたに多くのおかげで! – joon

関連する問題