我有一小段代码来生成序列,这没关系。
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}}
我的问题是我还没有找到从输出中提取频率的方法....?
提前感谢您提供任何帮助
答案 0 :(得分:2)
注意:通常不要使用大写字母启动用户创建的符号名称,因为这些名称可能与内部函数冲突。
我不清楚你希望如何转换输出。一种解释是你只想要:
{166302, 333668, 332964, 167066}
在您的代码中使用[[2, 1]]
,因此我假设您知道如何使用Part
,这是一种简短形式。 Part
的文档包括:
如果 i 列表中的任何一个是
All
或;;
,则会保留该级别的所有部分。
因此您可以使用:
Tally[list][[All, 2]]
你也可以使用:
Last /@ Tally[list]
作为george评论,您可以使用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"
和"c"
元素:
Reap[Sow[1, dat], {"a", "c"}, Tr[#2] &][[2, All, 1]]
{19, 5}
这不如Tally
快,但它比为每个元素执行Count
要快,有时语法很有用。