news 2026/3/8 2:16:42

Stata 文本清洗:Mata + moss 实现多值提取与去重

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Stata 文本清洗:Mata + moss 实现多值提取与去重

温馨提示:若页面不能正常显示数学公式和代码,请阅读原文获得更好的阅读体验。

作者:连小白 (连享会)
邮箱:lianxhcn@163.com

  • Title: Stata 文本清洗:Mata + moss 实现多值提取与去重
  • Keywords: unique, levelsof, 正则表达式

本文介绍如何在 Stata 中处理包含特殊字符或编码的文本数据,重点展示如何从字符串中批量提取特定模式(如 HTML 编码、电话区号等),并识别其唯一值。文章通过由浅入深的实例,详细讲解moss命令与 Mata 函数的配合使用,帮助读者掌握一套可迁移的文本清洗流程。


1. 引言:为什么需要提取字符串中的唯一值?

数据处理中的常见问题

在实证分析中,我们经常遇到"脏数据"问题。以文献数据库为例,作者姓名、机构名称等字段常包含 HTML 编码(如á表示áñ表示ñ),这些编码会带来两个直接后果:

  1. 匹配失败:同一个作者因编码差异无法正确合并。例如,SánchezSánchez被视为两个不同的作者。

  2. 统计偏差:在计算作者发文量、合作网络时,出现大量"伪重复"观测,导致统计结果失真。

类似的问题还出现在:

  • 网页抓取的数据中混杂 HTML 标签
  • 电话号码、邮箱等字段需要提取特定部分(如区号、域名)
  • PDF 提取的文本包含参考文献编号[1][2]

本文的解决思路

本文提供一套可复用的处理流程,核心思路分三步:

  1. 识别模式:用正则表达式定义需要提取的内容(如&xxxx;形式的 HTML 编码)
  2. 批量提取:用moss命令从每行字符串中提取所有匹配项
  3. 汇总去重:用 Mata 函数将提取结果转为向量并去重,得到唯一值列表

掌握这套流程后,读者可以轻松迁移到自己的数据清洗任务中。

基础知识

本文涉及的命令和技能:

  • Stata 基础:变量生成(gen)、字符串函数(word()substr()等)
  • 正则表达式:模式匹配的基本语法
    • 梁淑珍, 2022, Stata:正则表达式教程.
    • 游万海, 2020, Stata: 正则表达式和文本分析.
  • moss 命令:需要安装,用于批量提取字符串中的匹配项
  • Mata:Stata 的矩阵语言,用于数据去重和向量操作
    • 严子凯, 连玉君, 2021, Stata-Mata 系列 (二):Mata 与 Stata 的交互.
    • 王宇桐, 2020, Stata - Mata 系列 (一):Mata 入门.

如果尚未安装moss,请先运行:

ssc install moss, replace

2. 一个简单的例子:提取字符变量中的唯一值

假设我们有一个汽车数据集,其中make变量包含"品牌+型号"(如Ford MustangToyota Corolla),现在需要提取所有出现过的品牌名称。

2.1 Stata 常规做法:levelsof

常规做法是用levelsof命令:

. sysuse "auto.dta", clear . gen brand = word(make, 1) // 提取第一个单词作为品牌 . levelsof brand, local(brands) . ret list . dis `"`r(levels)'"' `"AMC"' `"Audi"' `"BMW"' `"Buick"' `"Cad."' `"Chev."' `"Datsun"' `"Dodge"' > `"Fiat"' `"Ford"' `"Honda"' `"Linc."' `"Mazda"' `"Merc."' `"Olds"' > `"Peugeot"' `"Plym."' `"Pont."' `"Renault"' `"Subaru"' `"Toyota"' `"VW"' `"Volvo"'

但使用levelsof有两个局限:

  1. 结果存储在暂元中,不便于后续处理(如导出为表格)
  2. 无法处理复杂情况(如一行有多个值需要提取)

