gpt4 book ai didi

r - 识别数据框 A 中未包含在数据框 B 中的记录

转载 作者:行者123 更新时间:2023-12-03 23:43:17 26 4
gpt4 key购买 nike

很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center .




9年前关闭。




这是我第一次在这里发帖,所以请善待;-)

编辑
在我有机会做出建议的更改之前,我的问题已关闭。所以我现在正在努力做得更好,感谢到目前为止回答的每个人!



如何识别数据框中的记录/行 x.1未包含在数据框中的 x.2以最有效的方式基于所有可用属性(即所有列)?

示例数据

> x.1 <- data.frame(a=c(1,2,3,4,5), b=c(1,2,3,4,5))
> x.1
a b
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5

> x.2 <- data.frame(a=c(1,1,2,3,4), b=c(1,1,99,3,4))
> x.2
a b
1 1 1
2 1 1
3 2 99
4 3 3
5 4 4

想要的结果
  a b
2 2 2
5 5 5

迄今为止最好的解决方案

作者:Brian Ripley 教授和 Gabor Grothendieck
> fun.12 <- function(x.1,x.2,...){
+ x.1p <- do.call("paste", x.1)
+ x.2p <- do.call("paste", x.2)
+ x.1[! x.1p %in% x.2p, ]
+ }
> fun.12(x.1,x.2)
a b
2 2 2
5 5 5
> sol.12 <- microbenchmark(fun.12(x.1,x.2))
> sol.12 <- median(sol.12$time)/1000000000
> sol.12
> [1] 0.000207784

我的 blog 提供了迄今为止测试过的所有解决方案的集合。

最终编辑 2011-10-14

这是封装在函数“mergeX()”中的最佳解决方案:
setGeneric(
name="mergeX",
signature=c("src.1", "src.2"),
def=function(
src.1,
src.2,
...
){
standardGeneric("mergeX")
}
)

setMethod(
f="mergeX",
signature=signature(src.1="data.frame", src.2="data.frame"),
definition=function(
src.1,
src.2,
do.inverse=FALSE,
...
){
if(!do.inverse){
out <- merge(x=src.1, y=src.2, ...)
} else {
if("by.y" %in% names(list(...))){
src.2.0 <- src.2
src.2 <- src.1
src.1 <- src.2.0
}
src.1p <- do.call("paste", src.1)
src.2p <- do.call("paste", src.2)
out <- src.1[! src.1p %in% src.2p, ]
}
return(out)
}
)

最佳答案

这里有几种方法。 #1 和 #4 假设 x.1 的行是独一无二的。 (如果 x.1 的行不是唯一的,那么它们将只返回重复行中的一个重复项。)其他的返回所有重复项:

# 1
x.1[!duplicated(rbind(x.2, x.1))[-(1:nrow(x.2))],]

# 2
do.call("rbind", setdiff(split(x.1, rownames(x.1)), split(x.2, rownames(x.2))))

# 3
x.1p <- do.call("paste", x.1)
x.2p <- do.call("paste", x.2)
x.1[! x.1p %in% x.2p, ]

# 4
library(sqldf)
sqldf("select * from `x.1` except select * from `x.2`")

编辑:x.1 和 x.2 被交换,这已得到修复。也更正了开始时关于限制的注释。

关于r - 识别数据框 A 中未包含在数据框 B 中的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7728462/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com