根据第二列计算一列中的不同值

时间:2019-01-23 22:08:14

标签: unique stata

我有很多行和列的大量Stata数据,但我只关心2列:HL

例如:

    +----------+
    |  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 |
    +----------+

2 个答案:

答案 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