Создание коэффициента из данных по нескольким столбцам с приоритетами, R

#r

Вопрос:

У меня есть набор данных, похожий на этот:

 df<-structure(list(Person = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), Stab = c(1, 
0, 1, 0, 0, 1, 0, 0, 0, 0), Shot = c(0, 0, 1, 1, 0, 0, 0, 0, 
0, 1), Cut = c(0, 1, 1, 1, 0, 0, 0, 1, 0, 1), ShotBow = c(0, 
0, 1, 0, 1, 0, 0, 0, 0, 0), Punched = c(0, 0, 1, 0, 1, 0, 0, 
1, 0, 0), Slapped = c(0, 0, 1, 0, 0, 1, 0, 0, 1, 0), `Car Accident` = c(0, 
0, 1, 0, 0, 0, 0, 0, 0, 0), `Bicycle Accident` = c(0, 0, 1, 0, 
0, 0, 1, 0, 0, 0), FellOver = c(0, 0, 1, 0, 0, 0, 1, 0, 1, 0)), spec = structure(list(
    cols = list(Person = structure(list(), class = c("collector_double", 
    "collector")), Stab = structure(list(), class = c("collector_double", 
    "collector")), Shot = structure(list(), class = c("collector_double", 
    "collector")), Cut = structure(list(), class = c("collector_double", 
    "collector")), ShotBow = structure(list(), class = c("collector_double", 
    "collector")), Punched = structure(list(), class = c("collector_double", 
    "collector")), Slapped = structure(list(), class = c("collector_double", 
    "collector")), `Car Accident` = structure(list(), class = c("collector_double", 
    "collector")), `Bicycle Accident` = structure(list(), class = c("collector_double", 
    "collector")), FellOver = structure(list(), class = c("collector_double", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector")), delim = ","), class = "col_spec"), problems = <pointer: 0x000002898df11210>, row.names = c(NA, 
-10L), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"
))
 

Как вы можете видеть, данные касаются разных пациентов и того, что с ними произошло. Переменные в реальном наборе данных немного отличаются, но вроде как: «зарезали», «застрелили», «ударили» и т. Д…

Я хочу сжать все эти колонки в одну колонку «насколько серьезна травма», и, работая с некоторыми из моих коллег-медиков, мы определились с некоторыми рейтингами (опять же, это не настоящие травмы, я их придумал).

Рейтинги для этой фальшивки следующие:

Уровень 1 Серьезности (худший)

  • Автомобильная авария
  • Выстрел
  • Дробовик

Уровень 2 серьезности (не так плохо)

  • Удар ножом
  • Резать
  • Несчастный случай на велосипеде

Уровень 3 (действительно неплохо)

  • Перфорированный
  • Шлепнул
  • упал

То,что я хочу сделать, это создать переменную под названием «Серьезность» и дать пациентам 1,2 или 3 в зависимости от того, был ли у них соответствующий столбец (приоритет наиболее тяжелой травмы). Т. Е. Пациент 1 был ранен ножом, поэтому они получают «2» (для уровня 2). Пациент 8 был порезан и получил пощечину, так что они получили бы 2 за порез… что отменило бы менее серьезные травмы, такие как пощечина. Пациента 10 застрелили и порезали, так что они получили бы «1», потому что выстрел более серьезен, чем порез.

Мой ожидаемый результат будет выглядеть следующим образом: введите описание изображения здесь

Комментарии:

1. @akrun только что добавил это

Ответ №1:

Нам может понадобиться именованный вектор

 library(dplyr)
library(purrr)
nm1 <- setNames(c(2, 1, 2, 1, 3, 3, 1, 2, 3), names(df)[-1])
df %>%
     mutate(Severity = across(-Person, ~ na_if(., 0) * nm1[[cur_column()]])  %>% 
           {invoke(pmin, c(., na.rm = TRUE))})
 

-выход

 # A tibble: 10 × 11
   Person  Stab  Shot   Cut ShotBow Punched Slapped `Car Accident` `Bicycle Accident` FellOver Severity
    <dbl> <dbl> <dbl> <dbl>   <dbl>   <dbl>   <dbl>          <dbl>              <dbl>    <dbl>    <dbl>
 1      1     1     0     0       0       0       0              0                  0        0        2
 2      2     0     0     1       0       0       0              0                  0        0        2
 3      3     1     1     1       1       1       1              1                  1        1        1
 4      4     0     1     1       0       0       0              0                  0        0        1
 5      5     0     0     0       1       1       0              0                  0        0        1
 6      6     1     0     0       0       0       1              0                  0        0        2
 7      7     0     0     0       0       0       0              0                  1        1        2
 8      8     0     0     1       0       1       0              0                  0        0        2
 9      9     0     0     0       0       0       1              0                  0        1        3
10     10     0     1     1       0       0       0              0                  0        0        1
 

Комментарии:

1. Похоже, это сработает, спасибо, и я приму это в любую секунду. Одна вещь, о которой я хотел бы попросить, — это дать некоторые разъяснения по поводу того, что происходит. Причина в том, что при применении к моим «реальным» данным, в которых у меня есть столбцы с разными именами в разных местах (и в наборе данных есть другие столбцы, не связанные с тяжестью травмы), я хотел бы знать, как применить это решение. Т. е., если не слишком много вопросов, не могли бы вы объяснить каждую строку?

2. @JoeCrozier Ключевой частью решения является построение nm1 , если вы посмотрите на значение и ключ (то есть имена столбцов, кроме Человека), где я создал значение, соответствующее имени вашего столбца