Я новичок в р, и у меня есть вопрос о if ()
утверждениях.
Мои данные выглядят так:
Var1 Var2
4 2
6 2
5 1
3 3
2 1
Я хочу создать новую переменную с именем Var3
. Что-то типа
if Var2 = 1 then do; Var3 = Var1*30; end; else;
if Var2 = 2 then do; Var3 = Var1*4; end; else;
if Var2 = 3 then do; Var3 = Var1*1; end; else;
Любая помощь в создании кода будет оценена по достоинству.
Логика case-when хороша, если у вас есть сложные выражения, но R также позволяет вам избежать пошаговых кропотливых пошаговых выражений. Например, в этом примере это, по сути, справочная таблица - например. dat$Var1 * c(30, 4, 1)[dat$Var2]
1) переключатель Используя DF
, как показано в примечании в конце, попробуйте использовать switch
, как показано здесь. Пакеты не используются.
transform(DF, Var3 = Var1 * sapply(Var2, switch, 30, 4, 1))
давая:
Var1 Var2 Var3
1 4 2 16
2 6 2 24
3 5 1 150
4 3 3 3
5 2 1 60
См. ?switch
для получения дополнительной информации.
2) арифметика Другой подход заключается в использовании арифметического оператора, который дает желаемое значение. Это также не использует пакеты.
transform(DF, Var3 = Var1 * ((Var2 == 1) * 30 + (Var2 == 2) * 4 + (Var2 == 3) * 1))
2а) Вариант этого:
transform(DF, Var3 = Var1 * outer(Var2, 1:3, "= = ") %*% c(30, 4, 1))
3) подписка Это также работает:
transform(DF, Var3 = Var1 * c(30, 4, 1)[Var2])
4) фактор Другой подход — создать коэффициент, а затем преобразовать его обратно в числовое значение:
transform(DF, Var3 = Var1 * as.numeric(as.character(factor(Var2, labels = c(30, 4, 1)))))
Lines <- "Var1 Var2
4 2
6 2
5 1
3 3
2 1"
DF <- read.table(text = Lines, header = TRUE)
Спасибо за ваш ответ. Метод, который вы использовали для 2) арифметики, работал очень хорошо. Я только что столкнулся с одной проблемой: я не смог найти Var3 в наборе данных. Я пытался использовать следующее DF$SKM <- transform(DF, Var3 = Var1 * ((Var2 == 1) * 30 + (Var2 == 2) * 4 + (Var2 == 3) * 1))
Я не мог найти Var3. Есть ли способ сделать новую переменную частью набора данных
Вам нужен DF <- transform(...
или вы можете дать ему другое имя, чтобы не перезаписывать оригинал.
В синтаксисе, подобном тому, что вы указали:
DF$Var3 = with(DF,
ifelse(Var2 == 1, Var1 * 30,
ifelse(Var2 == 2, Var1 * 4,
ifelse(Var2 == 3, Var1, NA))))
Но другие методы будут быстрее писаться и быстрее работать, как только вы их освоите.
dplyr::case_when
отлично подходит для этого.