Как я могу использовать оператор if в R с несколькими условиями? - PullRequest
0 голосов
/ 22 мая 2019

Я новичок в , и у меня есть вопрос о 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;

Любая помощь в создании кода будет оценена.

Ответы [ 2 ]

2 голосов
/ 22 мая 2019

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)
0 голосов
/ 22 мая 2019

Синтаксис, аналогичный тому, который вы перечислили:

DF$Var3 = with(DF,
  ifelse(Var2 == 1, Var1 * 30,
    ifelse(Var2 == 2, Var1 * 4, 
      ifelse(Var2 == 3, Var1, NA))))

Но другие методы будут быстрее писать и быстрее запускаться, как только вы освоитесь с ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...