【问题标题】:Use value label in if command在 if 命令中使用值标签
【发布时间】:2014-03-31 17:08:16
【问题描述】:

我正在处理一组代表不同年份调查的dta 文件。

为了方便,每年对 country 变量使用不同的值,因此我尝试为每年设置 country 值标签以匹配。不过,我在比较值标签时遇到了麻烦。

到目前为止,我已经想出了以下代码:

replace country=1 if countryO=="Japan"
replace country=2 if countryO=="South Korea" | countryO=="Korea"
replace country=3 if countryO=="China"
replace country=4 if countryO=="Malaysia"

但是,这不起作用,因为“日本”是值标签,而不是实际值。

我如何告诉 Stata 我正在比较价值标签?

【问题讨论】:

  • 严格来说,这里的ifif 限定符; if 命令不同。请注意,如果您查看用户指南的索引,值标签上只有两个条目,而 13.10 包含您需要的详细信息。当你有文档时,比较我之前关于谷歌搜索的评论。
  • 这个 Stata 用户指南很棒,我很快就弄清楚了我不理解的地方,即值标签存储在它们自己的对象中,然后映射到一个变量。感谢您提出这一建议,Stata 帮助页面在 Google 结果中返回,但在本手册中没有。
  • @PearlySpencer 通过减少令人分心的闲聊改善了您的问题。这里的好问题是非常技术性的。请不要对他的编辑感到恼火,但要优雅地接受它,因为它来自一个更有经验的成员。

标签: stata


【解决方案1】:

试试

replace country=1 if countryO=="Japan":country0valuelabel
replace country=2 if inlist(countryO,"South Korea":country0valuelabel,"Korea":country0valuelabel)

您必须将country0valuelabel 替换为数据中相应的值标签名称。您可以通过查看describe country0 输出中的倒数第二列找到它的名称。

【讨论】:

  • 正是我需要的,谢谢你的建议。 describe countryO 命令帮助我将所有内容放在一起,感谢您的帮助
【解决方案2】:

补充@Dimitriy 的回答:

clear all
set more off

sysuse auto
keep foreign weight

describe foreign
label list origin

replace weight = . if foreign == 0

list in 1/15
list in 1/15, nolabel 

describe 显示与变量关联的值标签。 label list 可以显示特定值标签的内容。

【讨论】:

    【解决方案3】:

    我知道我会在多年后回复这篇文章,但我想提供一个适用于多个变量的解决方案,以防万一有人遇到这个问题。

    我的任务是类似的,除了我必须recode 每个具有“拒绝”响应的变量作为缺失值类型(.、.r、.)的数值(8、9、99 等)。 b 等)。所有变量都根据值标签“拒绝”编码了不同的值,例如一些变量的“拒绝”编码为 9,而另一些变量则编码为 99 或 8。

    版本信息 统计 15.1

    代码

        foreach v of varlist * {        
            if `"`: val label `v''"' == "yndkr" {
              recode `v' (9 = .r)
            }
    
            else if `"`: val label `v''"' == "bw3" {
              recode `v' (9 = .r)
            }
    
            else if `"`: val label `v''"' == "def_some" {
              recode `v' (9 = .r)
            }
    
            else if `"`: val label `v''"' == "difficulty5" {
              recode `v' (9 = .r)
            }               
        }
    

    您可以根据需要继续添加任意数量的else if 命令。我只展示了整个循环的一部分,但我希望这能说明需要做什么。如果您需要查找值标签的名称,请使用命令labelbook,它会为您全部打印出来。

    【讨论】:

    • 您的答案应该使用问题中的行话,或者提供一个包含数据的独立示例(如 Roberto Ferrer 的答案)。就目前而言,它可能对除您之外的任何人都不是很有帮助。
    • 对于这里的潜在问题,当问题很混乱时,很难不编写混乱的 ad hoc 代码。但是对于编码不一致的分类变量,除了悄悄地对这样做的人大发雷霆之外,我会考虑一个decode,在一个地方定义一组值标签,然后是一个encode。来自 SSC 的 multencode 是这里的一个特定工具。
    • 在您的示例代码中,最里面的语句对于所涵盖的四种情况是相同的。 inlist() 会给你一种将它们组合成一个的方法。
    • 感谢您提供有关最佳实践的信息,以便在此处提供可能的答案 - 这是我的第一个贡献,我将使用您所说的内容。我在编辑中进行了更正 - 你是对的。我决定走这条路线,并发布这条路线,因为如果我必须重新审视这个烂摊子并进行进一步的编辑,它应该有更大的灵活性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2015-10-07
    • 2019-03-18
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多