Мутировать набор столбцов условно на множество столбцов с похожими именами - PullRequest
1 голос
/ 09 апреля 2020

У меня есть несколько столбцов (имя начинается с var1), каждый из которых соединяется с другой переменной, начинающейся с var2. Например:

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))

Для каждой из этих пар я хотел бы создать новую переменную, принимающую значение var1, зависящее от значения var2, или NA , Я могу сделать это легко один за другим:

df %>% mutate(var1_a_num_rec = ifelse(var2_a_num == 1, var1_a_num, NA))
df %>% mutate(var1_b_num_rec = ifelse(var2_b_num == 1, var1_b_num, NA))
df %>% mutate(var1_c_num_rec = ifelse(var2_c_num == 1, var1_c_num, NA))

Но как сделать это более эффективно, если у меня много таких пар? ПРИМЕЧАНИЕ. Хотите избежать зацикливания.

1 Ответ

1 голос
/ 09 апреля 2020

Я бы сделал что-то подобное.

Это не красиво и довольно запутанно. Если вы выполните каждое утверждение, вы увидите, как оно работает.

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...