Используйте фиктивные переменные для создания ранжированной взаимоисключающей переменной. R

#r #rank #dummy-variable #mutual-exclusion

Вопрос:

У меня есть ряд переменных множественного ответа (фиктивных), описывающих причины отмененных посещений. У визита может быть несколько причин для отмены. Моя цель состоит в том, чтобы создать единую взаимоисключающую переменную, используя фиктивные переменные иерархическим образом. Например, в моей выборке данных ниже ранга моих переменных указано следующее: Медицинские, NoID и Отказ. Например, если визит был отменен по медицинским причинам и из-за отсутствия удостоверения личности, я хотел бы перекодировать свою последнюю переменную как «медицинскую», поскольку это более важная база для моего ранга. Аналогично, VisitID 3 был отменен из-за отсутствия идентификатора и отказа в посещении, в этом случае я хотел бы перекодировать эту отмену как NoID, поскольку NoID важнее, чем Отказ.
Спасибо вам за любую помощь!

   VisitID  NoID Refuse Medical WhatINeed
1       1  TRUE  FALSE    TRUE   Medical
2       2 FALSE  FALSE   FALSE      <NA>
3       3  TRUE   TRUE   FALSE      NoID
 
 structure(list(VisitID = c(1, 2, 3), NoID = c(TRUE, FALSE, TRUE
), Refuse = c(FALSE, FALSE, TRUE), Medical = c(TRUE, FALSE, FALSE
), WhatINeed = c("Medical", NA, "NoID")), row.names = c(NA, 3L
), class = "data.frame")
 

Ответ №1:

Мы можем перебрать строки apply , выбрав столбцы в порядке важности, получить names из логического вектора и извлечь первое имя, соответствующее ИСТИННОМУ значению

 df1$WhatINeed <- apply(df1[c("Medical", "NoID", "Refuse")], 1, 
    FUN = function(x) names(x)[x][1])
 

-выход

 > df1
  VisitID  NoID Refuse Medical WhatINeed
1       1  TRUE  FALSE    TRUE   Medical
2       2 FALSE  FALSE   FALSE      <NA>
3       3  TRUE   TRUE   FALSE      NoID