比较两个数据帧的两列(逻辑运算符)

Comparing two columns of two dataframes (logical operators)

我想同时比较两列。我的数据如下所示:

a <- data.frame("a1" = c(1,1,1,3,4), "a2" = c(2,1,2,1,2))
b <- data.frame("b1" = c(1,1,3,1,3), "b2" = c(2,2,1,2,1))
cbind(a, b)
#   a1 a2 b1 b2
# 1  1  2  1  2
# 2  1  1  1  2
# 3  1  2  3  1
# 4  3  1  1  2
# 5  4  2  3  1

我想识别 a1 不在 b1 中的所有行 其中 a1 在 [=14 中=] 但是 a2 对于特殊 a1 不在 b2 对于特殊 b2。所以第二个问题是:当 a1b1 中时 a2 对于 a1 这一行也在 b2 对于 [=14= 这一行].

第 2 行的示例:我正在检查 a1 = 1 是否在 b1 = c(1,1,3,1,3) 中的任何位置。是的,所以我想检查第 2 行中的 a2 = 1(其中 a1 = 1)是否在 b2 中的任何位置,其中 b1 = a1 = 1,所以这里是 b2 = c(2, 2, 2)。因为第 2 行 a2 = 1 不在 b2 = c(2, 2, 2) 中,所以结果应该显示这一行。

第一个问题用下面的代码很容易回答:

a[which(!(a$a1 %in% b$b1)), ]
#   a1 a2
# 5  4  2

但是我无法解决第二个问题。也许我使用逻辑运算符的方式不对。我的结果应该是这样的:

  a1 a2
2  1  1
4  4  2

根据您的编辑中的解释,您希望 a 中的特定 a1 不在 b 中的 b1 中或特定 a1 来自 a 等于 b1 来自 ba2 来自 a 的同一行不在 b 行的 b2 的值中,其中 b1 等于特定 a1.

的值

在 R 中,你可以这样写:

cond <- sapply(seq(nrow(a)), # check each row, one by one
               function (i){
                   !(a$a1[i] %in% b$b1) | # a1 of the specific row is not in b1 or
                   !(a$a2[i]  %in% b$b2[b$b1==a$a1[i]]) # a2 of the specific row is not in the values of b2 for which b1 equals a1 of the sepcific row
               })

a[cond, ]
#  a1 a2
#2  1  1
#5  4  2

根据您的回答我改进了函数test()。这个版本returns一个数据框:

a <- data.frame(a1=c(1,1,1,3,4), a2=c(2,1,2,1,2))
b <- data.frame(b1=c(1,1,3,1,3), b2=c(2,2,1,2,1))

test <- function (a, b) {
  R <- subset(a,!a1 %in% b$b1)

  I <- unique(a$a1[a$a1 %in% b$b1])
  for (i in I) {
    ai <- subset(a, a1 == i)
    bi <- subset(b, b1 == i)
    J <- unique(bi$b2)
    for (j in  unique(ai$a2)) if (! j %in% J) R <- rbind(subset(ai, a2==j), R)
  }
  R
}

test(a, b)

显然不是一个很好的解决方案,但它适用于我的数据(两个数据集的行的维度不相等,变量中值的位置不同) - 这里使用新的示例数据,因为我选择了第一个真的很糟糕。

a <- data.frame("a1" = c(1,1,1,3,4), "a2" = c(2,1,2,1,2))
b <- data.frame("b1" = c(1,3,1,1), "b2" = c(2,1,2,2))

test <- function (data1, data2) {

   for (i in unique(data1[data1$a1 %in% data2$b1, "a1"])) {
     temp_data1 <- data1[data1$a1 == i, c("a1", "a2")]
     temp_data2 <- data2[data2$b1 == i, c("b1", "b2")]

     for (j in unique(temp_data1$a2)) {
        test <- j %in% unique(temp_data2$b2)

       if (test == FALSE) {
          print(unique(temp_data1[temp_data1$a1 == i & temp_data1$a2 == j, ]))
       }
     }
   }

   for (k in unique(data1[which(!(data1$a1 %in% data2$b1)), "a1"])) {
     print(unique(data1[data1$a1 == k, c("a1", "a2")]))
   } 
 }

 test(a, b)
   a1 a2
 2  1  1
   a1 a2
 5  4  2