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