R sélectionnant toutes les lignes d'un bloc de données qui n'apparaissent pas dans un autre
J'essaie de résoudre un épineux R problème que je n'ai pas été en mesure de résoudre par Googler mots-clés. Plus précisément, je suis en train de prendre un sous-ensemble d'un bloc de données dont les valeurs n'apparaissent pas dans l'autre. Voici un exemple:
> test
number fruit ID1 ID2
item1 "number1" "apples" "22" "33"
item2 "number2" "oranges" "13" "33"
item3 "number3" "peaches" "44" "25"
item4 "number4" "apples" "12" "13"
> test2
number fruit ID1 ID2
item1 "number1" "papayas" "22" "33"
item2 "number2" "oranges" "13" "33"
item3 "number3" "peaches" "441" "25"
item4 "number4" "apples" "123" "13"
item5 "number3" "peaches" "44" "25"
item6 "number4" "apples" "12" "13"
item7 "number1" "apples" "22" "33"
J'ai deux trames de données, test et test2, et le but est de sélectionner toutes les lignes entières dans test2 qui n'apparaissent pas dans le test, même si certaines de ces valeurs peuvent être les mêmes.
La sortie je veux ressemblerait à:
item1 "number1" "papayas" "22" "33"
item2 "number3" "peaches" "441" "25"
item3 "number4" "apples" "123" "13"
Il peut y avoir une quantité arbitraire de lignes ou de colonnes, mais dans mon cas précis, une trame de données est directement sous-ensemble de l'autre.
J'ai utilisé le sous-ensemble de R(), merge () () les fonctions de profondeur, mais ne pouvait pas comprendre comment les utiliser en combinaison, si elle est possible, pour obtenir ce que je veux.
edit: Voici le R code que j'ai utilisé pour générer ces deux tables.
test <- data.frame(c("number1", "apples", 22, 33), c("number2", "oranges", 13, 33),
c("number3", "peaches", 44, 25), c("number4", "apples", 12, 13))
test <- t(test)
rownames(test) = c("item1", "item2", "item3", "item4")
colnames(test) = c("number", "fruit", "ID1", "ID2")
test2 <- data.frame(data.frame(c("number1", "papayas", 22, 33), c("number2", "oranges", 13, 33),
c("number3", "peaches", 441, 25), c("number4", "apples", 123, 13),c("number3", "peaches", 44, 25), c("number4", "apples", 12, 13) ))
test2 <- t(test2)
rownames(test2) = c("item1", "item2", "item3", "item4", "item5", "item6")
colnames(test2) = c("number", "fruit", "ID1", "ID2")
Merci d'avance!
source d'informationauteur so13eit
Vous devez vous connecter pour publier un commentaire.
Voici une autre façon:
Edit: modifié afin de conserver les noms de ligne.
Il y a deux méthodes pour résoudre ce problème, en utilisant des données.table et sqldf
de données.approche de table, cela vous permet de sélectionner les colonnes que vous souhaitez comparer
Sql approche
Ce qui suit devrait vous permettre d'y parvenir:
Ce qui se passe ici est:
mapply
est utilisé pour faire les colonnes de la comparaison entre les deux ensembles de données.setdiff
de trouver n'importe quel élément qui sont dans le premier mais pas le dernierwhich
qui identifie la ligne de l'ancien n'est pas présent.unique(unlist(....))
attrape toutes les lignes uniquesPuis nous de l'utiliser comme un filtre à l'ancienne, c'est à dire
test2
Résultats:
edit:
Assurez-vous que votre
test
&test2
sontdata.frames
et pasmatrices
depuismapply
itère sur chaque élément d'une matrice, mais sur chaque colonne d'undata.frame
Faire une nouvelle ligne-colonne ID dans test2, fusionner les trames de données, et sélectionnez les lignes dont les Id ne sont pas dans le résultat fusionné.
Voici une autre approche, mais je ne suis pas sûr de la façon dont elle sera mise à l'échelle.
Ce serait pas supprimer tous les doublons. Comparer, par exemple, si
test2
avait des doublons: