我想创建一个新变量,用于统计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)
我在做什么错了?
答案 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 |
+------------------------------------------------------+