在嵌套的ifelse语句中使用any

时间:2018-05-15 14:56:16

标签: r if-statement dplyr any

数据:

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相同。

为什么我不能以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 :(得分:2)

这是另一种方法。我在开头转换为逻辑,最后转换为整数:

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