#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
, если вы посмотрите на значение и ключ (то есть имена столбцов, кроме Человека), где я создал значение, соответствующее имени вашего столбца