【问题标题】:How to fill in missing values by group?如何按组填写缺失值?
【发布时间】:2015-12-02 20:53:02
【问题描述】:

我有以下数据结构。在每个组中,一些观察结果缺少value。我知道每个组只有一个非缺失值(在这种情况下,10 用于组 1,11 用于组 2)。缺失观测值的位置在组内是随机的(即不能用前一个/后一个值填充缺失值)。

如何按组用一个非缺失值填充缺失值?

group  value
1       .
1       10
1       .
2       11
2       .
2       11

我目前的解决方案是循环,但我怀疑我可以使用一些聪明的bysort

levelsof group, local(lm_group)
foreach group in `lm_group' {
    levelsof value if group == `group', local(lm_value)
    replace value = `lm_value' if group == `group'
}

【问题讨论】:

    标签: stata missing-data


    【解决方案1】:

    如果您知道非缺失值在组内是恒定的,那么您可以与

    合二为一
     bysort group (value) : replace value = value[_n-1] if missing(value) 
    

    因为缺失值首先排序到最后,然后每个缺失值是replaced 由前一个非缺失值。替换向下级联,但仅在每个组内。

    有关文档,请参阅this FAQ

    要检查每个组中最多有一个不同的非缺失值,您可以这样做:

    bysort group (value) : assert (value == value[1]) | missing(value) 
    

    更多个人笔记。很高兴看到 levelsof 在使用中,正如我第一次写的那样,但上面的更好。

    【讨论】:

      【解决方案2】:

      我认为 xfill 命令正是您要找的。​​p>

      要安装xfill,请将以下内容复制粘贴到 Stata 中并按照说明操作:

      net from http://www.sealedenvelope.com/
      

      之后,剩下的就简单了:

      xfill value, i(group)
      

      你可以阅读xfillhere

      【讨论】:

        【解决方案3】:

        您正在寻找的聪明的排序答案是:

        bysort group: egen new_value=max(cond(!missing(value), value, .)
        

        cond 函数检查第一个参数是否为真,如果是并且返回值。如果不是。

        【讨论】:

        • 这行得通,但写bysort group egen new_value = max(value) 会更简单,它在问题的条件下给出相同的结果(每个组中最多有一个非缺失值)。如果您查看egen 的代码以及它的max() 函数(在您的系统上将在_gmax.ado 内),您将看到此解决方案需要用户键入一行(好)和Stata 来执行几十行代码(不太好)。我之前回答的解决方案需要Stata执行一行代码。
        • 我之前的评论中缺少一个冒号。应该是bysort group: 等等。
        猜你喜欢
        • 1970-01-01
        • 2018-07-15
        • 1970-01-01
        • 1970-01-01
        • 2021-12-26
        • 2020-11-10
        • 2023-03-05
        • 2020-08-14
        相关资源
        最近更新 更多