Как объединить мутировать, когда условие одно и то же, но результат другой?

#r #dplyr

Вопрос:

Для моего фрейма данных в единице столбца, если найдено «mg», оно заменяется на «g», а затем соответствующее значение в столбце «Масса» делится на 1000. Я дважды использовал мутацию, чтобы добиться этого. Есть ли какие-либо способы объединить эти две мутации в одну?

 df %gt;% mutate(unit = case_when(unit == "mg" ~ "g")) df %gt;% mutate(mass = case_when(unit == "mg" ~ mass / 1000))  

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

1. Вторая строка завершится ошибкой, потому что тип будет другим. Ты имел в виду mutate(mass = .

2. О да, вы правы, отредактировано

Ответ №1:

Мы можем включить несколько преобразований (в данном случае два преобразования) в один и тот же mutate вызов в обратном порядке. Если ваше утверждение case_when настолько простое, ifelse достаточно:

 library(dplyr)  df %gt;% mutate(mass = ifelse(unit == 'mg', mass / 1000, mass),   unit = ifelse(unit == 'mg', 'g', unit))  

Ответ №2:

Создайте логическое условие в виде столбца и повторно используйте его. Поскольку значения замены разные, лучше иметь их отдельно. Кроме того, case_when по умолчанию изменяет остальные элементы на NA . Если операция предназначалась для сохранения остальных значений из исходного столбца, укажите TRUE ~ условие

 library(dplyr) df lt;- df %gt;%  mutate(i1 = unit == 'mg',   unit = case_when(i1 ~ 'g', TRUE ~ unit),   mass = case_when(i1~ mass/1000, TRUE ~ mass), i1 = NULL)