Пишу сюда впервые, так что будьте любезны ;-)
ИЗМЕНИТЬ Мой вопрос был закрыт до того, как у меня появилась возможность внести предложенные мне изменения. Так что теперь я стараюсь работать лучше, спасибо всем, кто ответил до сих пор!
ВОПРОС
Как определить записи/строки во фрейме данных 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
ЛУЧШЕЕ РЕШЕНИЕ
Проф. Брайан Рипли и Габор Гротендик
> 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
Собрание всех протестированных на данный момент решений доступно по адресу блог
ПОСЛЕДНЯЯ РЕДАКЦИЯ 14.10.2011
Вот лучшее решение, заключенное в функцию «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)
}
)
x.1
иx.2
) и четко указал, в чем заключалась исходная проблема... - person Rappster   schedule 11.10.2011library(dplyr); anti_join(x.1, x.2)
. (Я только что понял, что вопросу 3 года :-)) - person talat   schedule 25.11.2014data.table
также имеет антисоединение:x.1[!x.2, on = names(x.1)]
или полный рабочий пример:library(data.table); setDT(x.1)[!setDT(x.2), on = names(x.1)]
. - person Uwe   schedule 07.08.2017