Stata - 如果列表的任何字符串变量以特定字符开头,则生成虚拟变量

问题描述 投票:0回答:2

我试图在 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         |
     +---------------------------------------+
string substring stata dummy-data
2个回答
4
投票

我首先尝试让事情顺利进行。之后,如果它对于我的需求来说效率太低(有时甚至在美观上令人不愉快),我会尝试以不同的方式解决问题。按照你的思路,为什么不尝试循环:

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 个观察结果。)


0
投票

我想我也有类似的问题。我有一个对 ICD 代码进行多次观察的变量 (I20.xxxx)。我只知道I20和其他代码,但不知道句号后面的数字(这就是我使用的I20.xxxx)。我想要一个代码来保留以 I20(和其他特定代码)开头的所有观察结果,无论 (.xxxx) 之后是什么。有人可以帮忙吗?

© www.soinside.com 2019 - 2024. All rights reserved.