denver 发表于 2009-6-19 09:30 
voodoo 乃牛人也,学习了。下周我把我的VBA程序整理下也放上来,供大家批评。
只是在几个gen那不应该有//
另外,有个问题:不知道preserve和restore在这里起什么作用,因为forvalue本身就是一个循环了,因此去掉preserve和restore对于结果应该没有影响。
denver坛友过奖了,我也是Stata的爱好者和学习者而已。若干程序语句加上//只是认为该语句没太大必要。尽管在循环中,preserve和restore应该是必要的。
若sheet2是个大数据库,8楼的程序可能效率低了点,对main部分改进如下(将sheet2直接调入内存中,所以sheet2也不能太大了;若sheet2大于你Stata数据所能使用的内存,用8楼的程序)——只能算是可能的“改进”,因为没有大数据库可供试验:
// main
use sheet1, clear
local num = _N
// set memory ???.m
use sheet2, clear
preserve
forval i = 1/`num' {
quietly use in `i' using sheet1, clear
local name = name[1] // 因为只有一个obs,甚至可以用local name = name,速度会快一点点,下同
local class = class[1]
local weight = weight[1]
local year = year[1]
restore, preserve
quietly keep if class == "`class'" ///
& weight <= `weight'+20 & weight >= `weight'-20 ///
& year == `year'
gen nameo = "`name'"
// gen classo = "`class'"
// gen weighto = `weight'
// gen yearo = `year'
append using comparables
quietly save comparables, replace
}
use comparables, clear
list