You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Stata中如何删除字符串变量冒号后前两位数字?

解决Stata中字符串变量的年份截断问题

我来帮你搞定这个字符串处理的需求!你的变量cn格式是[前缀]:[四位年份]-cv-[案件号],要去掉冒号后的前两位年份数字,下面给你两种靠谱的实现方法,还会解释你之前用substr报错的可能原因。

方法一:正则表达式(推荐,灵活通用)

用regexr()函数可以精准匹配并替换目标部分,适合这种有固定模式的字符串:

gen cn_new = regexr(cn, ":(\d{2})(\d{2})", ":\\2")

代码解释:

  • ":(\d{2})(\d{2})":匹配冒号:后面的四位数字,把它们分成两个捕获组——第一个(\d{2})是前两位年份,第二个(\d{2})是后两位年份
  • ":\\2":替换成冒号加上第二个捕获组的内容,也就是保留后两位年份

方法二:用strpos+substr组合(适合格式完全固定的场景)

如果你确定所有字符串的冒号位置是固定的(或者前缀长度不固定但想精准定位),可以先用strpos找到冒号的位置,再拼接前后部分:

* 第一步:定位冒号的位置
gen colon_pos = strpos(cn, ":")
* 第二步:拼接结果:冒号前的内容 + 冒号 + 冒号后第3位开始的所有内容
gen cn_new = substr(cn, 1, colon_pos) + substr(cn, colon_pos + 3, .)

为什么你之前用substr报错?

大概率是没正确计算起始位置!比如如果直接写死起始位置,遇到前缀长度变化(比如有的前缀是1位,有的是2位)就会出错,而用strpos动态获取冒号位置,不管前缀多长都能正确截取。

测试示例

你可以用下面的测试代码验证效果:

clear
input str20 cn
"1:2013-cv-10153"
"0:1979-cv-06704"
end

* 正则方法
gen cn_regex = regexr(cn, ":(\d{2})(\d{2})", ":\\2")

* substr方法
gen colon_pos = strpos(cn, ":")
gen cn_substr = substr(cn, 1, colon_pos) + substr(cn, colon_pos + 3, .)

list

运行后你会看到两个方法都能得到1:13-cv-10153和0:79-cv-06704的正确结果。

内容的提问来源于stack exchange,提问作者caceves

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:05:32