我想迭代ID变量中的所有值,检查相应的变量“present”是否包含.
或零。如果ID的所有值都存在.
或零,我想将该ID附加到列表中。当循环结束时,我想查看该列表中的所有ID。
这是一些不起作用的伪代码
egen group = group(pupid)
su group, meanonly
local presentCapture 0
forvalues i = 1/`r(max)' {
foreach `id' in group {
{
if pres == 0 OR '.' {
presentCapture = presentCapture + 1
}
}
if presentCapture = 6 {
list.append(`id')
}
display list
这显然没有做任何事 - 我已经习惯了Python,所以我这样想。
有什么想法吗?
答案 0 :(得分:2)
// some example data
clear
input id present
1 1
1 .
2 0
2 0
3 .
3 .
4 0
4 1
5 0
5 .
end
// for each id count the number of obs
// with present == 0 or present == .
sort id
by id: egen mark = total(inlist(present,0,.))
list, sepby(id)
// mark ids were all obs are either 0 or .
by id: replace mark = (mark == _N)
list, sepby(id)
// create your list of ids
levelsof id if mark == 1
答案 1 :(得分:1)
这是另一种方法。
gen flag = !inlist(present, 0, .)
bysort id (flag) : replace flag = flag[_N]
levelsof id if !flag
声明解释说明:
flag
是除0或缺失之外的任何值的指示符。
如果flag
的任何id
为1,那么一切都应该是id
。
levelsof
显示未标记的!
的不同值。
gen flag = present != 0 & present != .
bysort id (flag) : replace flag = !flag[_N]
levelsof id if flag
否定逻辑值,将0翻转为1,反之亦然。
另一种方法:
{{1}}