ищите различия между векторами с одинаковыми именами (например, *_pre и *_post) в R

#r

Вопрос:

у меня есть фрейм данных с несколькими столбцами, которые кодируют экспозицию (как 1/0) в течение нескольких временных периодов и следуют шаблону именования, например, exposure1_pre2, exposure1_pre1, exposure1_post … exposuren_pre2, …

рабочий пример

 library(dplyr)

df <- tibble(exposure1_pre2 = sample(c(0, 1), size = 20, replace = T),
             exposure1_pre1 = sample(c(0, 1), size = 20, replace = T),
             exposure1_post = sample(c(0, 1), size = 20, replace = T),
             exposure2_pre2 = sample(c(0, 1), size = 20, replace = T),
             exposure2_pre1 = sample(c(0, 1), size = 20, replace = T),
             exposure2_post = sample(c(0, 1), size = 20, replace = T)
             )
 

я хотел бы закодировать фиктивные переменные, которые имеют значение 1/0, если происходит изменение направления от одного момента времени к другому, т. Е. Когда значение exposure1_pre2 равно 0, а значение exposure1_pre1 равно 1, новый столбец exposure1_pre2_to_pre1 == 1.

я пытаюсь осознать это с помощью dplyr if_else — или в идеале case_when для всех возможных комбинаций — и думаю в направлении

 df %>%
  mutate(
    across(contains("pre2"),
    ~if_else(.x == 0 amp; ??? == 1, 1, 0), .names = "{???}_pre2_to_pre1")
  )
 

как очевидно, я не знаю, как структурировать условие таким образом, чтобы оно искало переменную с аналогичным именем *_pre2 для оценки разницы, а также должно было бы брать только часть экспозиции из входного столбца для присвоения имени новому столбцу — я полагаю, что grep мог бы сделать это здесь?

большое вам спасибо и хорошего дня!

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

1. это намеренно, но я согласен, что это сбивает с толку, я удалил часть peri — спасибо!

Ответ №1:

Зациклите across столбец «pre2», получите имя столбца ( cur_column() ), замените подстроку на «pre1», get значение, выполните сложное логическое выражение и принудительно преобразуйте логический вывод в двоичный с помощью (или as.integer )

 library(dplyr)
library(stringr)
 df %>%
  mutate(
     across(contains("pre2"),
             ~  (. == 0 amp; get(str_replace(cur_column(), 'pre2', 'pre1')) == 1),
              .names = '{.col}_to_pre1'))
 

-выход

 # A tibble: 20 x 8
   exposure1_pre2 exposure1_pre1 exposure1_post exposure2_pre2 exposure2_pre1 exposure2_post exposure1_pre2_to_pre1 exposure2_pre2_to_pre1
            <dbl>          <dbl>          <dbl>          <dbl>          <dbl>          <dbl>                  <int>                  <int>
 1              1              0              1              0              1              1                      0                      1
 2              1              0              1              1              0              0                      0                      0
 3              1              0              1              1              0              0                      0                      0
 4              1              1              1              0              1              0                      0                      1
 5              0              1              1              0              0              0                      1                      0
 6              1              1              1              0              1              1                      0                      1
 7              0              1              0              1              0              0                      1                      0
 8              0              1              0              1              1              1                      1                      0
 9              0              1              0              0              1              0                      1                      1
10              1              0              1              1              1              0                      0                      0
11              0              0              1              0              0              1                      0                      0
12              0              1              1              1              1              1                      1                      0
13              0              1              1              1              1              0                      1                      0
14              1              1              1              0              0              1                      0                      0
15              1              1              1              1              0              0                      0                      0
16              1              1              1              0              0              1                      0                      0
17              0              0              0              1              0              0                      0                      0
18              1              0              0              0              0              0                      0                      0
19              1              0              0              0              0              1                      0                      0
20              1              0              1              1              0              1                      0                      0