我想同时比较两列。我的数据如下:
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
的此行a2
对a1
的{{1}}行b2
b1
}。
第2行的示例:我正在检查,如果a1 = 1
位于b1 = c(1,1,3,1,3)
的任何位置。是的,所以我想检查第2行(a2 = 1
)a1 = 1
在b2
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}}
答案 0 :(得分:1)
根据您的修改中的说明,您希望来自a1
的特定a
不属于b1
的{{1}}或特定{{1}的行} b
等于a1
中同一行的 a
而来自b1
的{{1}}不属于值{}来自b
行a2
的{{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