Подсчет различных значений в столбце на основе второго столбца - PullRequest
0 голосов
/ 24 января 2019

У меня есть большой набор данных 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 |
    +----------+

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Если вы не хотите уничтожать ваш набор данных с помощью 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    .    .    .    . |
     +----------------------------+
0 голосов
/ 24 января 2019

Вы можете использовать collapse и вести определенные наблюдения.

collapse (sum) L, by(H)
gsort -H
keep if L >= 2

Выход:

 H    L

43    3
 3    3
...