【问题标题】:Stata: Using if with value labelsStata:使用带有值标签的 if
【发布时间】:2023-03-15 05:23:01
【问题描述】:

我在使用带有值标签的 if 时遇到了问题。

set obs 5
gen var1 = _n
label define l_var1 1 "cat1" 2 "cat1" 3 "cat2" 4 "cat3" 5 "cat3"
label val var1 l_var1
keep if var1=="cat3":l_var1
(4 observations deleted)

我预计要删除 3 条记录。我怎样才能做到这一点?

我使用的是 Stata 16.1。

【问题讨论】:

    标签: if-statement stata


    【解决方案1】:

    "cat3":l_var1 不会在l_var1 中查找与"cat3" 对应的所有值。它返回与字符串 "cat3" 对应的第一个值。

    所以"cat3":l_var1 的计算结果为4,所以keep if var1=="cat3":l_var1 的计算结果为keep if var1==4,因此只保留一个观察值。

    请参阅下面显示此行为的代码。这不是您希望 "cat3":l_var1 表现的方式,但它就是这样。

    set obs 5
    gen var1 = _n
    label define l_var1 1 "cat1" 2 "cat1" 3 "cat2"  5 "cat3" 4 "cat3"
    label val var1 l_var1
    gen var2 = "cat3":l_var1
    gen var3 = 1 if var1=="cat3":l_var1
    

    这回答了您的代码中发生的情况。下面的代码是解决您正在尝试做的事情的更好方法。

    set obs 5
    gen var1 = _n
    label define l_var1 1 "cat1" 2 "cat1" 3 "cat2"  5 "cat3" 4 "cat3"
    label val var1 l_var1
    
    decode var1, generate(var_str)
    keep if var_str == "cat3"
    

    【讨论】:

    • 我想保留标签为cat3的所有记录。
    • 干净的Stata方法是只有一个与标签cat3对应的值,这不可能吗?
    • 我已经添加到我上面的答案中。这是对您问题的回答吗?
    • 有时,需要对几个类别进行子分组并运行一些命令,如 tab 等,而不对值进行编码。你的答案似乎很好。谢谢。
    • 如果回答了您的问题,请标记为已回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多