#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