使用 foreach 和 substr() 修改变量名

Using foreach with substr() to modify variable names

我有一组变量,其名称具有相同的前缀附加到唯一的两位数年份:

div_unemp03
div_unemp04
.
.
.
div_unemp14

我想将这些变量重命名如下:

div_ue03
div_ue04
.
.
.
div_ue14

我尝试使用 foreach 循环来执行此操作:

foreach x of var unemp*  {
    local new = substr(`x', 10, 2)
    rename `x' div_ue`new'
}

然而,Stata 产生错误代码:

type mismatch

如能帮助理解此错误以及如何达到预期效果,我们将不胜感激!

substr 函数需要一个 string 作为它的第一个参数。此外,您的 varlist 语法 unemp* 不会捕获名为 div_unemp## 的变量,因为它们不会 begin with unemp (生成 "type mismatch" 错误)。下面的(可重现的)示例显示了两个更正。

clear
input div_unemp03 div_unemp04 div_unemp05
1 1 1
end

foreach x of varlist *unemp* {
    local new = substr("`x'", 10, 2)
    rename `x' div_ue`new'
}

另请注意,substr() 允许您从字符串的 end 开始计数,因此 substr("s", -2, 2) 有效。

只需使用 rename 命令,您就可以在一行中完成相同的操作:

clear
set obs 1

forvalues i = 3 / 6 {
    generate div_unemp0`i' = .
}

list, abbreviate(11)

     +-------------------------------------------------------+
     | div_unemp03   div_unemp04   div_unemp05   div_unemp06 |
     |-------------------------------------------------------|
  1. |           .             .             .             . |
     +-------------------------------------------------------+

rename div_unemp# div_ue#

list, abbreviate(10)

     +-------------------------------------------+
     | div_ue03   div_ue04   div_ue05   div_ue06 |
     |-------------------------------------------|
  1. |        .          .          .          . |
     +-------------------------------------------+