假设你有两个数据框
df1 <- data.frame(V1 = c(1, 2, 3), v2 = c("a", "b", "c"))
df2 <- data.frame(V1 = c(1, 2, 2), v2 = c("b", "b", "c"))
Run Code Online (Sandbox Code Playgroud)
这是它们并排的样子:
> cbind(df1, df2)
V1 v2 V1 v2
1 1 a 1 b
2 2 b 2 b
3 3 c 2 c
Run Code Online (Sandbox Code Playgroud)
您想知道在所有变量中哪些观察是重复的。
这可以通过将列粘贴在一起然后使用 %in% 来完成:
df1Vec <- apply(df1, 1, paste, collapse= "")
df2Vec <- apply(df2, 1, paste, collapse= "")
df2Vec %in% df1Vec
[1] FALSE TRUE FALSE
Run Code Online (Sandbox Code Playgroud)
因此,第二个观察是 df2 和 df1 中唯一的一个。
有没有更快的方法来生成这个输出——比如 %IN%,它是跨多个变量的 %in%,还是我们应该满足于 apply(paste) 解决方案?
我会和
interaction(df2) %in% interaction(df1)
# [1] FALSE TRUE FALSE
Run Code Online (Sandbox Code Playgroud)
您可以将其包装在二元运算符中:
"%IN%" <- function(x, y) interaction(x) %in% interaction(y)
Run Code Online (Sandbox Code Playgroud)
然后
df2 %IN% df1
# [1] FALSE TRUE FALSE
rbind(df2, df2) %IN% df1
# [1] FALSE TRUE FALSE FALSE TRUE FALSE
Run Code Online (Sandbox Code Playgroud)
免责声明:我从以前使用do.call(paste, ...)而不是interaction(...). 如果你愿意,可以查阅历史。我认为 Arun 关于“极其低效”(有点极端恕我直言)的说法仍然成立,但如果你喜欢一个简洁的解决方案,它只使用基础 R 并且快速处理小数据,那可能就是这样。