在如下所示的数据集中
clear
input patid str2 dx
1 qw
1 qe
1 qw
2 qw
2 qw
2 qs
2 qs
3 qe
3 qe
3 qs
3 qw
3 qw
3 qw
3 qs
4 qe
5 qa
5 qs
5 qw
5 qe
5 qw
end
我发现我可以使用下标[1]计算字符串变量dx
的每个值的出现次数,或者如果使用dx
我将collapse
转换为数字标签[2]。
在使用collapse
时,是否有命令或语法可以直接计算字符串变量本身的出现次数(没有转换等)?
e.g。如果我尝试collapse (count) countdx=dx, by(patid dx)
,则会返回错误消息variable dx not found
。
(当然,这不应该有效:当我尝试collapse (count) countdx=dx, by(patid)
时,会返回错误type mismatch
)
注意:
[1]
by patid dx, sort: egen ndx = count(dx)
by patid dx: g orderdx=_n
by patid dx: drop if orderdx>1
[2]
g numdx=.
replace numdx=1 if dx=="qa"
replace numdx=2 if dx=="qe"
replace numdx=3 if dx=="qs"
replace numdx=4 if dx=="qw"
collapse (count) countdx=numdx, by(patid dx)
答案 0 :(得分:2)
您的示例,但不是您的问题,都意味着您要为标识符patid
的每个不同值单独计算。
clear
input patid str2 dx
1 qw
1 qe
1 qw
2 qw
2 qw
2 qs
2 qs
3 qe
3 qe
3 qs
3 qw
3 qw
3 qw
3 qs
4 qe
5 qa
5 qs
5 qw
5 qe
5 qw
end
bysort patid dx : gen count = _N
tabdisp patid dx , c(count)
----------------------------------
| dx
patid | qa qe qs qw
----------+-----------------------
1 | 1 2
2 | 2 2
3 | 2 2 3
4 | 1
5 | 1 1 1 2
----------------------------------
有关该地区技术的评论,请参阅this paper。在Statalist中搜索dm0042
的提及会找到很多相关的例子。
对于中等大小的问题,tabdisp
不会特别实用。这里提到直接显示上一个命令的作用。
将其扩展为collapse
,一个简单的设备是
gen one = 1
collapse (sum) one, by(patid dx)
虽然我应该提到contract
是为了这个目的更明确地写的(参见Cox 1998中对其前身的讨论)。
另一方面,如果您确实创建了count
变量,那么
collapse (mean) count, by(patid dx)
会产生完全相同的效果。
Cox,N.J。1998.将数据集折叠到频率。 Stata技术公告 44:2-3。 .pdf here