Создание нескольких новых столбцов в DF в зависимости от порядка логических столбцов

Я пытаюсь создать три новых столбца со значениями в зависимости от определенного порядка трех столбцов логического типа.

например у меня есть это:

     a     b    c 
1 TRUE  TRUE TRUE
2 TRUE FALSE TRUE
3 TRUE FALSE TRUE

И в зависимости от того, проходят ли по строке значения ИСТИНА, ИСТИНА, ИСТИНА, как в строке 1, затем создайте три новых столбца со значениями 1,1,1, но если порядок ИСТИНА, ЛОЖЬ, ИСТИНА, как в строке 2 и 3, тогда значения будут 2,3,3. Просто отметим, что значение TRUE не = 1, а значение, которое я определяю в зависимости от всех трех логических значений (всего 8 возможных комбинаций, каждая из которых определяется тремя отдельными числами). Итак, я получаю что-то вроде этого:

     a     b    c d e f
1 TRUE  TRUE TRUE 5 5 2
2 TRUE FALSE TRUE 2 3 3
3 TRUE FALSE TRUE 2 3 3

Если бы кто-то мог указать мне правильное направление, чтобы сделать это максимально эффективно, я был бы очень признателен, поскольку я относительно новичок в R.


person jagex    schedule 07.06.2020    source источник


Ответы (2)


Вот решение dplyr с использованием case_when. В левой части ~ вы определяете свои условия, а в правой части ~ вы назначаете значение, когда эти условия выполняются. Если условие не выполнено (т. е. все значения FALSE), вы вернете NA.

df %>% 
  mutate(d = 
           case_when(
             a == TRUE & b == TRUE & c == TRUE ~ 5,
             a == TRUE & b == FALSE & c == TRUE ~ 2
           ),
         e = 
           case_when(
             a == TRUE & b == TRUE & c == TRUE ~ 5,
             a == TRUE & b == FALSE & c == TRUE ~ 3
           ),
         f = 
           case_when(
             a == TRUE & b == TRUE & c == TRUE ~ 2,
             a == TRUE & b == FALSE & c == TRUE ~ 3
           ))

Что дает вам:

  a     b     c         d     e     f
  <lgl> <lgl> <lgl> <dbl> <dbl> <dbl>
1 TRUE  TRUE  TRUE      5     5     2
2 TRUE  FALSE TRUE      2     3     3
3 TRUE  FALSE TRUE      2     3     3

Данные:

df <- tribble(
  ~a, ~b, ~c,
  TRUE, TRUE, TRUE,
  TRUE, FALSE, TRUE,
  TRUE, FALSE, TRUE
)
person Matt    schedule 07.06.2020

Если нет никакой логики в получении значений для столбцов и вам нужно добавить условия индивидуально для каждой комбинации, вы можете использовать if/else.

df[c('d', 'e', 'f')] <- t(apply(df, 1, function(x) {
                          if (x[1] && x[2] && x[3]) c(5, 5, 2)
                          else if (x[1] && !x[2] && x[3]) c(2, 3, 3)
                          #add more conditions
                          #....
                          }))

df
#     a     b    c d e f
#1 TRUE  TRUE TRUE 5 5 2
#2 TRUE FALSE TRUE 2 3 3
#3 TRUE FALSE TRUE 2 3 3
person Ronak Shah    schedule 07.06.2020