Могу ли я изменить многие столбцы в соответствии со многими другими столбцами с помощью mutate() и cross()?

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

    df <- data.frame(X_home = c("Yes", "Yes", "No"), 
                     X_school = c("No", "Yes", "No"), 
                     Y_home = c("A", "B", NA), 
                     Y_school = c(NA, "A", NA))

Если я использую mutate(), я могу сделать:

df %>% mutate(Y_home = if_else(X_home == "No", "C", Y_home),
              Y_school = if_else(X_school == "No", "C", Y_school))

чтобы получить то, что я хочу. Но проблема в том, что у меня много X_something и Y_something. Поэтому я хотел бы сделать это с чем-то вроде этого:

df %>% mutate(across(starts_with("Y_"), ~ if_else(...))

Является ли это возможным ?

Большое спасибо.

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
2
0
32
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Мы можем get значение соответствующего столбца после замены подстроки имени столбца (cur_column()) с помощью str_replace

library(dplyr)
library(stringr)
df %>%
   mutate(across(starts_with("Y_"),
    ~ case_when(get(str_replace(cur_column(), "Y_", "X_")) == "No" ~
       "C", TRUE ~ .x)))

-выход

 X_home X_school Y_home Y_school
1    Yes       No      A        C
2    Yes      Yes      B        A
3     No       No      C        C

Вот один из возможных подходов с поворотом:

Мы идентифицируем группы из двух в длинном формате, чтобы имитировать соответствующие пары столбцов.

Внутри этих групп мы mutateacrossschool и home и возвращаемся назад:

library(tidyr)
library(dplyr)

df %>%
  mutate(rn = row_number()) %>%
  pivot_longer(cols = -rn, names_to = c( "grp", '.value'), names_sep = "\\_") %>%
  group_by(rn) %>% 
  mutate(across(c(home, school), ~ if_else(is.na(.), "C",.))) %>% 
  pivot_wider(names_from = grp, 
              values_from = c(home, school),
              names_glue = "{grp}_{.value}") %>% 
  ungroup() %>% 
  select(-rn)
 X_home Y_home X_school Y_school
  <chr>  <chr>  <chr>    <chr>   
1 Yes    A      No       C       
2 Yes    B      Yes      A       
3 No     C      No       C 

Другие вопросы по теме