识别分类变量的独特水平
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
请注意,代码考虑了同一个人在同一天首次使用两种或多种药物的可能性。
我有一个人员 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
请注意,代码考虑了同一个人在同一天首次使用两种或多种药物的可能性。