我的数据目前看起来像这样:
Group Team Ind. 1990 1991
Group 1 Blue a 1 1
Group 1 Blue b 1 1
Group 1 Blue c 1
Group 1 Green a 1 1
Group 1 Green b 1 1
Group 1 Green c 1 1
Group 1 Orange a 1
Group 1 Orange b 1 1
Group 1 Orange c 1 1
Group 2 Black a 1 1
Group 2 Black b 1 1
Group 2 Black c 1 1
Group 3 Grey a 1
Group 3 Grey b 1
Group 3 Grey c 1
Group 3 Yellow a 1 1
Group 3 Yellow b 1 1
Group 3 Yellow c
我想将它总结为这种类型的表:
1990 1991
Group 1 No. of Teams with all ind. (i.e. a,b,AND c) 1 3
Group 1 No. of Teams missing a value in a,b,OR c 2 0
Group 2 No. of Teams with all ind. (i.e. a,b,AND c) 1 1
Group 2 No. of Teams missing a value in a,b,OR c 0 0
Group 3 No. of Teams with all ind. (i.e. a,b,AND c) 0 0
Group 3 No. of Teams missing a value in a,b,OR c 2 2
我尝试重塑我的数据(并将Year作为一个变量),然后使用egen命令:
egen test=count(Team), by (Group Year Team)
但是它只计算每个年份和每组完成的总行数。在任何情况下,它都没有考虑uniques团队。
答案 0 :(得分:1)
假设在您的示例数据中,空白是缺失,相应的变量是数字。然后可以通过以下方式实现类似于您想要的东西:
clear
set more off
input ///
group str10 team str1 ind y1990 y1991
1 Blue a 1 1
1 Blue b 1 1
1 Blue c . 1
1 Green a 1 1
1 Green b 1 1
1 Green c 1 1
1 Orange a . 1
1 Orange b 1 1
1 Orange c 1 1
2 Black a 1 1
2 Black b 1 1
2 Black c 1 1
3 Grey a 1 .
3 Grey b . 1
3 Grey c . 1
3 Yellow a 1 1
3 Yellow b 1 1
3 Yellow c . .
end
list, sepby(group team)
*----- (similar to) what you want -----
// set years
local years 1990 1991
// number of teams per -group-
bysort group (team) : egen numteam = total(team != team[_n-1])
// comply with "and" condition
foreach y of local years {
bysort group team (y`y') : gen and`y' = y`y'[1] == y`y'[_N]
}
// compute counts of "and" conditions
collapse (first) and* numteam, by(group team)
collapse (sum) and* (first) numteam, by(group)
// compute counts of "exclusive or" conditions
foreach y of local years {
gen xor`y' = numteam - and`y'
}
// print
drop numteam
list
对于任何年份和group team
组合,请注意检查所有个体是否存在的策略:sort
指标变量,如果第一个和最后一个观察结果相同,那么所有个体都在场(暂时丢弃所有值都丢失的情况)。如果它们不相同,则表示第一次观察中为1
,最后一次为.
,则至少有一个人不在场。
(我告诉你,让你进入你最初要求的完全结构。)
但通常的建议是使用 long 形式的数据,因为Stata中的大多数统计分析都比较容易。为此,首先reshape
,然后完成剩下的工作:
<snip>
*----- what you want -----
// reshape data
gen i = _n
reshape long y, i(i) j(year)
// number of teams per -group-
bysort group (team) : egen numteam = total(team != team[_n-1])
// comply with "and" condition
rename (ind y) (id indicat)
bysort year group team (indicat) : gen and = indicat[1] == indicat[_N]
// compute counts of "and" conditions
collapse (first) and numteam, by(year group team)
collapse (sum) and (first) numteam, by(year group)
// compute counts of "exclusive or" conditions
gen xor = numteam - and
// pretty print
drop numteam
order group
sort group year
list, sepby(group)
第一段代码输出:
. list
+-----------------------------------------------+
| group and1990 and1991 xor1990 xor1991 |
|-----------------------------------------------|
1. | 1 1 3 2 0 |
2. | 2 1 1 0 0 |
3. | 3 0 0 2 2 |
+-----------------------------------------------+
和第二个:
. list, sepby(group)
+--------------------------+
| group year and xor |
|--------------------------|
1. | 1 1990 1 2 |
2. | 1 1991 3 0 |
|--------------------------|
3. | 2 1990 1 0 |
4. | 2 1991 1 0 |
|--------------------------|
5. | 3 1990 0 2 |
6. | 3 1991 0 2 |
+--------------------------+
最后,请注意任何一年中所有缺失值的团队,例如:团队红色在1990年,下面:
+--------------------------------------+
| group team ind y1990 y1991 |
|--------------------------------------|
1. | 1 Blue a 1 1 |
2. | 1 Blue b 1 1 |
3. | 1 Blue c . 1 |
|--------------------------------------|
.
.
.
|--------------------------------------|
19. | 4 Red a . . |
20. | 4 Red b . 1 |
21. | 4 Red c . 1 |
|--------------------------------------|
22. | 4 White a 1 1 |
23. | 4 White b 1 1 |
24. | 4 White c . . |
+--------------------------------------+
因为这些被视为所有人都在场。
您需要确定在这种情况下计数的行为方式。一种调整方法是使用
bysort year group team (indicat) : gen and = indicat[1] == indicat[_N] ///
& !missing(indicat[1])
而不是相应的原件。在sort
之后,我们只需要检查第一个值是否为非缺失值,以便丢弃所有值都丢失的情况。
使用修改后的行以及原始示例数据运行代码,再加上包含所有缺失团队的第四个组(见上文),结果如下:
. list, sepby(group)
+--------------------------+
| group year and xor |
|--------------------------|
1. | 1 1990 1 2 |
2. | 1 1991 3 0 |
|--------------------------|
3. | 2 1990 1 0 |
4. | 2 1991 1 0 |
|--------------------------|
5. | 3 1990 0 2 |
6. | 3 1991 0 2 |
|--------------------------|
7. | 4 1990 0 2 |
8. | 4 1991 0 2 |
+--------------------------+
根据我定义的逻辑,这是我所期望的:如果团队拥有所有缺失值,则使用 exclusive或条件对其进行计数。如果你想遵循不同的逻辑,你需要i)拼写出来,然后ii)将其翻译成代码。
如果在评论中指标变量可以采用任何正值,则可以概括用于计算和条件的规则。将第五个组添加到示例数据中:
.
.
.
|--------------------------------------|
25. | 5 Blue a 1 . |
26. | 5 Blue b 1 . |
27. | 5 Blue c 1 . |
28. | 5 Green a 2 . |
29. | 5 Green b 2 . |
30. | 5 Green c . . |
31. | 5 Orange a 3 . |
32. | 5 Orange b 2 . |
33. | 5 Orange c 55 . |
+--------------------------------------+
并将相应的行修改为:
bysort year group team (indicat) : gen and = !missing(indicat[_N])
我只检查最后一个值(_N
),因为在排序后,如果最后一个值没有丢失,那么根本没有遗漏。
如果不熟悉这些概念,请检查help subscripting
和help bysort
。