然后使用egen命令循环遍历变量的级别

时间:2019-07-09 11:30:30

标签: loops foreach stata

我想创建一个新变量,用于统计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)

我在做什么错了?

1 个答案:

答案 0 :(得分:2)

问题在于,在原始数据中,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 |
     +------------------------------------------------------+