2.2 用 Mata 实现去重:uniqrows()

下面展示 Mata 的做法。虽然对这个简单例子来说有些"大材小用",但它为后续复杂情况打下基础。

代码演示

*-------------------------------------------- * 示例1:用Mata获取品牌唯一值 *-------------------------------------------- sysuse "auto.dta", clear * 步骤1:生成品牌变量 gen str20 brand = word(make, 1) * 步骤2:将Stata变量传入Mata putmata brand_m = brand, replace // 说明:putmata命令将Stata的brand变量复制到Mata的brand_m矩阵中 // replace选项表示如果brand_m已存在则覆盖 * 步骤3:在Mata中去重 mata: brand_unique = uniqrows(brand_m) // uniqrows()函数:对矩阵的行去重,返回唯一值 brand_unique // 显示结果 end * 步骤4(可选):将结果导回Stata clear getmata brand = brand_unique, replace // getmata命令将Mata矩阵转为Stata变量 list, clean

代码解读

  • putmata:将 Stata 数据送入 Mata 环境。Mata 是 Stata 的矩阵语言,处理向量和矩阵运算比 Stata 循环快得多。
  • uniqrows():Mata 内置函数,对矩阵按行去重。如果输入是列向量,就得到该列的唯一值。
  • getmata:将 Mata 矩阵导回 Stata,生成新的数据集。

温馨提示:若页面不能正常显示数学公式和代码,请阅读原文获得更好的阅读体验。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/7 15:29:08

DeepSeek-R1-Distill-Qwen-1.5B应用实战:智能写作助手开发

DeepSeek-R1-Distill-Qwen-1.5B应用实战:智能写作助手开发 1. 引言 1.1 业务场景描述 在内容创作、教育辅助和办公自动化等场景中,高质量的文本生成能力正成为AI落地的核心需求。传统大模型虽然具备强大的语言理解与生成能力,但其高资源消…

作者头像 李华
网站建设 2026/3/7 15:29:05

告别数据分析 “劝退” 难题!虎贲等考 AI 让科研小白秒变数据大神

还在为看不懂 SPSS 界面抓耳挠腮?还在因不会编写 R 语言代码焦虑失眠?还在为数据图表不规范被导师反复打回?在实证研究当道的学术圈,数据分析堪称科研人的 “第一道门槛”,复杂的工具操作、晦涩的统计原理、严苛的图表…

作者头像 李华
网站建设 2026/3/7 15:29:03

Python_django框架的自行车购物商城系统

目录Python Django框架的自行车购物商城系统摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!Python Django框架的自行车购物商城系统摘要 该系统基于Python Django框架开发,…

作者头像 李华
网站建设 2026/3/5 9:38:29

救命神器9个AI论文平台,专科生毕业论文轻松搞定!

救命神器9个AI论文平台,专科生毕业论文轻松搞定! 论文写作的救星,AI 工具如何改变你的学习方式 在当今这个信息爆炸的时代,论文写作早已不再是单纯的文字堆砌,而是一场对逻辑、语言和知识整合能力的全面考验。尤其是对…

作者头像 李华
网站建设 2026/3/6 10:51:27

Qwen-Coder vs IQuest-Coder-V1:BigCodeBench性能对比部署案例

Qwen-Coder vs IQuest-Coder-V1:BigCodeBench性能对比部署案例 1. 背景与选型动机 在当前大模型驱动的软件工程自动化浪潮中,代码大语言模型(Code LLMs)已成为提升开发效率、实现智能编程辅助的核心技术。随着应用场景从简单的代…

作者头像 李华
网站建设 2026/3/6 20:53:40

Python+vue3+django汉服商城系统 汉服文化交流平台

目录汉服商城系统与文化平台摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!汉服商城系统与文化平台摘要 该系统基于Python、Vue3和Django技术栈开发,整合了汉服电商交易与文…

作者头像 李华