【问题标题】:Boolean operators in if/ifelse loopsif/ifelse 循环中的布尔运算符
【发布时间】:2013-03-27 18:25:50
【问题描述】:

这样的矩阵

r<-20;
c<-6;
m1 <- round(matrix(runif(r*c), r, c)))

我想使用 if/ifelse 和布尔运算符基于最后三个创建两个新列。

我尝试了以下但没有成功:

for (i in 1:dim(m1)[1]){
  if(sum(m1[i,4:6]==0)) {m1$Code1[i]<-0;m1$Code2[i]<-0}
  else if(sum(m1[i,4:6]==3)) {m1$Code1[i]<-5;m1$Code2[i]<-5}
  else if(m1[i,4]==0 && m1[,5]==1) {m1$Code1[i]<-3}
  else if(m1[i,4]==0 && m1[,6]==1) {m1$Code2[i]<-3}
  else if(m1[i,4]==1 && m1[,5]==0) {m1$Code1[i]<-2}
  else if(m1[i,4]==1 && m1[,6]==0) {m1$Code2[i]<-2} 
  else if(m1[i,4]==1 && m1[,5]==1) {m1$Code1[i]<-4}
  else if(m1[i,4]==1 && m1[,6]==1) {m1$Code2[i]<-4}  
}

我的问题是我是否可以在 if 子句中使用 &&,但不知何故这不起作用。有人可以告诉我为什么或提供更好的选择吗?

提前致谢, 斯蒂芬

【问题讨论】:

  • 请在您的问题中添加相关语言标签。
  • 我的猜测是m1[,5] 部分,但需要一种语言来更好地理解这个问题。
  • 对不起,我刚刚添加了语言标签

标签: r if-statement boolean-operations


【解决方案1】:

我从您的for 循环中提炼出您希望对第 4 行和第 5 行的组合以及第 4 和第 6 行的组合执行相同的操作。我认为您最好可以创建一个通用函数并应用它在两种组合上。我为您的问题提出以下解决方案。

get.code <- function(x) {
 if(x[1] == 0 & x[2] == 0){0} else if (x[1] == 0 & x[2] == 1){3
 }else if(x[1] == 1 & x[2] == 1){4} else {2}
}

code1 <- apply(m1[,c(4,5)], 1, get.code)
code2 <- apply(m1[,c(4,6)], 1, get.code)
cbind(m1,code1, code2)

【讨论】:

  • 您好,埃德温,感谢您的建议。此代码考虑了 & 运算符并且工作顺利。但是以这种方式不考虑在比较三列的for 循环的第二行中的评估。这是否必须额外完成?
  • 我最终选择写入附加函数来评估剩余的选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 2014-09-23
  • 2011-09-05
  • 2011-04-20
  • 2014-06-16
相关资源
最近更新 更多