如何在Stata中提取无组织字符串变量的组件?

时间:2016-12-22 06:20:04

标签: stata

我有一个文本变量显示患者处方看起来很乱这样:

PatientRx

 ACETAZOLAMIDE        250MG TABLET- 100  
ADAPALENE + BENZOYL  0.1% + 2.5% GEL-..    
ADRENALINE/EPIPEN    300MCG/0.3ML INJ..  
ALENDRONATE + COLECA 70MG + 140MCG TA..    
 ALLOPURINOL          100MG TABLET- 100  
ALUM HYDROX + MAG HY 250+120+120MG/5M..  
AMILORIDE + HYDROCHL 5MG + 50MG HCL T..

虽然我没有查看所有这些值,但可能会出现一些模式:

  • 通常有一种以上的药物,它们是分开的,例如空间和正斜线。
  • 药物也用加号分开。但在剂量之间也使用加号。
  • 与空间相关的规则在入口的开头和中间都是非常随意的。

如何仅将药物名称提取到新变量中?新变量应如下所示:

Newvar1           Newvar2  
ACETAZOLAMIDE  
ADAPALENE         BENZOYL  
ADRENALINE        EPIPEN  
ALENDRONATE       COLECA

等等。

1 个答案:

答案 0 :(得分:1)

对于正则表达式,有些会达到第一,您可能确实需要完整的问题。另请注意moss安装的ssc install moss

但这似乎最容易,鉴于此处示例中的信息,我们必须继续,查找第一个数字0到9的位置,然后解析之前的内容。我不知道药品名称是否包含数字。

clear 
input str40 sandbox 
" ACETAZOLAMIDE        250MG TABLET- 100"  
"ADAPALENE + BENZOYL  0.1% + 2.5% GEL-"    
" ADRENALINE/EPIPEN    300MCG/0.3ML INJ"  
"ALENDRONATE + COLECA 70MG + 140MCG TA"    
" ALLOPURINOL          100MG TABLET- 100"  
"ALUM HYDROX + MAG HY 250+120+120MG/5M"  
" AMILORIDE + HYDROCHL 5MG + 50MG HCL T"
end 

gen wherenum = . 
quietly forval j = 0/9 { 
    replace wherenum = min(wherenum, strpos(sandbox, "`j'")) if strpos(sandbox, "`j'") 
}
gen drug = substr(sandbox, 1, wherenum - 1) 

split drug, parse(+ /) 

l drug?, sep(0) 

     +---------------------------+
     |         drug1       drug2 |
     |---------------------------|
  1. | ACETAZOLAMIDE             |
  2. |    ADAPALENE      BENZOYL |
  3. |    ADRENALINE      EPIPEN |
  4. |  ALENDRONATE       COLECA |
  5. |   ALLOPURINOL             |
  6. |  ALUM HYDROX       MAG HY |
  7. |    AMILORIDE     HYDROCHL |
     +---------------------------+