Я сделал этот минимальный воспроизводимый пример, иллюстрирующий мой вопрос.Мне уже удалось решить проблему, но я уверен, что есть более элегантные способы ее кодирования.
Проблема заключается в бинарной классификации, основанной на нескольких критериях.Чтобы получить пончик (код 1), необходимо набрать не менее 3 (или более) баллов за: хотя бы один из критериев «a», как минимум два из критерия «b» и как минимум три из «c»критерий предметов.Если эти требования не будут выполнены, пончик не будет награжден (код 0).
Это мое решение.Как бы вы написали его более лаконично / изящно?
require(dplyr)
df <- data.frame("a1" = c(3,2,2,5),
"a2" = c(2,1,3,1),
"b1" = c(2,1,5,4),
"b2" = c(1,2,1,4),
"b3" = c(3,2,3,4),
"c1" = c(3,3,1,3),
"c2" = c(4,2,3,4),
"c3" = c(3,3,4,1),
"c4" = c(1,2,3,4),
stringsAsFactors = FALSE)
df_names <- names(df[, 1:9])
a_items <- names(df[, 1:2])
b_items <- names(df[, 3:5])
c_items <- names(df[, 6:9])
df_response <- df %>%
select(df_names) %>%
mutate_all(
funs(case_when(
. >=3 ~ 1,
is.na(.) ~ 0,
TRUE ~ 0))) %>%
mutate(a_crit = case_when( rowSums(.[ ,a_items]) >=1 ~ 1, # one a item needed
TRUE ~ 0)) %>%
mutate(b_crit = case_when( rowSums(.[ ,b_items]) >=2 ~ 1, # two b items needed
TRUE ~ 0)) %>%
mutate(c_crit = case_when( rowSums(.[ ,c_items]) >=3 ~ 1, # three c items needed
TRUE ~ 0)) %>%
mutate(overal_crit = case_when( a_crit == 1 & b_crit == 1 & c_crit == 1 ~ 1,
TRUE ~ 0))
df_response$overal_crit