From gkerns at ysu.edu  Mon Dec 10 16:53:44 2007
From: gkerns at ysu.edu (G. Jay Kerns)
Date: Mon, 10 Dec 2007 10:53:44 -0500
Subject: [Rd] setdiff for data frames
Message-ID: <a695148b0712100753m3a6e14c8r33fd77d2ce2179bc@mail.gmail.com>

Hello,

I have been interested in setdiff() for data frames that operates
row-wise.  I looked in the documentation, mailing lists, etc., and
didn't find exactly the right thing.  Given data frames A, B with the
same columns, the goal is to extract the rows that are in A, but not
in B.  Of course, one can usually do setdiff(rownames(A), rownames(B))
but that is cheating.  :-)

I played around a little bit and came up with

setdiff.data.frame = function(A, B){
     g <-  function( y, B){
                 any( apply(B, 1, FUN = function(x)
identical(all.equal(x, y), TRUE) ) ) }
     unique( A[ !apply(A, 1, FUN = function(t) g(t, B) ), ] )
}

I am sure that somebody can do this a better/faster way... any ideas?
Any chance we could get a data.frame method for set.diff in future R
versions? (The notion of "set" is somewhat ambiguous with respect to
rows, columns, and entries in the data frame case.)


Jay


P.S. You can see what I'm looking for with

A <- expand.grid( 1:3, 1:3 )
B <- A[ 2:5, ]
setdiff.data.frame(A,B)





***************************************************
G. Jay Kerns, Ph.D.
Assistant Professor / Statistics Coordinator
Department of Mathematics & Statistics
Youngstown State University
Youngstown, OH 44555-0002 USA
Office: 1035 Cushwa Hall
Phone: (330) 941-3310 Office (voice mail)
-3302 Department
-3170 FAX
E-mail: gkerns at ysu.edu
http://www.cc.ysu.edu/~gjkerns/



[Rd] setdiff for data frames
G. Jay Kerns