识别分类变量的独特水平

Identify unique levels of categorical variable

我有一个人员 ID 列表,以及他们在特定日期获得的药物类型。

我想创建一个变量 count,借此我可以将指标 1 分配给第一种出现的药物,将指标 2 分配给第二种独特的药物,将指标 3 分配给第三种独特的药物。当第一种药物出现在第二种和第三种药物之后时,我希望它仍然具有指标 1。同样对于独特的药物 2,它应该在整个人的整个用药史中保持值 2,药物 3 也是如此。

     +-------------------------------------+
     | p_id      date      agent_~e  count |
     |-------------------------------------|
 38. |  1001   13dec2001   thiazide       1|
 39. |  1001   12apr2002   thiazide       1|
 40. |  1001   15jul2002   thiazide       1|
 41. |  1001   28aug2002        arb       2|
 42. |  1001   26sep2002        CCB       3|
     |-------------------------------------|
 43. |  1001   26sep2002        arb       2|
 44. |  1001   10oct2002        CCB       3|
 45. |  1001   10oct2002   thiazide       1|
 46. |  1001   10oct2002        arb       2|
 47. |  1001   10dec2002        CCB       3|
     |-------------------------------------|
 48. |  1001   10dec2002        arb       2|
     +-------------------------------------+

因为每个人都有不同的药物组合,我想我需要一个相当通用的解决方案,而不是

gen count = 1 if agent_type == "thiazide". 

例如,下面是第二个人,他们的吸毒史与上面第一个人截然不同。

         +-------------------------------+
         | p_id    date        agent_t~e |
         |-------------------------------|
    207. |  2001   08jul1999   ace_inhib |
    208. |  2001   02aug1999   ace_inhib |
    209. |  2001   25aug1999   ace_inhib |
    210. |  2001   22oct1999   ace_inhib |
    211. |  2001   18nov1999         CCB |
         |-------------------------------|
    212. |  2001   18nov1999   ace_inhib |
    213. |  2001   14dec1999         CCB |
    214. |  2001   12jan2000         CCB |
    215. |  2001   03feb2000         CCB |
    216. |  2001   03feb2000         arb |
         |-------------------------------|
    217. |  2001   02mar2000         CCB |
         +-------------------------------+

"Unique" 在这里是一个常见的用词不当;严格来说,这意味着只发生一次,这根本不是你的意思。 "Distinct" 是一个更好的词:有关 Stata 上下文中的讨论,请参阅 here

请从 SSC 了解 dataex 以便能够显示可以直接复制和粘贴的数据示例。您需要一些工程才能使其易于使用。

您的问题已经是 Stata FAQ found here。在发帖前浏览常见问题解答是个好主意。

* Example generated by -dataex-. To install: ssc install dataex
clear
input float p_id str8 agent_type float(wanted date)
1001 "thiazide" 1 15322
1001 "thiazide" 1 15442
1001 "thiazide" 1 15536
1001 "arb"      2 15580
1001 "CCB"      3 15609
1001 "arb"      2 15609
1001 "CCB"      3 15623
1001 "thiazide" 1 15623
1001 "arb"      2 15623
1001 "CCB"      3 15684
1001 "arb"      2 15684
2001 "ace_inhi" 1 14433
2001 "ace_inhi" 1 14458
2001 "ace_inhi" 1 14481
2001 "ace_inhi" 1 14539
2001 "CCB"      2 14566
2001 "ace_inhi" 1 14566
2001 "CCB"      2 14592
2001 "CCB"      2 14621
2001 "CCB"      2 14643
2001 "arb"      3 14643
2001 "CCB"      2 14671
end
format date %td 

bysort p_id agent_type (date) : gen firstdate = date[1] 
egen group = group(p_id firstdate agent_type) 
bysort p_id (group date agent_type): gen count = sum(group != group[_n-1])  
assert count == wanted 

请注意,代码考虑了同一个人在同一天首次使用两种或多种药物的可能性。