2016-07-28 1 views
0

J'ai deux objets data.frame qui ont besoin d'un complément relatif de l'un à l'autre. J'ai vérifié un post similaire à partir de ce site, certainement quelqu'un a déjà demandé, mais il s'agissait de vecteur, et ça va. Cependant, j'ai essayé la solution à partir d'un post existant sur ce site, mais je n'ai pas obtenu ma sortie attendue. J'ai essayé plusieurs approches comme setdiff, pmatch versa versa, aucun d'entre eux ne retourne mon résultat attendu. Quelqu'un peut-il proposer un moyen possible d'accomplir cette tâche efficacement?Comment obtenir le complément relatif d'un data.frame dans un autre?

exemple

foo <- data.frame(start=seq(1, by=4, len=6), stop=seq(3, by=4, len=6)) 
bleh <- data.frame(start=seq(1, by=5, len=5), stop=seq(3, by=5, len=5)) 

sortie désirée:

Selon compléter la théorie des ensembles en wiki, mon résultat attendu comme suit:

start stop 
1  5 7 
2  9 11 
3 13 15 
4 17 19 

Comment puis-je obtenir ensemble du complément pertinent une donnée .frame à un autre? Quelle est la bonne façon d'accomplir cette tâche? Merci

Répondre

2

Essayez cette

library(dplyr) 
output <- anti_join(foo,bleh) 
output[order(output$start),] 

Une autre option à l'aide setdiff du package dplyr (@Frank Merci pour la correction)

setdiff(foo,bleh) 
# start stop 
#1  5 7 
#2  9 11 
#3 13 15 
#4 17 19 
+0

est-ce possible d'améliorer un peu plus? Je veux dire les commander (à la fois la ligne et son index en conséquence) de manière agréable. Thx – datageek

+0

J'ai aussi essayé comme ceci: base :: setdiff (foo, bleh), mais il ne correspondait pas à ma sortie attendue. Avez-vous obtenu ma sortie si vous avez utilisé setdiff? C'est étrange, pourquoi j'ai une sortie différente alors? – datageek

+1

Non, cette fonction de setdiff vient aussi de dplyr, et c'est une meilleure façon d'aller qu'anti_join, à mon avis, puisqu'elle traite chaque table comme un ensemble (ignore les lignes dupe). – Frank