Использование любого вложенного оператора ifelse - PullRequest
0 голосов
/ 15 мая 2018

данные:

set.seed(1337)
m <- matrix(sample(c(0,0,0,1),size = 50,replace=T),ncol=5) %>% as.data.frame
colnames(m)<-LETTERS[1:5]

код:

m %<>%
        mutate(newcol       = ifelse(A==1&(B==1|C==1)&(D==1|E==1),1,
                                     ifelse(any(A,B,C,D,E),0,NA)),
               desiredResult= ifelse(A==1&(B==1|C==1)&(D==1|E==1),1,
                                     ifelse(!(A==0&B==0&C==0&D==0&E==0),0,NA)))

выглядит так:

   A B C D E newcol desiredResult
1  0 1 1 1 0      0             0
2  0 1 0 0 1      0             0
3  0 1 0 0 0      0             0
4  0 0 0 0 0      0            NA
5  0 1 0 1 0      0             0
6  0 0 1 0 0      0             0
7  1 1 1 1 0      1             1
8  0 1 1 0 0      0             0
9  0 0 0 0 0      0            NA
10 0 0 1 0 0      0             0

вопрос

Я хочу, чтобы newcol был таким же, как desiredResult.

Почему я не могу использовать any в этом "стратифицированная "манера ifelse.Есть ли такая функция, как any, которая будет работать в этой ситуации?

возможный обходной путь

Я мог бы определить функцию any_vec <- function(...) {apply(cbind(...),1,any)}, но это не заставляет меня улыбатьсяслишком много.

как предложено в ответе

с использованием pmax работает точно так же, как векторизация any.

m %>%
    mutate(pmaxResult = ifelse(A==1& pmax(B,C) & pmax(D,E),1,
                                 ifelse(pmax(A,B,C,D,E),0,NA)),
           desiredResult= ifelse(A==1&(B==1|C==1)&(D==1|E==1),1,
                                 ifelse(!(A==0&B==0&C==0&D==0&E==0),0,NA)))

1 Ответ

0 голосов
/ 15 мая 2018

Вот альтернативный подход.Я преобразовал в логическое в начале и обратно в целое число в конце:

m %>% 
  mutate_all(as.logical) %>% 
  mutate(newcol       = A & pmax(B,C) & pmax(D, E) ,
         newcol       = replace(newcol, !newcol & !pmax(A,B,C,D,E), NA)) %>% 
  mutate_all(as.integer)

#    A B C D E newcol
# 1  0 1 1 1 0      0
# 2  0 1 0 0 1      0
# 3  0 1 0 0 0      0
# 4  0 0 0 0 0     NA
# 5  0 1 0 1 0      0
# 6  0 0 1 0 0      0
# 7  1 1 1 1 0      1
# 8  0 1 1 0 0      0
# 9  0 0 0 0 0     NA
# 10 0 0 1 0 0      0

Я в основном заменил any на pmax.

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