#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