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

如何在Stata中按年份-州组统计唯一文档数量并包含零值组合

在Stata中生成包含零值的年份-州组唯一文档计数

问题背景

你有这样的数据集:

clear input year str2 state str11 document
2009 AS 09420849920
2006 AS 91444492147
2008 AS 91444492147
2007 AK 47080474742
2006 AK 90190072284
2007 AK 90190072284
2006 AK 10744281448
2009 AL 22408712220
2006 AS 92974278888
2008 AL 27189228210
2009 AS 92974278888
2009 AS 22408712220
2009 AL 92974278888
2006 AS 27189228210
2007 AS 91444492147
2006 AL 27189228210
2008 AL 47080474742
2008 AL 10744281448
2008 AK 09420849920
2008 AL 47080474742
end

需求是按year-state分组,统计每组的唯一document数量,必须包含那些没有对应文档的组,计数设为0,期望输出要覆盖所有可能的year-state组合。

你尝试用egen tag的方法:

egen tag = tag(year state document)
egen n_documents = total(tag), by(year state)
collapse (first) n_documents, by(year state)
sort state year
list, sep(0) abb(20)

但结果缺少了像2009 AK、2007 AL这类无文档的组,手动添加显然不现实,尤其是面对百万级的大规模数据。

解决方案

这里有两种高效的Stata方法,都能轻松处理大规模数据:

方法一:使用fillin命令(最简洁)

fillin命令会自动生成指定变量的所有可能交叉组合,完美解决缺失组的问题:

* 先处理原始数据,计算每个year-state的唯一文档数
clear 
input year str2 state str11 document
2009 AS 09420849920
2006 AS 91444492147
2008 AS 91444492147
2007 AK 47080474742
2006 AK 90190072284
2007 AK 90190072284
2006 AK 10744281448
2009 AL 22408712220
2006 AS 92974278888
2008 AL 27189228210
2009 AS 92974278888
2009 AS 22408712220
2009 AL 92974278888
2006 AS 27189228210
2007 AS 91444492147
2006 AL 27189228210
2008 AL 47080474742
2008 AL 10744281448
2008 AK 09420849920
2008 AL 47080474742
end

egen tag = tag(year state document)
egen n_documents = total(tag), by(year state)
collapse (first) n_documents, by(year state)

* 关键步骤:生成所有year和state的组合,填补缺失的组
fillin year state

* 将缺失的计数替换为0,移除_fillin标记
replace n_documents = 0 if _fillin == 1
drop _fillin

* 排序并查看结果
sort state year
list, sep(0) abb(20)

执行后就能得到包含所有year-state组合的结果,零值组也会被正确显示。

方法二:用cross生成全组合再合并(更灵活)

如果需要对分组组合有更多控制(比如指定特定年份范围),可以先提取唯一的year和state,生成全交叉组合后再合并计数:

clear 
input year str2 state str11 document
2009 AS 09420849920
2006 AS 91444492147
2008 AS 91444492147
2007 AK 47080474742
2006 AK 90190072284
2007 AK 90190072284
2006 AK 10744281448
2009 AL 22408712220
2006 AS 92974278888
2008 AL 27189228210
2009 AS 92974278888
2009 AS 22408712220
2009 AL 92974278888
2006 AS 27189228210
2007 AS 91444492147
2006 AL 27189228210
2008 AL 47080474742
2008 AL 10744281448
2008 AK 09420849920
2008 AL 47080474742
end

* 先计算每个year-state的唯一文档数并保存
preserve
egen tag = tag(year state document)
egen n_documents = total(tag), by(year state)
collapse (first) n_documents, by(year state)
save "temp_counts.dta", replace
restore

* 提取所有唯一的year和state
tempfile years states
bysort year: keep if _n == 1
keep year
save `years'

restore, preserve
bysort state: keep if _n == 1
keep state
save `states'

* 生成year和state的全交叉组合
use `years', clear
cross using `states'

* 合并之前的计数数据,缺失的设为0
merge 1:1 year state using "temp_counts.dta"
replace n_documents = 0 if _merge == 1
drop _merge

* 排序查看结果
sort state year
list, sep(0) abb(20)

* 清理临时文件
erase "temp_counts.dta"

这种方法适合需要添加额外过滤条件的场景,灵活性更强。

这两种方法都能高效处理百万级观测数据,不会有性能问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 13:12:49