我试图在 Stata 中创建虚拟变量,如果
dx1
到 dx25
中的任何一个变量以特定字符串开头,则该变量为 1。我知道我可以使用如下所示的方法来完成此操作,但对于所有 25 个 dx
变量:
gen dummy=0
replace dummy=1 if substr(dx1,1,4)=="6542" | substr(dx2,1,4)=="6542"
然后,如果任何
dx
以这些开头,我将创建等于 1 的其他虚拟对象:
6542 6522 6696 6410 6411 6412 6630 218 6426 459 490 491 492 493 494 495 496 9971 250 2810 28249 05410 054 657 V27.2 V27.3 V27.4 V27.5 V27.6 V27.7
我一直在尝试找出一种更有效、更优雅的方法来做到这一点。
数据结构示例(由于篇幅原因,我将其保留到
dx1
到dx5
):
+---------------------------------------+
| dx1 dx2 dx3 dx4 dx5 |
|---------------------------------------|
1. | 65421 V270 |
2. | 65221 65801 64232 65951 64892 |
3. | 64511 V270 |
4. | 64781 V270 |
5. | 65571 66331 64891 340 V270 |
|---------------------------------------|
6. | 66401 67202 66331 V270 |
7. | 66411 V270 V1321 |
8. | 65571 V270 V5864 |
9. | 65421 V270 V252 |
10. | 64511 64231 66331 66401 V270 |
|---------------------------------------|
11. | 65651 66401 V270 |
12. | 650 V270 |
13. | 64881 66541 66331 V270 V161 |
14. | 66311 65971 V270 |
15. | 64781 V270 V1589 |
|---------------------------------------|
16. | 65571 66191 V270 |
17. | 64241 66401 V270 |
18. | 66031 65971 66071 V270 |
19. | 64841 66401 30520 V270 |
+---------------------------------------+
我首先尝试让事情顺利进行。之后,如果它对于我的需求来说效率太低(有时甚至在美观上令人不愉快),我会尝试以不同的方式解决问题。按照你的思路,为什么不尝试循环:
clear all
set more off
*----- Example data -----
input ///
str10(dx1 dx2 dx3 dx4 dx5)
65421 V270
65221 65801 64232 65951 64892
64511 V270
64781 V270
65571 66331 64891 340 V270
66401 67202 66331 V270
66411 V270 V1321
65571 V270 V5864
65421 V270 V252
64511 64231 66331 66401 V270
65651 66401 V270
650 V270
64881 66541 66331 V270 V161
66311 65971 V270
64781 V270 V1589
65571 66191 V270
64241 66401 V270
66031 65971 66071 V270
64841 66401 30520 V270
end
list in 1/15
*----- what you want -----
local li "6542 6522 6696 6410 6411 6412 6630 218 6426 459 490 491 492 493 494 495 496 9971 250 2810 28249 05410 054 657 V27.2 V27.3 V27.4 V27.5 V27.6 V27.7"
quietly foreach val of local li {
local tname = strtoname("ind`val'")
gen byte `tname' = 0
foreach var of varlist dx* {
replace `tname' = 1 if substr(`var',1,4) == "`val'"
}
}
browse
我使用感兴趣的字符串来命名指标变量(您称它们为虚拟变量)。因为某些字符串会产生非法的 Stata 名称,所以我使用
strtoname()
函数。当然,这个命名约定不是强制性的。
正在进行的评估比实际需要的要多,但可能就足够了。对于
local li
的每个元素,在执行第一个 replace
后无需再进行评估。但代码会检查 all dx
变量。
也许有更好的方法来实现你的最终结果,但你没有说那是什么。这似乎只是一些中间步骤。
运行
help <command_or_function>
了解具体语法的详细信息。
(请注意,在您的原始帖子中
list dx1 dx2 dx3 dx4 dx5 in 1/20
比
更有效率list dx1 dx2 dx3 dx4 dx5 if _n<20
因为 Stata 不需要检查数据库中的每个观测值是否满足
if
条件。它只是列出了前 20 个观察结果。)
我想我也有类似的问题。我有一个对 ICD 代码进行多次观察的变量 (I20.xxxx)。我只知道I20和其他代码,但不知道句号后面的数字(这就是我使用的I20.xxxx)。我想要一个代码来保留以 I20(和其他特定代码)开头的所有观察结果,无论 (.xxxx) 之后是什么。有人可以帮忙吗?