2013-06-05 6 views
2

Supposons que j'ai deux trames de données (DF1 & DF2) et que les deux contiennent les coordonnées (x, y). Je voudrais extraire la paire de (x, y) qui est dans DF1 mais pas DF2. Exemple:soustraction de deux trames de données

DF1<-data.frame(x=1:3,y=4:6,t=10:12) 
DF2<-data.frame(x=3:5,y=6:8,s=1:3) 

Je veux

DF_new<-data.frame(x=1:2,y=4:5,t=10:11). 

Que dois-je faire pour les ensembles de données beaucoup plus importants? Merci!

+1

Pour être clair, vous voulez trouver la paire (x, y) qui se trouve dans les deux structures de données, mais dont les valeurs t ne correspondent pas? – alexwhan

+0

OH! J'ai fait des erreurs sur la sortie attendue !! Je suis vraiment désolé pour ça. J'ai mis à jour la question. Je veux trouver le (x, y, t) dans lequel (x, y) est dans DF1 mais pas DF2 – Cathy

+0

OH, je suppose @agstudy répond à ma question. Merci de votre aide!! – Cathy

Répondre

3

Pour de très grandes quantités de données que vous pouvez être intéressé par data.table:

library(data.table) 
DF1<-data.frame(x=1:3,y=4:6,t=10:12) 
DF2<-data.frame(x=3:5,y=6:8,s=1:3) 
library(data.table) 
DF1 <- data.table(DF1, key = c("x", "y")) 
DF2 <- data.table(DF2, key = c("x", "y")) 
DF1[complete.cases(DF1[DF2])] # maybe you want this? 
DF2[DF1] 
DF1[!DF2] # or maybe you want this? 
DF2[!DF1] 
+0

Merci! Ça marche! Cela signifie-t-il que je dois définir la "clé" si je veux comparer plus d'une valeur de colonne (coz% en% fonctionnera si je ne compare qu'une seule variable au lieu d'une paire de variables)? – Cathy

+0

Réponse courte: oui. Réponse longue: 1) c'est beaucoup plus rapide (si le temps est un problème) 2) à moins que vous ne trouviez un moyen plus "élégant" de le faire avec% in% 3) cela vous permet d'effectuer toutes sortes de merveilleuses opérations sur vos données Définir comme décrit dans [l'introduction au fichier data.table] (http://datatable.r-forge.r-project.org/datatable-intro.pdf) et les exemples qui l'accompagnent. –

4

On dirait que l'utilisation merge est un bon candidat ici:

merge(DF1,DF2) 
    x y t s 
1 3 6 12 1 
+0

J'ai fait des erreurs en postant la question, merci! – Cathy

1
library(tidyverse) 
DF1<-data.frame(x=1:3,y=4:6,t=10:12) 
DF2<-data.frame(x=3:5,y=6:8,s=1:3) 

anti_join(DF1, DF2) 
#> Joining, by = c("x", "y") 
#> x y t 
#> 1 1 4 10 
#> 2 2 5 11 
Questions connexes