【问题标题】:Looping over levels of a variable then using egen command循环遍历变量的级别,然后使用 egen 命令
【发布时间】:2019-07-09 11:30:30
【问题描述】:

我想创建一个新变量来计算指定药物代码在 27 列中的所有出现次数。但是,我想对所有可用的药物代码执行此操作。我正在使用循环和egen 函数anycount()

但是,当我尝试运行它时,我得到了错误:

名称无效
r(198);

您可以在下面找到我的数据示例:

clear
input DrugList Drug1 Drug2 Drug3 Drug4 Drug5
1234 7934 1234 . . .
5678 1234 5678 . . .
9876 9876 3456 . . .
3456 9876 . . . .
7934 9876 5678 7934 1234 .
17453 5678 . . . .
end

我使用的代码如下:

levelsof DrugList

foreach drug in `r(levels)'{
    egen d_`drug' = anycount(Drug1-Drug27), values(`drug')
}

我期望的输出是这样的:

  +------------------------------------------------------+
  | d_1234   d_3456   d_5678   d_7934   d_9876   d_17453 |
  |------------------------------------------------------|
  |      1        0        0        1        0         0 |
  |      1        0        1        0        0         0 |
  |      0        1        0        0        1         0 |
  |      0        0        0        0        1         0 |
  |      1        0        1        1        1         0 |
  |      0        0        1        0        0         0 |
  +------------------------------------------------------+

如果我在没有循环的情况下运行特定代码的代码,那么一切正常:

egen d_1234 = anycount(Drug1-Drug27), values(1234)

我做错了什么?

【问题讨论】:

    标签: loops foreach stata


    【解决方案1】:

    问题在于,在您的原始数据中,DrugList 中的药物代码包含小数、负值甚至两者兼有。 Stata 认为这些变量名不合法。

    考虑以下基于您问题中数据的略微修改版本的玩具示例:

    clear
    input DrugList Drug1 Drug2 Drug3 Drug4 Drug5
    1234 7934 1234 . . .
    5678 1234 5678 . . .
    9876 9876 3456 . . .
    3456.46 9876 . . . .
    7934 9876 5678 7934 1234 .
    17453 5678 . . . .
    end
    
    levelsof DrugList, clean
    
    foreach drug in `r(levels)' {
        egen d_`drug' = anycount(Drug1-Drug5), values(`drug')
    }
    d_3456.4599609375 invalid name
    r(198);
    

    不需要删除违规观察的解决方案是使用floor() 函数:

    clear
    input DrugList Drug1 Drug2 Drug3 Drug4 Drug5
    1234 7934 1234 . . .
    5678 1234 5678 . . .
    9876 9876 3456 . . .
    3456.46 9876 . . . .
    7934 9876 5678 7934 1234 .
    17453 5678 . . . .
    end
    
    levelsof DrugList, clean
    
    foreach drug in `r(levels)' {
        local drug = floor(`drug')
        egen d_`drug' = anycount(Drug1-Drug5), values(`drug')
    }
    

    如果您在 DrugList 中有负值,您可以改用 abs() 函数:

    clear
    input DrugList Drug1 Drug2 Drug3 Drug4 Drug5
    1234 7934 1234 . . .
    5678 1234 5678 . . .
    9876 9876 3456 . . .
    -3456 9876 . . . .
    7934 9876 5678 7934 1234 .
    17453 5678 . . . .
    end
    
    levelsof DrugList, clean
    
    foreach drug in `r(levels)' {
        local drug = abs(`drug')
        egen d_`drug' = anycount(Drug1-Drug5), values(`drug')
    }
    

    当然,你也可以结合前面提到的功能:

    clear
    input DrugList Drug1 Drug2 Drug3 Drug4 Drug5
    1234 7934 1234 . . .
    5678 1234 5678 . . .
    9876 9876 3456 . . .
    -3456.46 9876 . . . .
    7934 9876 5678 7934 1234 .
    17453 5678 . . . .
    end
    
    levelsof DrugList, clean
    
    foreach drug in `r(levels)' {
        local drug = abs(floor(`drug'))
        egen d_`drug' = anycount(Drug1-Drug5), values(`drug')
    }
    

    所有情况下的结果都是预期的:

    list, separator(0)
    
         +------------------------------------------------------+
         | d_3456   d_1234   d_5678   d_7934   d_9876   d_17453 |
         |------------------------------------------------------|
      1. |      0        1        0        1        0         0 |
      2. |      0        1        1        0        0         0 |
      3. |      1        0        0        0        1         0 |
      4. |      0        0        0        0        1         0 |
      5. |      0        1        1        1        1         0 |
      6. |      0        0        1        0        0         0 |
         +------------------------------------------------------+
    

    【讨论】:

      猜你喜欢
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多