获取列中元素子集的频率计数

Get frequency counts for a subset of elements in a column

我可能在 Stata 中遗漏了一些优雅的方法来得到这个例子,它与电气部件和观察到的每月故障等有关

clear
input   str3 (PartID  Type   FailType) 
ABD A 4
BBB S 0
ABD A 3
ABD A 4
ABC A 2
BBB A 0
ABD B 1
ABC B 7
BBB C 1
BBB D 0

end 

我想按 (bysort) 每个 PartID 分组并记录每个 PartID 类型中 FailType 的最高频率。领带可以任意断,最好能挑低的。

我查看了groups等,但不知道如何从结果集中剥离某些元素。所以这对我来说是一个主要问题。如果你执行一个查询,你如何 select 只有你想要的元素用于下一次计算?像 n(0) 是计数,n(1) 是平均值等。我能够使用 contractbysort 等并创建一个单独的数据集,然后我 merged 用一个额外的列返回到主集中使用 genegen 必须有一些简单的东西,这样就不需要创建额外的数据集。

The expected results here will be:
PartID Freq 
ABD 4 #(4 occurs twice)
ABC 2  #(tie broken with minimum)
BBB 0  #(0 occurs 3 times)

请告诉我如何从结果集中挑选出我需要的特定元素(可以来自重复报告,tab 等)

第二部分 - 澄清:也许我应该澄清并将问题分为两部分。例如,如果我在您的代码 运行 之后发出此后续命令:tabdisp Type, c(Freq)。它可能会打印出漂亮的 table。然后我可以使用那个(派生的)table 以编程方式执行更多计算吗?

例如获取table的第一行。

Table. ---------------------- 
Type| Freq ----------+----------- 
A | -1 
B | -1 
C | -1 
D | -3 
S | -3 
---------------------- –

我发现这很难理解(请参阅问题评论),但此处演示了一些技巧。 by: 定义的观察子集中的观察数由 _N 给出。剩下的就是排序技巧。否定频率是 select 最高频率和最低 Type 的一种方式,我认为这就是你在分裂领带时所追求的。否定回来让你得到积极的频率。

clear
input   str3 (PartID  Type   FailType) 
    ABD A 4
    BBB S 0
    ABD A 3
    ABD A 4
    ABC A 2
    BBB A 0
    ABD B 1
    ABC B 7
    BBB C 1
    BBB D 0
end 

bysort PartID FailType: gen Freq = -_N 
bysort PartID (Freq Type) : gen ToShow = _n == 1
replace Freq = -Freq 
list PartID Type FailType Freq  if ToShow  

     +---------------------------------+
     | PartID   Type   FailType   Freq |
     |---------------------------------|
  1. |    ABC      A          2      1 |
  3. |    ABD      A          4      2 |
  7. |    BBB      A          0      3 |
     +---------------------------------+