0

シーケンスを生成するための小さなコードがありますが、これで問題ありません。

List = Reap[
    For[i = 1, i <= 10000, i++, 
      Sow[RandomSample[Join[Table["a", {2}], Table["b", {2}]],  2]]];][[2, 1]];
Tally[List]

次の出力を与えると、

{{{"b", "b"}, 166302}, {{"b", "a"}, 333668}, {{"a", "b"}, 332964}, {{"a", "a"}, 167066}}

私の問題は、出力から周波数を抽出する方法をまだ見つけていないことです....?

助けてくれてありがとう

4

1 に答える 1

2

注: 一般に、ユーザーが作成したシンボル名を大文字で始めないでください。これらは内部関数と競合する可能性があるためです。

出力をどのように変換したいかは明確ではありません。1つの解釈は、あなたがただ欲しいということです:

{166302, 333668, 332964, 167066}

あなたが使用するコードでは、 の[[2, 1]]使用方法を知っていると思いますPart。これはその短い形式です。のドキュメントには次がPart含まれます。

リストiのいずれかがAllまたは;;である場合、そのレベルのすべての部分が保持されます。

したがって、次を使用できます。

Tally[list][[All, 2]]

以下を使用することもできます。

Last /@ Tally[list]

ジョージコメントとしてを使用できますSort。これは、データの構造上Tally、各リストの最初に表示され、各リストの長さが同じであるため、アイテムによって最初に並べ替えられます。

tally = 
 {{{"b","b"},166302},{{"b","a"},333668},{{"a","b"},332964},{{"a","a"},167066}};

Sort[tally][[All, 2]]
{167066, 332964, 333668, 166302}

データをオブジェクトのリストに変換してRuleから、事前に定義されたリストから値を取得することもできます。

rules = Rule @@@ tally
{{"b", "b"} -> 166302, {"b", "a"} -> 333668, {"a", "b"} -> 332964, {"a", "a"} -> 167066}

これらは任意の順序で指定できます。

{{"a", "a"}, {"a", "b"}, {"b", "a"}, {"b", "b"}} /. rules
{167066, 332964, 333668, 166302}

カウントしたいアイテムの特定のリストがある場合、別の手法を説明するだけで、これSowに価値があり、Reap構築できる場合があります。たとえば、次のランダムなリストを使用し"a", "b", "c", "d"ます。

SeedRandom[1];
dat = RandomChoice[{"a", "b", "c", "d"}, 50];

"a"and"c"要素のカウント:

Reap[Sow[1, dat], {"a", "c"}, Tr[#2] &][[2, All, 1]]
{19, 5}

これはそれほど高速ではありませんが、要素ごとにTally実行するよりも高速であり、構文が役立つ場合もあります。Count

于 2013-05-11T09:46:36.377 に答える