【发布时间】: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
问题
我希望newcol 与desiredResult 相同。
为什么我不能以ifelse 的“分层”方式使用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)))
【问题讨论】:
-
我猜
ifelse中的any的问题在于它的返回值是长度1,而ifelse需要一个与其输入长度相同的逻辑向量。 -
这意味着如果您的条件长度为 1,您应该使用
if和else。 -
@Roland,不,OP 想要类似于
any但矢量化。if/else在这里帮不上忙。 -
使用
rowSums(m == 1) == 0代替any? -
@zx8754 是的,或者只是
ifelse(rowSums(m),0,NA)
标签: r if-statement dplyr any