1) switch Используя 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))
2a) Вариант:
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)