逻辑运算符“ OR”产生不一致的结果

时间:2019-06-19 16:42:16

标签: r loops if-statement logical-operators

我有两个数据集Mtest和Ztest。我正在尝试将各个数据集中的每个值都比较为零,并使用比较的结果来创建一个具有结果的新数据集。比较应该得出三个结果之一。

Result 1: Mtest > 0 & Ztest > 0 <- "OW"
Result 2: Mtest < 0 & Ztest < 0 <- "UW"
Result 3: Mtest < 0 & Ztest > 0 | Mtest > 0 & Ztest < 0 <- "MW"

数据集1:Mtest:

     A       B       C      D       E       F       G        H
1   -0.0306 0.0148  -0.0194 -0.0074 -0.0710 0.0020  -0.0060 -0.0010
2   -0.0082 0.0146  -0.0058 0.0030  -0.0350 0.0073  0.0108  0.0003
3   0.0038  0.0267  -0.0017 0.0186  -0.0051 0.0115  0.0361  0.0027
4   0.0150  0.0304  0.0011  0.0267  0.0261  0.0128  0.0378  0.0078
5   0.0048  0.0421  -0.0140 0.0327  0.0462  0.0141  0.0830  0.0111
6   0.0225  0.0448  -0.0060 0.0369  0.0602  0.0158  0.0711  0.0121

数据集2:Ztest

    A       B       C       D       E       F       G       H
1   3.6746  0.3508  3.6308  2.6540  1.6122  3.3419  -0.0075 0.2960
2   1.0267  -0.6883 0.5399  -0.2005 -0.5095 0.1366  -0.6247 -0.0911
3   0.3776  2.2182  0.2944  1.8630  1.6847  1.6018  1.6330  0.3921
4   0.7568  -0.5380 0.3686  0.1086  0.0234  0.1360  -0.7992 0.0055
5   -1.0248 2.6451  -1.5115 0.9517  0.7697  1.1084  2.0410  0.5189
6   1.0474  0.0568  0.7330  0.2214  -0.0264 -0.1067 -0.3753 0.0055

所需的输出:

    A   B   C   D   E   F   G   H
1   MW  OW  MW  MW  MW  OW  UW  MW
2   MW  MW  MW  MW  UW  OW  MW  MW
3   OW  OW  MW  OW  MW  OW  OW  OW
4   OW  MW  OW  OW  OW  OW  OW  OW
5   MW  OW  UW  OW  OW  OW  OW  OW
6   OW  OW  MW  OW  MW  MW  MW  OW

我的逻辑不是为E列第3行生成MW。以下是我的循环正在生成的输出示例:

    A   B   C   D   E   F   G   H
1   OW  OW  OW  OW  OW  OW  UW  OW
2   OW  MW  OW  MW  UW  OW  MW  MW
3   OW  OW  OW  OW  OW  OW  OW  OW
4   OW  MW  OW  OW  OW  OW  MW  OW
5   MW  OW  UW  OW  OW  OW  OW  OW
6   OW  OW  OW  OW  MW  MW  MW  OW

当我运行以下循环时,它并不能始终产生“ MW”结果,我认为这与“ OR”有关,但由于逻辑看起来正确,因此无法弄清楚是什么原因导致了此问题。我。一个例子是(第E列第3行)应为“ MW”,但要加上“ OW”

    testMatrix <- matrix(0, ncol = 8, nrow = 6)

for(i in 1:nrow(Ztest)) {
  for(j in 1:ncol(Ztest)) {
    if(c(Ztest[i,j], Mtest[i,j]) > 0){
      testMatrix.tf[i,j] <- "OW"
    } else {
      if(((Ztest[i,j] > 0 ) & (Mtest[i,j] < 0)) | ((Ztest[i,j] < 0) & (Mtest[i,j] > 0))){
        testMatrix[i,j] <- "MW"
      } else {
        if(c(Ztest[i,j],Mtest[i,j]) < 0){
          testMatrix.tf[i,j] <- "UW"
        }
      }
    }
  }
} 

一如既往,感谢您可以通过逻辑比较为我发现问题提供帮助。

2 个答案:

答案 0 :(得分:0)

可以矢量化方式完成

out <- (Mtest > 0 & Ztest > 0) + 2 * (Mtest < 0 & Ztest < 0) + 
         4 * ((Mtest < 0 & Ztest > 0) | (Mtest > 0 & Ztest < 0))
out[] <- c("OW", "UW", "MW")[as.numeric(factor(out))]

答案 1 :(得分:0)

再次感谢您的帮助。在比较all()语句中的向量时,我被引导使用if。再次感谢!