операторы ifelse для нескольких комбинаций условий - PullRequest
0 голосов
/ 15 января 2019

Я часто сталкиваюсь с случаями, когда я хочу написать оператор ifelse, содержащий несколько комбинаций условий, и в итоге я просто выписываю каждую возможную комбинацию, которая соответствует моим критериям. Я уверен, что должен быть более эффективный способ сделать это.

observation <- c(1:3, 1:3, 1:3, 1:3)
var1 <- c(0, 0.3, 0.3, 5, -0.3, -0.6, -4, 6,-0.75, 0.75, 3, 0.75)
dat <- as.data.frame(cbind(observation, var1))

В этом примере меня интересует создание флага для экстремальных значений (то есть значений, которые больше 1 или меньше -1), которые появляются во время второго наблюдения.

Я надеюсь, что есть какой-то способ попросить R сделать что-то вроде создания флага , если наблюдение == 2 и EITHER var1> 1 ИЛИ var1 <-1, сделайте его 1, в противном случае сделайте это 0 </em>

Но лучшее, что я знаю, это написать отдельные вложенные операторы ifelse, например

dat$flag <- with(dat, ifelse(observation == 2 & var1 > 1, 1, 
ifelse(observation == 2 & var1 < -1, 1, 0)))

Очевидно, что в данном примере это не так уж и плохо, но у меня часто бывает много условий для комбинации - например, я хочу пометить все записи для учеников, которые учились в 9-12 классах в течение 2014-2018 годов, что означает также пометку записи для учеников, которые учились в 9-11 классах в 2013 году, и которые были в 9-10 классах в 2012 году и которые были в 9 классе в 2011 году. Но, надеюсь, этот пример поможет понять :) Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Как уже упоминалось @RonakShah, вы можете избежать ifelse() или использовать его без вложенности. Однако в тех случаях, когда вам нужно вложенное ifelse(), вы можете просто использовать dplyr::case_when():

require(tidyverse)

dat %>% 
  mutate(flag1WithIfelse = ifelse(observation == 2 & (var1 > 1 |var1 < -1), 
                                  1, 0), 
         flag2WithCaseWhen = case_when(
           observation == 2 & (var1 > 1 |var1 < -1) ~ 1, 
           TRUE ~ 0))


   observation  var1 flag1WithIfelse flag2WithCaseWhen
1            1  0.00               0                 0
2            2  0.30               0                 0
3            3  0.30               0                 0
4            1  5.00               0                 0
5            2 -0.30               0                 0
6            3 -0.60               0                 0
7            1 -4.00               0                 0
8            2  6.00               1                 1
9            3 -0.75               0                 0
10           1  0.75               0                 0
11           2  3.00               1                 1
12           3  0.75               0                 0
0 голосов
/ 15 января 2019

В этом случае вам даже не понадобится ifelse. Вы можете объединить два условия на

+with(dat, observation == 2 & (var1 > 1 | var1 < -1))
#[1] 0 0 0 0 0 0 0 1 0 0 1 0

С ifelse вы можете использовать как

dat$flag <- with(dat, ifelse(observation == 2 & (var1 > 1 |var1 < -1), 1, 0))

#   observation  var1 flag
#1            1  0.00    0
#2            2  0.30    0
#3            3  0.30    0
#4            1  5.00    0
#5            2 -0.30    0
#6            3 -0.60    0
#7            1 -4.00    0
#8            2  6.00    1
#9            3 -0.75    0
#10           1  0.75    0
#11           2  3.00    1
#12           3  0.75    0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...