Stata:如何为每个变量

时间:2017-06-29 12:27:36

标签: loops foreach stata

是否可以同时为多个值运行命令georoute?我正在运行以下行:

 georoutei, hereid(BfSfwSlKMCPHj5WbVJ1g) herecode(bFw1UDZM3Zgc4QM8lyknVg) startxy(46.1761413,6.1393099) endxy(46.99382,6.94049) km

但是,我有超过1000个值(坐标)作为起点和终点。我想告诉Stata类似于为变量的每个值替换startxy和endxy。所以,我试图在一个循环中这样做,但它不起作用。有人能帮我吗?

我正在尝试这样做:

clear all

set obs 1000
set seed 1254
ssc install georoutei

gen x1 = 45 + int(40+1)*uniform() 
gen xf = 46+ int(46+1)*runiform()
gen y1 = 6 + int(6+1)*runiform()
gen yf = 7 + int(7+1)*runiform()

georoutei, hereid(tKNXdBlaC1UoKDWAiJ4i) herecode(4SQsFZphiBfXL4xWa7SPgg) 
startxy(3.4372222,-76.33376) endxy(3.7231,-76.525902) km

forvalue i=1(1)1000{
levelsof x1, local(startx)
levelsof xf, local(endf) 
levelsof y1, local(starty)
levelsof yf, local(endy)
    georoutei, hereid(tKNXdBlaC1UoKDWAiJ4i) herecode(4SQsFZphiBfXL4xWa7SPgg) 
    startxy(`startx',`starty') endxy(`endx',`endy')km
}

然后我需要在矩阵或类似的东西中记录行程距离,以获得包含此信息的新变量。我希望节省一点时间,而不是为每对坐标运行一堆线。

谢谢!

1 个答案:

答案 0 :(得分:1)

问题是循环的每次迭代都运行相同的levelsof命令:没有为if指定inlevelsof限定符,因此对于每次迭代对于循环,levelsof正在运行所有观察。

我建议使用显式下标而不是levelsof。您可以详细了解herehere。例如:

generate distance = .
forvalues i = 1/100 {
    local startx = x1[`i']
    local endf = xf[`i']
    local starty = y1[`i']
    local endy = yf[`i']
    georoutei, hereid(tKNXdBlaC1UoKDWAiJ4i) herecode(4SQsFZphiBfXL4xWa7SPgg) startxy(`starty',`startx') endxy(`endy',`endx') km
    replace distance = r(dist) in `i'
}

绝对是一个好主意,把它变成一个循环!