比较两个数据帧的两列(逻辑运算符)
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
。所以第二个问题是:当 a1
在 b1
中时 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
来自 b
和 a2
来自 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
我想同时比较两列。我的数据如下所示:
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
。所以第二个问题是:当 a1
在 b1
中时 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
来自 b
和 a2
来自 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