在嵌套的 ifelse 语句中使用 any

Using any in nested ifelse statement

数据:

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

问题

我希望 newcoldesiredResult 相同。

为什么我不能以 ifelse 的 "stratified" 方式使用 any。是否有像 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)))

这是另一种方法。我在开头转换为逻辑并在结尾转换回整数:

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

我基本上用 pmax 替换了 any