Stata串范围清洁

Stata串范围清洁,stata,Stata,我正在清理Stata中的一个字符串变量,该变量具有数值,但偶尔会将值格式化为一个范围,如1-50或1-3等 当我试图销毁这些变量时,这些讨厌的范围阻止我这么做 我想做的是将范围替换为范围中第一个数字和最后一个数字的平均值。我已尝试使用以下字符串函数来执行此操作: replace `var' = ((regexs(1) + regexs(3))/2) if regexm(`var', "([0-9]*)([\-])([0-9]*)") 但是,Stata无法理解平均值((regexs(1)+reg

我正在清理Stata中的一个字符串变量,该变量具有数值,但偶尔会将值格式化为一个范围,如
1-50
1-3

当我试图销毁这些变量时,这些讨厌的范围阻止我这么做

我想做的是将范围替换为范围中第一个数字和最后一个数字的平均值。我已尝试使用以下字符串函数来执行此操作:

replace `var' = ((regexs(1) + regexs(3))/2) if regexm(`var', "([0-9]*)([\-])([0-9]*)")
但是,Stata无法理解平均值
((regexs(1)+regexs(3))/2)
,因为它将
regexs(1)
regexs(2)
读作子字符串

我知道我可以通过创建新变量来实现这一点,但是我正在处理的数据有数千个变量,所以我更愿意只替换现有的字符串

有什么办法吗


提前感谢

这里有一种方法可以在适用的情况下将字符串拆分为2个并对其进行解压:

#delimit;
clear;

set obs 4;

input str4 x str4 y;
"13" "4-7";
"1-50" "7";
"1-3"  "9-20";
""     "4";

foreach var of varlist x y {;
    split `var', parse("-") destring;
    egen clean_`var' = rowmean(`var'1 `var'2);
    drop `var'1 `var'2;
};
您可以使用
real()
将字符串转换为数字

clear
set more off

input ///
str6 range
"1-50"
"1-3"
end

list

gen range2 = (real(regexs(1)) + real(regexs(3)))/2 if ///
    regexm(range, "([0-9]*)([\-])([0-9]*)")

list

然而,如果正则表达式不是严格需要的(我不能确定),我会使用
split
,迪米特里已经指出了这一点。注意,我生成了一个新变量。摆脱原来的,一般来说,不是好的做法

另一种方法是(从字符串变量
mystring
开始)


对于那些精通正则表达式语法的人来说,这种方法很普通,但对于其他人来说,它更容易思考

谢谢。事实上我从来没有这样用过,但这很有道理。不客气。如果答案能解决你的问题,你可以接受/赞成。请参阅。注意,有时对于范围,更好的猜测是几何平均值,只要两个值均为正值。(数千个变量或数千个值?)!数字有时可能是负数,我有大约1500个变量,而不是值
gen myst = subinstr(mystring, "-", " ", .) 
assert inlist(wordcount(myst), 1, 2) 
gen mynumeric = cond(word(myst, 2) == "", real(word(myst, 1)), (real(word(myst,1)) + real(word(myst, 2))/2)