2

私は2つの列を持つテーブルを持っています:

aaa     bbb
a1      b2
a1      b6
a1      b2
a1      b2
a1      b5
a1      b6
a2      b2
a2      b2
a2      b2
a2      b6
a2      b6
a2      b5

これらの列はいずれも、ソート済みと見なされるべきではありません。私がやろうとしているのは、与えられた aaa に aaa,bbb の組み合わせがいくつ存在するかを数える最もエレガントな方法を見つけることです。次に、最も人気のある組み合わせ (100 と言う) を取り、残りのすべての組み合わせ (10 と言う) の合計を引きます。人気のあるものよりも少ないと予想されます。出力は、要素 aaa と、これら 2 つの数値の差になります。たとえば、上記の出力は次のようになります。

var     cnt
a1      0
a2      0

何か案は?

4

2 に答える 2

5

ここに使用する1つの方法がありますdata.table

require(data.table)
DT <- data.table(df) # where df is your data.frame
setkey(DT[, .N, by=list(aaa, bbb)], aaa, N)[, list(cnt = 
                                      N[.N]-sum(N[-.N])), by=aaa]

   aaa cnt
1:  a1   0
2:  a2   0

アイデアは、最初に各組み合わせのカウントを取得することです。これは、次の方法で実現されます。

OUT <- DT[, .N, by = list(aaa, bbb)]
# which gives you: 
   aaa bbb N
1:  a1  b2 3
2:  a1  b6 2
3:  a1  b5 1
4:  a2  b2 3
5:  a2  b6 2
6:  a2  b5 1

この後、setkeyaaaNを使用して、デフォルトで並べ替えます (ここでキーを設定する唯一の目的です)。

OUT <- setkey(DT[, .N, by=list(aaa, bbb)], aaa, N)
# which gives you:
  aaa bbb N
1:  a1  b5 1
2:  a1  b6 2
3:  a1  b2 3
4:  a2  b5 1
5:  a2  b6 2
6:  a2  b2 3

ソートされたので、列aaaで分割/グループ化して、最後のcnt列を取得できます。Nはソートされるため、最大値は常に最後になります。したがって、列aaaN[.N]でグループ化しながら、最後の値を取り、残りの値の合計でそれを減算します。これが最後の部分です:N[-.N]

OUT[, list(cnt = N[.N]-sum(N[-.N])), by=aaa]

達成します。これらすべてのコマンドを連鎖させることも (私が行ったように)、別のステップに分割することもできます (説明のために示したように)。それはあなたの選択です。

注: aaa、bbbの複数の組み合わせで同じ最大値が発生した場合、これは負の値になります。

于 2013-08-09T11:54:19.017 に答える