Stata中如何保留仅属于指定列表的州数据?
Stata保留指定州微观数据的正确实现方法
我在处理微观数据集时遇到了问题:每个州不同年份对应不同个体数据,想保留部分州的数据,但各州个体数量不同,keep if _n <= _N/2没法用。于是先做了州唯一值的数据集,筛选出要保留的州后存到列表里,再导入原始数据想保留列表内的州,但尝试的命令都失败了,原代码如下:
sort my_list egen random = mean(runiform()), by(my_list) sort random my_list keep if _n <= _N/2 levelsof mylist, local(list) local req_list "" foreach value of local list{ localreq_list `"`req_list' `value'"' } drop random my_list use "path\to\mydta.dta" keep if inlist(STATEFIP, `req_list') *this kept deleting the entire dataset keep if inlist(levelsof STATEFIP, `req_list') *levelsof not found
原代码里的问题
- 变量名写错了:前面分组用的是
my_list,但levelsof命令里写成了mylist(少了下划线),Stata找不到这个变量,根本提不出州的唯一值。 - 局部变量赋值错了:
localreq_list"req_list'value'"'这里少了空格,应该是local req_list"req_list'value'"',不然req_list这个变量根本没被正确赋值,是空的。 inlist用法不对:levelsof是Stata的命令,不是函数,不能直接塞到inlist里,这肯定会报错。- 就算
req_list正确生成了,如果STATEFIP是字符串类型,inlist里的每个值还需要加引号,不然匹配不上。
正确的两种实现方法
方法一:修正局部变量逻辑,用inlist匹配
// 处理州唯一值数据集,筛选出要保留的州 sort my_list egen random = mean(runiform()), by(my_list) sort random my_list keep if _n <= _N/2 // 正确提取州的唯一值到局部变量,注意变量名要和数据集里的一致 levelsof my_list, local(state_list) // 关闭当前数据集,打开原始数据 use "path\to\mydta.dta", clear // 根据STATEFIP的类型选命令: // 如果是数值型州编码: keep if inlist(STATEFIP, `state_list') // 如果是字符串型州编码(要给每个值加双引号): // keep if inlist(STATEFIP, `"`state_list'"')
方法二:用merge替代inlist(州数量多的时候更稳妥)
如果要保留的州数量很多,inlist可能会因为参数太长报错,用merge更可靠:
// 处理州唯一值数据集,只保留需要的州 sort my_list egen random = mean(runiform()), by(my_list) sort random my_list keep if _n <= _N/2 // 只保留州编号列,重命名成和原始数据一致的列名 keep my_list rename my_list STATEFIP duplicates drop STATEFIP, force save "path\to\selected_states.dta", replace // 打开原始数据集,匹配目标州 use "path\to\mydta.dta", clear merge m:1 STATEFIP using "path\to\selected_states.dta" // 只保留匹配成功的观测(也就是属于目标州的数据) keep if _merge == 3 drop _merge
内容的提问来源于stack exchange,提问作者Biswajit Palit
相关产品推荐
相关产品推荐

