我有很多行和列的大量Stata数据,但我只关心2列:H
和L
。
例如:
+----------+
| H | L |
|-----|-----
1. | 12 | 0 |
2. | 43 | 1 |
3. | 12 | 1 |
4. | 43 | 1 |
5. | 43 | 1 |
6. | 3 | 0 |
7. | 4 | 0 |
8. | 3 | 1 |
9. | 3 | 1 |
10. | 3 | 1 |
+----------+
我需要H
列中的唯一元素以及sum
列中该H
值的总L
:
+----------+
| H | L |
|-----|-----
| 12 | 1 |
| 43 | 3 |
| 3 | 3 |
| 4 | 0 |
+----------+
我还希望这些值按L
的总和降序排序,并且仅L
中的值大于2
:
+----------+
| H | L |
|-----|-----
| 43 | 3 |
| 3 | 3 |
+----------+
答案 0 :(得分:3)
如果您不想使用collapse
破坏数据集,则可以执行以下操作:
clear
input H L
12 0
43 1
12 1
43 1
43 1
3 0
4 0
3 1
3 1
3 1
end
bysort H (L): generate M = sum(L)
bysort H (L): generate H2 = H if _n == _N
bysort H (L): generate L2 = M if _n == _N
gsort - H2 L2
list
+----------------------+
| H L M H2 L2 |
|----------------------|
1. | 43 1 3 43 3 |
2. | 12 1 1 12 1 |
3. | 4 0 0 4 0 |
4. | 3 1 3 3 3 |
5. | 43 1 2 . . |
|----------------------|
6. | 3 1 2 . . |
7. | 3 0 0 . . |
8. | 3 1 1 . . |
9. | 12 0 0 . . |
10. | 43 1 1 . . |
+----------------------
也:
generate H3 = H2 if L2 > 2
generate L3 = L2 if L2 > 2
gsort - L3
list
+--------------------------------+
| H L M H2 L2 H3 L3 |
|--------------------------------|
1. | 43 1 3 43 3 43 3 |
2. | 3 1 3 3 3 3 3 |
3. | 3 1 2 . . . . |
4. | 43 1 1 . . . . |
5. | 12 1 1 12 1 . . |
|--------------------------------|
6. | 3 0 0 . . . . |
7. | 4 0 0 4 0 . . |
8. | 3 1 1 . . . . |
9. | 43 1 2 . . . . |
10. | 12 0 0 . . . . |
+--------------------------------+
对于大型数据集,使用mata
-Stata的矩阵编程语言可以更快地工作:
mata:
D = st_data(., ("H", "L"))
H = uniqrows(D[1::rows(D),1])
_sort(D,1)
_sort(H,1)
rH = rows(H)
res = J(rH, 2, .)
for (i = 1; i <= rH; i++) {
index = selectindex(D[.,1]:==H[i,1])
sumL = sum(D[.,2][index])
res[i,1] = H[i]
res[i,2] = sumL
}
index = selectindex(res[.,2]:>2)
res2 = res[.,1][index], res[.,2][index]
_sort(res2,-1)
end
这将产生:
mata: res
1 2
+-----------+
1 | 3 3 |
2 | 4 0 |
3 | 12 1 |
4 | 43 3 |
+-----------+
mata: res2
1 2
+-----------+
1 | 43 3 |
2 | 3 3 |
+-----------+
您可以按以下方式将结果传输回Stata:
getmata (H2 L2)=res (H3 L3)=res2, force
list
+----------------------------+
| H L H2 L2 H3 L3 |
|----------------------------|
1. | 12 0 3 3 43 3 |
2. | 43 1 4 0 3 3 |
3. | 12 1 12 1 . . |
4. | 43 1 43 3 . . |
5. | 43 1 . . . . |
|----------------------------|
6. | 3 0 . . . . |
7. | 4 0 . . . . |
8. | 3 1 . . . . |
9. | 3 1 . . . . |
10. | 3 1 . . . . |
+----------------------------+
答案 1 :(得分:2)
您可以使用collapse
并保留某些观察结果。
collapse (sum) L, by(H)
gsort -H
keep if L >= 2
输出:
H L
43 3
3 3