#r #data-cleaning
#r #очистка данных
Вопрос:
У меня есть набор данных, в котором перечислены различные секторы правительства на разных подсекторных уровнях. Это выглядит так:
LEVEL1ID LEVEL2ID LEVEL3ID LEVEL4ID LEVEL5ID YEAR DESCRIP_E
0 0 0 0 0 2019 Government of X
5 0 0 0 0 2019 Department of Oceans
5 200 0 0 0 2019 Coast Guard
5 200 300 0 0 2019 Coast Guard HQ
5 200 300 400 0 2019 CG HQ - Business Mgmt
5 200 300 401 0 2019 CG HQ - IT
5 200 300 402 0 2019 CG HQ - Vessels
5 200 301 0 0 2019 CG Training
5 200 301 405 0 2019 CG Training - Employees
5 200 301 406 0 2019 CG Training - Students
5 200 302 0 0 2019 CG North
5 200 303 0 0 2019 CG East
5 200 303 407 0 2019 CG East - Shore-Based Personnel
5 200 303 407 500 2019 CG East - Business Mgmt
5 200 303 407 501 2019 CG East - Operations
0 0 0 0 0 2018 Government of X
5 0 0 0 0 2018 Department of Oceans
5 200 0 0 0 2018 Coast Guard
5 200 300 0 0 2018 Coast Guard HQ
5 200 300 400 0 2018 CG HQ - Business Mgmt
(and so on)
Я хочу создать новую двоичную переменную, которая помечает строки, представляющие организационные подразделения самого низкого уровня в течение данного года. То есть я хочу, чтобы мой набор данных выглядел следующим образом:
LEVEL1ID LEVEL2ID LEVEL3ID LEVEL4ID LEVEL5ID YEAR UNIQUE DESCRIP_E
0 0 0 0 0 2019 No Government of X
5 0 0 0 0 2019 No Department of Oceans
5 200 0 0 0 2019 No Coast Guard
5 200 300 0 0 2019 No Coast Guard HQ
5 200 300 400 0 2019 Yes CG HQ - Business Mgmt
5 200 300 401 0 2019 Yes CG HQ - IT
5 200 300 402 0 2019 Yes CG HQ - Vessels
5 200 301 0 0 2019 No CG Training
5 200 301 405 0 2019 Yes CG Training - Employees
5 200 301 406 0 2019 Yes CG Training - Students
5 200 302 0 0 2019 Yes CG North
5 200 303 0 0 2019 No CG East
5 200 303 407 0 2019 No CG East - Shore-Based Personnel
5 200 303 407 500 2019 Yes CG East - Business Mgmt
5 200 303 407 501 2019 Yes CG East - Operations
0 0 0 0 0 2018 No Government of X
5 0 0 0 0 2018 No Department of Oceans
5 200 0 0 0 2018 No Coast Guard
5 200 300 0 0 2018 No Coast Guard HQ
5 200 300 400 0 2018 Yes CG HQ - Business Mgmt
(and so on)
Как я мог бы сделать это в R (или Excel)?
Ответ №1:
Я думаю, это должно сработать:
is_unique = function(x) !duplicated(x) amp; !duplicated(x, fromLast = TRUE)
df$UNIQUE = with(df, ifelse(
is_unique(LEVEL5ID) |
(is_unique(LEVEL4ID) amp; LEVEL5ID == 0) |
(is_unique(LEVEL3ID) amp; LEVEL4ID == 0) |
(is_unique(LEVEL2ID) amp; LEVEL3ID == 0) |
(is_unique(LEVEL1ID) amp; LEVEL2ID == 0),
"Yes", "No"
)
)
Если вам нужно обобщить это до произвольного числа уровней, мы могли бы сделать и это, но записать это показалось целесообразным только для 5 уровней.