Comparer deux données.les images pour trouver les lignes de données.l'image 1 qui ne sont pas présents dans les données.image 2
J'ai les 2 suivants de données.images:
a1 <- data.frame(a = 1:5, b=letters[1:5])
a2 <- data.frame(a = 1:3, b=letters[1:3])
Je veux trouver la ligne a1 a a2 n'est pas.
Est-il construit en fonction pour ce type d'opération?
(p.s: j'ai écrit une solution pour elle, je suis simplement curieux de savoir si quelqu'un a déjà fait une plus conçue code)
Voici ma solution:
a1 <- data.frame(a = 1:5, b=letters[1:5])
a2 <- data.frame(a = 1:3, b=letters[1:3])
rows.in.a1.that.are.not.in.a2 <- function(a1,a2)
{
a1.vec <- apply(a1, 1, paste, collapse = "")
a2.vec <- apply(a2, 1, paste, collapse = "")
a1.without.a2.rows <- a1[!a1.vec %in% a2.vec,]
return(a1.without.a2.rows)
}
rows.in.a1.that.are.not.in.a2(a1,a2)
Vous devez vous connecter pour publier un commentaire.
Cela ne veut pas répondre directement à votre question, mais il vous donnera les éléments qui sont en commun. Cela peut être fait avec Paul Murrell paquet
comparer
:La fonction
compare
vous donne beaucoup de flexibilité en termes de ce genre de comparaisons sont autorisés (par exemple, changer l'ordre des éléments de chaque vecteur, modification de l'ordre et les noms des variables, le raccourcissement des variables, changer la casse des chaînes de caractères). À partir de cela, vous devriez être en mesure de comprendre ce qui manque à l'un ou l'autre. Par exemple (ce n'est pas très élégant):a2 <- data.frame(a = c(1:3, 1), b = c(letters[1:3], "c"))
. Laissera1
le même. Maintenant, essayez de la comparaison. Il n'est pas clair pour moi, même en lisant les options de ce que la bonne manière est de lister les seuls éléments communs.SQLDF
offre une belle solutionEt les lignes qui sont dans les deux trames de données:
La nouvelle version de
dplyr
a une fonction,anti_join
, précisément pour ces sortes de comparaisonsEt
semi_join
pour filtrer les lignes dansa1
qui sont également dans laa2
anti_join
etsemi_join
!Dans dplyr:
Fondamentalement,
setdiff(bigFrame, smallFrame)
vous obtient les extra enregistrements de la première table.Dans le SQLverse ce qui est appelé un
Pour une bonne description de toutes les options de jointure et de l'ensemble des sujets, c'est l'un des meilleurs résumés que j'ai vu mettre ensemble pour date: http://www.vertabelo.com/blog/technical-articles/sql-joins
Mais pour en revenir à cette question - voici les résultats de la
setdiff()
code lors de l'utilisation de l'OP de données:Ou même
anti_join(a1,a2)
vous obtiendrez les mêmes résultats.Pour plus d'info: https://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf
a1
qui ne sont pas dansa2
, vous ne souhaitez pas utiliser quelque chose commesemi_join(a1, a2, by = c('a','b'))
? Dans la réponse "Rickard", je vois quesemi_join
a été suggéré.setdiff()
fonction qui fonctionne sur deux vecteurs: stat.ethz.ch/R-manual/R-devel/library/base/html/sets.html. Peut-être que vous avez chargé le lubridate de la bibliothèque après dplyr et il est il suggère comme la source dans le tabcomplete liste?Ce n'est certainement pas efficace pour cet usage particulier, mais ce que je fais souvent dans ces situations, c'est pour insérer des variables indicatrices dans chaque base de données.cadre et ensuite de fusion:
valeurs manquantes dans included_a1 permettra de noter les lignes sont manquantes dans a1. de même pour a2.
Un problème avec votre solution est que la colonne commandes doivent correspondre. Un autre problème est qu'il est facile d'imaginer des situations où les lignes sont codées de la même quand, en fait, sont différents. L'avantage de l'utilisation de la fusion est que vous obtenez pour gratuit tous de vérification d'erreur qui est nécessaire pour une bonne solution.
included_a1
? :-/J'ai écrit un paquet (https://github.com/alexsanjoseph/compareDF) depuis que j'ai eu le même problème.
Un exemple plus compliqué:
Le paquet a également un html_output commande rapide vérification
Vous pouvez utiliser le
daff
le paquet (qui encapsule ladaff.js
de la bibliothèque à l'aide de laV8
le paquet):produit de la différence suivante objet:
La diff format est décrit dans Coopy surligneur diff format pour les tables et devrait être assez explicite. Les lignes avec
+++
dans la première colonne@@
sont ceux qui sont nouveaux dansa1
et ne sont pas présents dansa2
.La différence de l'objet peut être utilisé pour
patch_data()
, pour stocker la différence des fins de documentation à l'aide dewrite_diff()
ou à visualiser la différence à l'aide derender_diff()
:génère un pur HTML de sortie:
À l'aide de
diffobj
package:J'ai adapté le
merge
fonction pour obtenir cette fonctionnalité. Sur les plus grandes dataframes il utilise moins de mémoire que la fusion de la solution. Et je peux jouer avec les noms des colonnes de clé.Une autre solution est d'utiliser la bibliothèque
prob
.Votre exemple de données n'a pas de doublons, mais votre solution de les traiter automatiquement. Cela signifie que, potentiellement, certaines réponses ne correspond pas aux résultats de votre fonction en cas de doublon.
Voici ma solution qui adresse les doublons de la même façon que le vôtre. Il s'adapte!
Elle a besoin de données.tableau 1.9.8+
C'est peut-être trop simpliste, mais j'ai utilisé cette solution, et je trouve cela très utile quand j'ai une clé primaire que je peux utiliser pour comparer des ensembles de données. J'espère que ça peut aider.
Encore une autre solution basée sur match_df dans plyr.
Voici plyr de match_df:
Nous pouvons la modifier à nier:
Alors:
À l'aide de
subset
: