Я бы сделал что-то подобное.
Это не красиво и довольно запутанно. Если вы выполните каждое утверждение, вы увидите, как оно работает.
library(tidyverse)
df %>%
rownames_to_column() %>%
pivot_longer(union(starts_with('var1'), starts_with('var2')),
names_to = c('n', 'type'),
names_pattern = '(var\\d)_(.*)') %>%
pivot_wider(names_from = n) %>%
mutate(rec = if_else(var2 == 1, var1, NA_integer_)) %>%
pivot_wider(names_from = type, values_from = c(var1, var2, rec)) %>%
select(-rowname) %>%
rename_at(vars(starts_with('rec')), ~str_c('var1', str_extract(.,'_.*'), '_rec'))
#> # A tibble: 10 x 11
#> var_something_e… var_something_e… var1_a_num var1_b_num var1_c_num var2_a_num
#> <int> <int> <int> <int> <int> <int>
#> 1 9 9 9 5 9 0
#> 2 7 9 9 9 10 0
#> 3 6 3 1 4 3 0
#> 4 9 4 7 4 9 0
#> 5 10 6 1 10 9 1
#> 6 4 2 5 10 1 0
#> 7 4 2 1 3 10 0
#> 8 10 10 5 10 1 0
#> 9 4 4 10 4 7 1
#> 10 2 1 1 7 6 1
#> # … with 5 more variables: var2_b_num <int>, var2_c_num <int>,
#> # var1__a_num_rec <int>, var1__b_num_rec <int>, var1__c_num_rec <int>
Создано в 2020-04-09 пакетом Представить (v0.3.0)
Данные:
df <- data.frame(var1_a_num = sample(1:10, 10, replace = TRUE),
var1_b_num = sample(1:10, 10, replace = TRUE),
var1_c_num = sample(1:10, 10, replace = TRUE),
var_something_else = sample(1:10, 10, replace = TRUE),
var2_a_num = sample(0:1, 10, replace = TRUE),
var2_b_num = sample(0:1, 10, replace = TRUE),
var2_c_num = sample(0:1, 10, replace = TRUE),
var_something_else2 = sample(1:10, 10, replace = TRUE))