【问题标题】:Renaming long list of variables with loop in Stata在Stata中使用循环重命名一长串变量
【发布时间】:2020-06-25 22:28:05
【问题描述】:

我正在尝试在 Stata 中编写代码。 我目前正在使用以家庭为观察单位的数据集。每个家庭成员也有变量,例如,hv101_01 用于家庭中的第一个人,hv101_02 用于家庭中的第二个人,直到 hv101_39,所有这些都包含相同的标签。许多变量都是这种情况。

我想将所有变量的名称更改为标签名称。我能够将其计算为:

foreach v of var * {
local lbl : var label `v'
local lbl = strtoname("`lbl'")
rename `v' `lbl'
label variable `lbl' "`v'"
}

但是当它到达第二个家庭成员的变量时,例如 hv101_02,Stata 说变量名称已经定义。我知道这是因为 hv101_01 已经取了那个标签名称。

当变量更改为标签名称时,我想在变量后面添加 _02 或任何数字。 有人可以帮忙提供一个代码吗?

感谢您的预期回复。

【问题讨论】:

标签: loops foreach stata stata-macros


【解决方案1】:

根据您的变量名称考虑以下玩具示例:

clear
set obs 1

forvalues i = 11 / 15 {
    generate hv101_`i' = rnormal()
    label variable hv101_`i' ExampleVarLabel
}

describe, fullnames 

Contains data
  obs:             1                          
 vars:             5                          
 size:            20                          
-------------------------------------------------------------------------------------------------------------------------------------
              storage   display    value
variable name   type    format     label      variable label
-------------------------------------------------------------------------------------------------------------------------------------
hv101_11        float   %9.0g                 ExampleVarLabel
hv101_12        float   %9.0g                 ExampleVarLabel
hv101_13        float   %9.0g                 ExampleVarLabel
hv101_14        float   %9.0g                 ExampleVarLabel
hv101_15        float   %9.0g                 ExampleVarLabel
-------------------------------------------------------------------------------------------------------------------------------------
Sorted by: 
     Note: Dataset has changed since last saved.

以下对我有用:

foreach v of var * {
    local lbl : variable label `v'
    rename `v' `lbl'`=substr("`v'", strpos("`v'", "_"), .)'
    label variable `lbl'`=substr("`v'", strpos("`v'", "_"), .)' `v'
}

describe, fullnames

Contains data
  obs:             1                          
 vars:             5                          
 size:            20                          
-------------------------------------------------------------------------------------------------------------------------------------
              storage   display    value
variable name   type    format     label      variable label
-------------------------------------------------------------------------------------------------------------------------------------
ExampleVarLabel_11
                float   %9.0g                 hv101_11
ExampleVarLabel_12
                float   %9.0g                 hv101_12
ExampleVarLabel_13
                float   %9.0g                 hv101_13
ExampleVarLabel_14
                float   %9.0g                 hv101_14
ExampleVarLabel_15
                float   %9.0g                 hv101_15
-------------------------------------------------------------------------------------------------------------------------------------
Sorted by: 
     Note: Dataset has changed since last saved.

编辑:

如果标签相同且变量编号连续,则甚至不需要循环:

local lbl : variable label hv101_11
rename hv101_* `lbl'_#, renumber(11)

【讨论】:

    【解决方案2】:

    这是 Andrew Musau 在https://www.statalist.org/forums/forum/general-stata-discussion/general/1541234-renaming-long-list-of-variables-with-loop 中提供的正确答案

    foreach v of var hvidx_01 - hv124_39 {
             local lbl : var label `v'
             local lbl= subinstr("`lbl'"," ","_",.)
             local end=substr("`v'", -1, 2)
             rename `v' `lbl'_`end'
             label variable `lbl'_`end' `v'
     }
    

    【讨论】:

    • 这与我的解决方案完全相同,只是考虑了变量标签中您从未在问题中提出的额外空格。
    • 您所要做的就是在rename 命令之前添加local lbl = subinstr("`lbl'", " ", "", .)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2019-07-05
    相关资源
    最近更新 更多