问题描述
我有 Stata 代码来读取一堆 .csv 文件。我读取了一个变量的数据(一列),然后用我拥有的数据 merge
它。然后我试着让它重复。我知道第 3 行到第 10 行有效。
local md="0301"
while `md'<="0331" {
insheet using "Model_11.2.1_2020`md'_results.csv",clear
gen pvi_`md'=toxpiscore
keep name pvi_`md'
sort name
merge 1:1 name using pvi_scores
drop _m
sort name
save pvi_scores,replace
local md=`md'+1
}
简化为我认为错误的地方
local md="0301"
while `md'<="0331" {
local md=`md'+1
}
我收到 r(109)
错误。所以我认为
local md = `md' + 1
是问题。是字符串加数字导致问题吗?
解决方法
不是这方面的专家,但相信您应该能够遍历数字宏值并将这些值与循环内的其余字符串连接起来:
local mdn = 301
while `mdn' <= 331 {
* concatenate string with local macro
local md = "0" + "`mdn'"
* can also use local md "0`mdn'"
insheet using "Model_11.2.1_2020`md'_results.csv",clear
gen pvi_`md'=toxpiscore
keep name pvi_`md'
sort name
merge 1:1 name using pvi_scores
drop _m
sort name
save pvi_scores,replace
local mdn=`mdn'+1
}
,
r(109)
是类型不匹配:您尝试执行字符串操作,但 Stata 看到的是一个或多个数字,或者数字运算但 Stata 看到的是一个或多个字符串。
. error 109
type mismatch
r(109);
您发现了根本问题。
我会这样做:
forval f = 301/331 {
local F "0`f'"
// work in terms of `f' or `F' as needed
}
或者这个:
forval f = 301/331 {
local F : di %04.0f `f'
// work in terms of `f' or `F' as needed
}
使用 while
没有任何问题。但是,只要问题可以简化为循环相邻整数,forvalues
就会更清晰、更简单。每次循环增加 1 是自动的。
因此所需的扭曲是在 "0"
之前添加或等效地将整数推送到带有前导零的显示格式。然后你有一个本地宏,它是一个字符串。真的,所有本地宏都是字符串;只是 Stata 会将内容——一旦宏被评估——视为数字,如果这有意义的话。您可以添加(连接)字符串,如上面隐式完成的那样,或者像
local wanted = "0" + "311"
但关键是两个操作数都必须是字符串,如这里用引号分隔符所示。这一事实并非特定于局部宏,也适用于全局宏、标量和变量。
The Tip here 讨论了这个问题。