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

时间:2015-11-18 08:33:42

标签: r compare 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所在的所有行b1 但特殊a2的<{strong> a1不在特殊b2的{​​{1}}中。所以第二个问题是:当b2位于a1时,b1的此行a2a1的{​​{1}}行b2 b1 }。

第2行的示例:我正在检查,如果a1 = 1位于b1 = c(1,1,3,1,3)的任何位置。是的,所以我想检查第2行(a2 = 1a1 = 1b2 b1 = a1 = 1的任何位置是否b2 = c(2, 2, 2),所以这里a2 = 1。第2行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

但我无法解决第二个问题。也许我正在使用逻辑运算符以错误的方式工作。我的结果应该是这样的:

{{1}}

3 个答案:

答案 0 :(得分:1)

根据您的修改中的说明,您希望来自a1的特定a不属于b1的{​​{1}}或特定{{1}的行} b 等于a1中同一行的 a而来自b1的{​​{1}}不属于值{}来自ba2的{​​{1}} a等于特定b2的值。

在R中,您可以这样写:

b

答案 1 :(得分:0)

根据你的回答我改进了功能测试()。此版本返回数据帧:

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)

答案 2 :(得分:0)

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

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