我想用>100000个不同的观测值将我的变量Ucod以一个新变量的形式重新编码到3-4个分类值中。
问题是,我不想输入Ucod的所有值来重新编码。例如,我希望使用一个if条件,比如Ucod中的任何值都以I (例如,I234、I345、I587)开头,将整个值重新编码为CVD。
我尝试使用不同的条件使用strpos()函数,但没有成功。
附加我的数据和变量Ucod的图片

发布于 2022-11-01 12:28:44
您只需使用gen和一系列replace命令:
gen ucod_category = 0 if ucod >= "I00" & ucod <= "I519"
replace ucod_category = 1 if ucod >= "I60" & ucod <= "I698"然后将这些类别标记为CVD、Stroke等。这应该按照您的I10代码中缺少小数点的预期方式进行排序。"I519“< "I60")
但是,将ucod转换为一个数字可能更方便( A的第一个数字0,B的1)。这样您就可以在一个命令中使用标签对其进行重新编码:
gen ucod_numeric = (ascii(substr(ucod, 0, 1)) - 65) * 1000 + real(substr(ucod, 1)) / cond(strlen(ucod) == 4, 10, 1)
recode ucod_numeric (800/851.9=0 "CVD") (860/869.8=1 "Stroke"), generate(ucod_category) 同样,这应该按照预期的顺序排序: I519 (变为851.9) < I60 (860)。
编辑:由于ascii不起作用(可能是Stata版本问题),您可以尝试这样的方法将字母更改为数字。
gen ucod_letter_code = -1
forvalues i = 0/25 {
replace ucod_letter_code = `i' if substr(ucod, 1) == char(`i' + 65)
}
gen ucod_numeric = ucod_letter_code * 1000 + real(substr(ucod, 1)) / cond(strlen(ucod) == 4, 10, 1)
recode ucod_numeric (800/851.9=0 "CVD") (860/869.8=1 "Stroke"), generate(ucod_category) https://stackoverflow.com/questions/74275321
复制相似问题