Логический оператор «ИЛИ» дает противоречивые результаты - PullRequest
0 голосов
/ 19 июня 2019

У меня есть два набора данных 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

Моя логика не генерирует MW для столбца E Строка 3. Ниже приведен пример вывода, который генерирует мой цикл:

    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» последовательно, и я думаю, что это связано с «ИЛИ», но не могу понять, что вызывает эту проблему, так как логика выглядит правильно для меня.Примером этого является (Столбец 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 голосов
/ 20 июня 2019

Еще раз спасибо за вашу помощь. Я руководствовался использованием all() при сравнении векторов в выражении if. Еще раз спасибо!

0 голосов
/ 19 июня 2019

Может быть сделано векторизованным способом

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))]
...