R - Создание переменных с исключением или

У меня есть набор данных с некоторыми переменными, которые указывают, может или не может пожилой человек выполнять какое-либо действие (сесть на автобус, купаться...). Мне нужно создать некоторые переменные, такие как В группе C старшему требуется помощь для выполнения 2 действий, включая купание. #В группе D пожилому человеку требуется помощь для выполнения 3 действий, включая купание и одевание.

Поэтому наблюдения не могут быть в двух группах. Мой набор данных выглядит так:

    bathing    take_bus   dressing   eating  
1     4          4          4          3
2     2          1          3          2
3     4          2          4          2
4     5          4          1          2
5     2          4          4          1

Цифры обозначают уровень сложности выполнения задания. Меня интересует только уровень 4 или выше (старшие вообще не могут заниматься в одиночку).

Так, например, здесь люди 3 и 4 входят в группу C. Человек 1 находится в группе D, НО не должен быть в группе C. Индивидуум 5 не входит в группу C, потому что он может мыться один.

Я сделал что-то вроде этого:

df$is_C <- ifelse(df$bathing >= 4 & (df$dressing >= 4 | df$eating >= 4 |
                                                        df$take_bus >= 4), 1, 0)
df$is_C <- factor(x = df$is_C, levels = c(1, 0), labels = "Group_C", "Not_Group_C")

df$is_D <- ifelse(df$bathing >= 4 & df$dressing >= 4 & (  df$eating >= 4 | df$take_bus >= 4), 1, 0)
df$is_D <- factor(x = df$is_D, levels = c(1, 0), labels = "Group_D", "Not_Group_D")

Однако, когда я это делаю:

 >table(df$is_C, df$is_D)
          
           Group_D Not_Group_D
  Group_C      683      290
  Not_Group_C    0     9650

Таким образом, 683 человека находятся в группе C и должны быть только в группе D.... (Это нормально, когда люди не в группе C и не в группе D, потому что у меня есть другие переменные).

Что я должен делать???????

Спасибо всем за вашу доброту и ваши ответы!


person Emeline    schedule 23.06.2020    source источник


Ответы (1)


Вот решение.
Чтобы сделать его более читабельным, определены две функции, обе из которых возвращают логические значения. Затем логические значения используются для взаимного исключения групп C и D. Когда это делается, значения приводятся к целому, а затем к факторному.

f_is_C <- function(x, level = 4) x[1] >= level && any(x[-1] >= level)
f_is_D <- function(x, level = 4) all(x[1:2] >= level) && any(x[3:4] >= level)

is_D <- apply(df, 1, f_is_D)
is_C <- apply(df, 1, f_is_C) & !is_D  # mutual exclusion

df$is_C <- factor(as.integer(is_C), levels = 1:0, labels = c("Group_C", "Not_Group_C"))
df$is_D <- factor(as.integer(is_D), levels = 1:0, labels = c("Group_D", "Not_Group_D"))

with(df, table(is_C, is_D))
#             is_D
#is_C          Group_D Not_Group_D
#  Group_C           0           2
#  Not_Group_C       1           2
person Rui Barradas    schedule 23.06.2020