【问题标题】:Using any in nested ifelse statement在嵌套的 ifelse 语句中使用 any
【发布时间】:2018-10-25 11:23:45
【问题描述】:

数据:

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 的“分层”方式使用any。有没有像any 这样的函数可以在这种情况下工作?

可能的解决方法

我可以定义一个函数 any_vec &lt;- 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)))

【问题讨论】:

  • 我猜ifelse 中的any 的问题在于它的返回值是长度1,而ifelse 需要一个与其输入长度相同的逻辑向量。
  • 这意味着如果您的条件长度为 1,您应该使用 ifelse
  • @Roland,不,OP 想要类似于any 但矢量化。 if/else 在这里帮不上忙。
  • 使用rowSums(m == 1) == 0 代替any?
  • @zx8754 是的,或者只是ifelse(rowSums(m),0,NA)

标签: r if-statement dplyr any


【解决方案1】:

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

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

【讨论】:

  • 我认为pmax 可以充当anypmin 充当all
猜你喜欢
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多