0

データ内のアイテムの一意のグループを分離しようとしています-一意のアイテムではなく、キー列に関連付けられた行の一意のグループであり、一意の関数を最も使用するものです。質問は注意深く読む必要があります...そのため、最初に例を理解してください。

明確にするために、 group 列の一意のサブセットは必要ありません。項目の一意のサブセットも、 groups と items の一意の組み合わせも必要ありません。これらは他の場所でカバーされていることを知っていますが、複数の variable に対して unique() . 私が欲しいのは、アイテムの一意のセットであり、セットは groups によって定義されます

ここに例があります

set.seed(1234)
library(data.table)
A <- data.table(group = rep(c("A","B","C","D","E","F"),each = 4), 
item =  c(1, 2, 4, 3, 5, 2, 3, 6, 10, 12, 1, 2, 1, 2, 4, 3, 6, 3,
 5, 2, 10, 12, 1, 2), c = runif(8))
A <- A[-23, ] #so we can have an example of unbalanced groups
> A
    group item          c
 1:     A    1 0.15904600
 2:     A    2 0.03999592
 3:     A    4 0.21879954
 4:     A    3 0.81059855
 5:     B    5 0.52569755
 6:     B    2 0.91465817
 7:     B    3 0.83134505
 8:     B    6 0.04577026
 9:     C   10 0.15904600
10:     C   12 0.03999592
11:     C    1 0.21879954
12:     C    2 0.81059855
13:     D    1 0.52569755
14:     D    2 0.91465817
15:     D    4 0.83134505
16:     D    3 0.04577026
17:     E    6 0.15904600
18:     E    3 0.03999592
19:     E    5 0.21879954
20:     E    2 0.81059855
21:     F   10 0.52569755
22:     F   12 0.91465817
23:     F    2 0.04577026

#The unique groups are A:F, and the unique items are 1:6,10,12. 
#The unique sets of items are: # (set1) 1,2,3,4; (set2) 5,2,3,6; 
#(set3) 10,2,1,2; (set4) 10,12,2

これらの一意のアイテム セットを取得したいと考えています (アイテム セットはグループによって形成されていることに注意してください)。(3 番目の列は、現時点ではほとんど意味がありません。楽しみのために、各「アイテム」ごとの合計を含めます)。出力テーブルは次のようになります。

group item c 
A 1 0.68474355 #note that groups A and D share this same set of items (set1) 
A 2 0.95465409
A 4 1.05014459# c sums groupAitem4$c with groupDitem4$c
A 3 0.85636881
B 5 0.74449709 # group E has the same items (set2), even if not the same order, c is totaled by item.
B 2 1.72525672
B 3 0.87134097
B 6 0.20481626
C 10 0.159046
C 12 0.03999592
C 1 0.21879954
C 2 0.81059855
F 10 0.52569755 #Not the same as group C
F 12 0.91465817
F 2 0.04577026

かなりぎこちない整形を経る方法があるのではないかと思います。私のデータは大きいので、効率的な手順などdata.tableは非常にありがたいです。

4

3 に答える 3

0

組み合わせが必要な場合

unique(dataset[, c("group", "item")]) 
于 2013-08-27T13:21:01.067 に答える
0

set.seed や dput を使用しないため、コードを使用しようとするすべての人が異なる結果を得ます。これにより、必要なものが得られる可能性がありますが、現時点では、グループ内のアイテムの数が常に少ないかどうか、および必要なのが 2way の組み合わせのみであるかどうかは不明です。

unique(t(do.call(cbind, tapply(A$item, A$group, combn, 2) ) )  )

このcombn関数は一意の組み合わせを列形式で返すためunique、デフォルトで行を操作する前に転置する必要がありました。列指向の結果を処理できる場合は、MARGIN 引数を使用すると、その手順をスキップできます。

unique(do.call(cbind, tapply(A$item, A$group, combn, 2) )  , MARGIN=2)
于 2013-08-27T14:53:50.990 に答える