楼主: 大炮0515
16188 11

[数据管理求助] 请问Stata有没有命令是直接可以从字符串中提取数字的? [推广有奖]

11
jzhyue 发表于 2019-3-13 09:26:06
*就示例而言
real(regexs(1))  if regexm(Event, "([.0-9]+)")

12
赵安豆 发表于 2024-6-26 10:59:39
在Stata中,可以使用`regexp()`函数来从字符串中提取数字。以下是一个示例命令序列,用于处理您给出的数据:

```
clear all
input str25 line
"Event"
"XXX公司社保基金金额为40.3万元"
"XX公司环保投入额为300.09万元"
"X工程在建工程费用为405.9万元"
end

gen num = .
foreach x of numlist _N {
  regsubf(line[`x'], "[^[:digit:].]", "", g temp)
  replace num = temp if _n == `x'
}

* 此步骤将包含数字的字符串转换成数值类型
replace num = float(num)

list line num
```

上述命令首先创建一个含有示例文本的数据集,然后使用`regsubf()`函数从每一行中提取数字(包括小数点)。注意这里的正则表达式"[^[:digit:].]"用于匹配任何非数字和非点的字符,并用空字符串替换它们。最后一步是将提取到的字符串转换为数值类型。

但是,这种方法可能在一些复杂的情况下会失败,例如当字符串中含有多个数字时或文本内容中包含其他特殊符号。对于更复杂的模式,建议使用`regexm()`和`regexs()`函数来实现更精确的数据处理。

以下是使用正则表达式提取数字的示例:

```
clear all
input str25 line
"Event"
"XXX公司社保基金金额为40.3万元"
"XX公司环保投入额为300.09万元"
"X工程在建工程费用为405.9万元"
end

gen num = .
foreach x of numlist _N {
  if regexm(line[`x'], "([[:digit:]]+\\.[[:digit:]]*)|([[:digit:]]+)") { // 正则表达式匹配数字和小数
    replace num = strtonumber(regexs(1)) if _n == `x' & regexm(line, "\\.")
    replace num = strtonumber(regexs(2)) if _n == `x' & !regexm(line, "\\.")
  }
}

list line num
```

这种方法首先使用正则表达式匹配所有数字和小数,然后根据匹配结果中是否存在小数点来选择性地提取数值。

此文本由CAIE学术大模型生成,添加下方二维码,优先体验功能试用



您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-26 10:10