【问题标题】:Stata: Replace values of one row based on another if data are missingStata:如果数据丢失,则根据另一行替换一行的值
【发布时间】:2021-06-25 07:15:03
【问题描述】:

在 Stata 中,我试图仅在缺少值的情况下,根据其上方或下方的一行更改一行的值(字符串和数字)。以下是一些示例数据:

input 
str40 id var1 var2 var3 var4 str40 var5_string str40 var6_string
"correctly-spelled" 10 20 . . "random text 1" ""
"misspelled" . . 30 40 "" "random text 2" 
end

基本上,我希望我的最终数据集如下所示:

input
id var1 var2 var3 var4 var5_string var6_string
"correctly-spelled" 10 20 30 40 "random text 1" "random text 2"
end

我需要一个特定于行的解决方案(即避免collapse),因为我的(宽)数据集有数千个标记变量,我不想因为collapse 而丢失标签。此外,并非所有变量都是数字的,变量的命名约定也不一致。因此,使用简单的replace 修复id 的拼写、执行collapse (firstnm) id var5_string var6_string (mean) var1 var2 var3 var4, by(id) 或使用var* 来解决任何问题都无济于事。基本上,发生的事情是一个人使用“拼写正确”id 合并,另一个人使用“拼写错误”id 合并,而我没有任何源文件。谢谢!

【问题讨论】:

    标签: stata


    【解决方案1】:

    如果您可以假设拼写错误的 ID 位于正确拼写的 ID 之后(或之前),则可以使用 _n±1 获取上一个或下一个值。有关系统变量的更多信息,请参阅help _variables

    • 如果您假设正确的总是在前,那么第二个 replace 就足够了。
    • mi()missing() 函数的缩写。
    • 第二个条件& !mi(var'[_n±1])`,只是为了确保非缺失值不会被缺失值替换,如果两个有效(但不同)的 ID 依次出现。根据您的数据,可能不需要此进一步条件。
    local list_of_vars var1 var2 var3 var4 var5_string var6_string
    foreach var of local list_of_vars {
        replace `var' = `var'[_n-1] if mi(`var') & !mi(`var'[_n-1])
        replace `var' = `var'[_n+1] if mi(`var') & !mi(`var'[_n+1])
    }
    
    . list
    
         +-------------------------------------------------------------------------------+
         |                id   var1   var2   var3   var4     var5_string     var6_string |
         |-------------------------------------------------------------------------------|
      1. | correctly-spelled     10     20     30     40   random text 1   random text 2 |
      2. |        misspelled     10     20     30     40   random text 1   random text 2 |
         +-------------------------------------------------------------------------------+
    

    然后只保留正确的。希望您能以某种方式识别它们。

    // the following is just to be able to identify the correct id's, of course you will have to adapt it so that it matches only the correctly-spelled IDs or you have other way of identifying them :)
    gen _ck_corect_id = (id=="correctly-spelled")
    
    keep if _ck_corect_id==1
    

    【讨论】:

    • 谢谢@Marcelo Avila 和@Nick Cox!该解决方案完美运行。我只需要在变量侧窗格中使用 shift 选择所有数千个变量,并在删除有问题的两行后将更正后的行append 恢复到原始数据集。
    • 很高兴它成功了。就像旁注一样,您可以使用ds 来获取数据集中的所有变量。如果你想要大部分但不是全部,你可以调用ds var1 var, not,这样它将在r(varlist)中返回除var1var2之外的所有变量。有关详细信息,请参阅`help ds`。一般来说,每当你发现自己做某事过于“手动”时,可能会有一种更简单的方法来做这件事。并不总是弄清楚如何(哪个命令),但可能值得搜索或询问:)
    • 谢谢@Marcelo Avila!在过去的 10 年里,我一直在 Stata 至少兼职工作,我从未听说过 ds——学习永无止境 :) 无论如何,很高兴 Stack Overflow 和像你这样的人通知我这些快捷方式。当我有机会时,我也会尝试回馈并亲自回答问题。
    • 这个聚会迟到了,但我的贡献是将not 选项和其他一些选项添加到ds。谢谢你。
    猜你喜欢
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多