Разделить переменную, чтобы получить последнюю строку в качестве новой переменной - PullRequest
0 голосов
/ 28 октября 2019

У меня большой набор данных 5,000 наблюдений, и подмножество моих данных выглядит следующим образом:

AandB

1 222 454 213.51  59.15%
444 630 789.46  6.15%
2 374 798 807.69  32.00%
304 738 263.59  19.95%
177 641 617.86  18.07%
857 937 842.27  51.97%
973 127.33  0.03%
86 205 146.62  1.18%

Мне нужны две переменные, A и B из этой одной переменной.

Например, 1 222 454 213.51 должно быть в столбце A как 1222454213.51, а соответствующее наблюдение в переменной B должно быть 59.15% Существует двойной пробел, разделяющий, какие значения я хочу в A и что я хочу в B в необработанных данных.

Следовательно, мне нужно:

A                    B
1222454213.51     59.15%
444630789.46       6.15%
2374798807.69     32.00%
304738263.59      19.95%
177641617.86      18.07%
857937842.27      51.97%
973127.33          0.03%
86205146.62        1.18%

Мне удалось получить переменную A со следующими данными:

generate A = reverse(substr(reverse(AandB),strpos(reverse(AandB), "  "), . ))
replace A = subinstr(A, " ", "", .)

Однако у меня возникают проблемы с извлечением процентных чисел.

Ответы [ 3 ]

1 голос
/ 28 октября 2019

Еще один способ продвинуться - это сначала снять последнее «слово» (смысл Stata):

clear 
input str42 AandB 
"1 222 454 213.51  59.15%"
"444 630 789.46  6.15%"
"2 374 798 807.69  32.00%"
"304 738 263.59  19.95%"
"177 641 617.86  18.07%"
"857 937 842.27  51.97%"
"973 127.33  0.03%"
"86 205 146.62  1.18%"
end 

generate B = word(AandB, -1) 
generate A = trim(subinstr(AandB, B, "", .)) 

list AandB A B, separator(0) 

     +------------------------------------------------------+
     |                    AandB                  A        B |
     |------------------------------------------------------|
  1. | 1 222 454 213.51  59.15%   1 222 454 213.51   59.15% |
  2. |    444 630 789.46  6.15%     444 630 789.46    6.15% |
  3. | 2 374 798 807.69  32.00%   2 374 798 807.69   32.00% |
  4. |   304 738 263.59  19.95%     304 738 263.59   19.95% |
  5. |   177 641 617.86  18.07%     177 641 617.86   18.07% |
  6. |   857 937 842.27  51.97%     857 937 842.27   51.97% |
  7. |        973 127.33  0.03%         973 127.33    0.03% |
  8. |     86 205 146.62  1.18%      86 205 146.62    1.18% |
     +------------------------------------------------------+

Если вы хотите, чтобы A считался указанием очень больших чисел, тогда

generate double A2 = real(subinstr(A, " ", "", .)) 

- это путь вперед. Измерение до 12 значащих цифр означает, что вы находитесь в астрономии (и, возможно, первые 6 цифр хороши) или в экономике (и, возможно, первая цифра надежна).

1 голос
/ 28 октября 2019

Для меня работает следующее:

clear
input str50 AandB
"1 222 454 213.51  59.15%"
"444 630 789.46  6.15%"
"2 374 798 807.69  32.00%"
"304 738 263.59  19.95%"
"177 641 617.86  18.07%"
"857 937 842.27  51.97%"
"973 127.33  0.03%"
"86 205 146.62  1.18%"
end

generate A = subinstr(substr(AandB, 1, strpos(AandB,"%")-6)," ", "", .)
generate B = subinstr(substr(AandB, strpos(AandB,"%")-6, .)," ", "", .)

list, separator(0)

     +---------------------------------------------------+
     |                    AandB               A        B |
     |---------------------------------------------------|
  1. | 1 222 454 213.51  59.15%   1222454213.51   59.15% |
  2. |    444 630 789.46  6.15%    444630789.46    6.15% |
  3. | 2 374 798 807.69  32.00%   2374798807.69   32.00% |
  4. |   304 738 263.59  19.95%    304738263.59   19.95% |
  5. |   177 641 617.86  18.07%    177641617.86   18.07% |
  6. |   857 937 842.27  51.97%    857937842.27   51.97% |
  7. |        973 127.33  0.03%       973127.33    0.03% |
  8. |     86 205 146.62  1.18%     86205146.62    1.18% |
     +---------------------------------------------------+

РЕДАКТИРОВАТЬ:

Если подумать, это можно упростить до следующего:

generate A = subinstr(substr(AandB, 1, strpos(AandB,"  "))," ", "", .)
generate B = subinstr(substr(AandB, strpos(AandB,"  "), .)," ", "", .)
1 голос
/ 28 октября 2019

Один из способов будет:

split AandB, p("  ")
rename AandB1 A
rename AandB2 B
replace A = subinstr(A, " ", "", .)

list, separator(0)

     +---------------------------------------------------+
     |                    AandB               A        B |
     |---------------------------------------------------|
  1. | 1 222 454 213.51  59.15%   1222454213.51   59.15% |
  2. |    444 630 789.46  6.15%    444630789.46    6.15% |
  3. | 2 374 798 807.69  32.00%   2374798807.69   32.00% |
  4. |   304 738 263.59  19.95%    304738263.59   19.95% |
  5. |   177 641 617.86  18.07%    177641617.86   18.07% |
  6. |   857 937 842.27  51.97%    857937842.27   51.97% |
  7. |        973 127.33  0.03%       973127.33    0.03% |
  8. |     86 205 146.62  1.18%     86205146.62    1.18% |
     +---------------------------------------------------+
...