Разделение строковых данных и соответствующих данных в новую строку - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть некоторые данные, которые имеют строковую переменную (US states), соответствующую целочисленную переменную (enrollment) и другую строку.

К сожалению, некоторые ячейки в переменной US states имеют несколько перечисленных состояний, разделенных точкой с запятой. Я хотел бы разделить их на разные строки, а затем поделить соответствующую регистрацию поровну между этими штатами.

Например, у меня есть:

State       Enrollment   Severity
CA            100          Low
MA;PA         50           Medium
WA;OR;ID      120          High

И я хочу иметь возможность преобразовать это в:

State       Enrollment    Severity
CA             100          Low
MA             25           Medium
PA             25           Medium
WA             40           High
OR             40           High
ID             40           High

Я пытался разделить их с помощью команды split, а затем (в запутанном виде, вычисляя соответствующую регистрацию), но я не совсем уверен, как получить их в новые строки, даже с reshape.


EDIT:

Мне также хотелось бы, чтобы решение могло обрабатывать дублированные состояния.

Например:

State       Enrollment   Severity
CA            100          Low
MA;CA         50           Medium
WA;CA;ID      120          High

Преобразовано в:

State       Enrollment    Severity
CA             100          Low
MA             25           Medium
CA             25           Medium
WA             40           High
CA             40           High
ID             40           High

1 Ответ

0 голосов
/ 07 сентября 2018

Вот один из способов сделать то, что вы хотите, используя оригинал данные:

clear 
input str10 State Enrollment str10 Severity
"CA" 100 "Low"
"MA;PA" 50 "Medium"
"WA;OR;ID" 120 "High"
end

generate id = _n
split State, p(;)
drop State
reshape long State, i(State?)
drop State?

keep if State != ""
bysort State (id): egen maxval = max(id)
bysort State (id): generate enrol = Enrollment / maxval
drop Enrollment
rename enrol Enrollment

sort id
drop id _j maxval
order State Enrollment Severity

list, abbreviate(20)

     +-------------------------------+
     | State   Enrollment   Severity |
     |-------------------------------|
  1. |    CA          100        Low |
  2. |    MA           25     Medium |
  3. |    PA           25     Medium |
  4. |    OR           40       High |
  5. |    ID           40       High |
  6. |    WA           40       High |
     +-------------------------------+

EDIT:

Вот один способ сделать то, что вы хотите, используя ваши исправленные данные:

clear
input str10 State Enrollment str10 Severity
"CA"            100          "Low"
"MA;CA"         50           "Medium"
"WA;CA;ID"      120          "High"
end

generate id = _n
split State, p(;)
drop State

reshape long State, i(id)

keep if State != ""
bysort id: egen maxval = count(id)
bysort id: generate enrol = Enrollment / maxval
drop Enrollment
rename enrol Enrollment

sort id
drop id _j maxval
order State Enrollment Severity

list, abbreviate(20)

     +-------------------------------+
     | State   Enrollment   Severity |
     |-------------------------------|
  1. |    CA          100        Low |
  2. |    MA           25     Medium |
  3. |    CA           25     Medium |
  4. |    WA           40       High |
  5. |    CA           40       High |
  6. |    ID           40       High |
     +-------------------------------+
...