Вот подход с использованием tidyverse:
library(tidyverse)
df <- tribble(~varA, ~varB, ~multiplier, ~varC,
100,1998,1.4,140,
100,1998,1.4,140,
100,1999,1.7,170,
100,1999,1.7,170,
100,2000,2.0,200,
100,2000,2.0,200
)
df <- df %>%
mutate(varA = ifelse(varB == 1998, varA * 1.433988335, varA))
Вывод:
# A tibble: 6 x 4
varA varB multiplier varC
<dbl> <dbl> <dbl> <dbl>
1 143. 1998 1.4 140
2 143. 1998 1.4 140
3 100 1999 1.7 170
4 100 1999 1.7 170
5 100 2000 2 200
6 100 2000 2 200
Спасибо @gregor за напоминание о необходимости объяснения кода.
IВ предисловии хотел бы сказать, что я просто представляю альтернативный подход к рассматриваемому вопросу.Если этот подход не заслужен, пожалуйста, не стесняйтесь его игнорировать.
Команда mutate()
- это грамматический способ создания столбца в тидиверсе.По сути, я создаю новый столбец с именем varA, который по существу заменит существующий столбец varA.
В исходном запросе вы использовали операторы if(){}
и else(){}
.Оба действительны.Для простоты я использовал функцию ifelse()
.Эта функция встроена в базу R, и я нахожу ее немного легче читать.Личные предпочтения.
Синтаксис для ifelse()
: ifelse(test, yes, no)
(согласно странице справки).По сути, если ваше условие проверки истинно, то все, что вы указали в аргументе «да», будет выполнено, в противном случае будет выполнен аргумент «нет».
В приведенном мною примере я просто использовал аналогичное условие тестачто ты применил.Если бы значение varB оказалось равным 1998, тогда оно возьмет существующее значение в varA и умножит его на 1,4339.