L'appariement de deux Colonnes dans la R
J'ai un gros dataset df
(354903 lignes) avec deux colonnes nommées df$ColumnName
et df$ColumnName.1
head(df)
CompleteName CompleteName.1
1 Lefebvre Arnaud Lefebvre Schuhl Anne
1.1 Lefebvre Arnaud Abe Lyu
1.2 Lefebvre Arnaud Abe Lyu
1.3 Lefebvre Arnaud Louvet Nicolas
1.4 Lefebvre Arnaud Muller Jean Michel
1.5 Lefebvre Arnaud De Dinechin Florent
Je suis en train de créer des étiquettes pour voir le temps le nom est le même ou pas.
Lorsque je tente un petit sous-ensemble il fonctionne [1 si elles sont les mêmes, 0 si non]:
> match(df$CompleteName[1], df$CompleteName.1[1], nomatch = 0)
[1] 0
> match(df$CompleteName[1:10], df$CompleteName.1[1:10], nomatch = 0)
[1] 0 0 0 0 0 0 0 0 0 0
Mais dès que je lance la remplir les colonnes, il me donne complète des valeurs différentes, qui semblent non-sens pour moi:
> match(df$CompleteName, df$CompleteName.1, nomatch = 0)
[1] 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101
[23] 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101
[45] 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101
Dois-je utiliser sapply
? Je n'ai pas compris, j'ai essayé cela avec une erreur:
sapply(df, function(x) match(x$CompleteName, x$CompleteName.1, nomatch = 0))
S'il vous plaît aider!!!
- vous ne voulez probablement pas de match - il donne la correspondance des valeurs de la deuxième colonne, pas de savoir s'ils sont égaux. Si vous avez des chaînes, vous pourriez probable suffit d'utiliser
as.numeric(df$CompleteName == df$CompleteName.1)
- aussi, l'utilisation
stringsAsFactors = FALSE
dans la construction de vos données.cadre - comme d'autres l'ont souligné,
match
ne marchera pas ici. mon commentaire était destiné à ajouter à @jeremycg 's - Il n'existe aucune preuve de ces être facteur de colonnes, de toute façon, est-il?
- Non, il ne fonctionne pas si il y a d'autres niveaux. Voir ma réponse et essayer de l'exécuter sans stringsAsFactors = FALSE
> default.stringsAsFactors() [1] TRUE
- Ce n'est pas ce que je voulais dire. Je veux dire que nous n'avons aucune idée si cette OP a facteur de colonnes ou pas. Il n'y a aucune preuve dans la question qui nous dit qu'ils sont le facteur ou le caractère. Ce n'est pas une grosse affaire si. C'est une des raisons pourquoi
dput()
est préféré lors de la publication des données en question. - Oui! Saul pour les questions d'avenir, essayez de suivre ces lignes directrices, qui rendent plus facile de répondre à stackoverflow.com/a/5963610/4598520 Vous pouvez également modifier votre question pour être reproductibles
Vous devez vous connecter pour publier un commentaire.
À partir de la page de man de match,
Vos données semblent indiquer que le premier match de "Lefebvre Arnaud" (la première position dans le premier argument) est dans la ligne 101. Je crois que ce que vous avez l'intention de faire une simple comparaison, de sorte que c'est juste de l'opérateur d'égalité
==
.Quelques exemples de données:
EDIT: Aussi, vous devez vous assurer que vous comparez des pommes avec des pommes, alors vérifiez le type de données de vos colonnes. Utilisation
str(df)
pour voir si les colonnes sont des chaînes de caractères ou des facteurs. Vous pouvez construire la matrice avec "stringsAsFactors = FALSE", ou de convertir à partir du facteur de caractère. Il ya plusieurs façons de le faire, cochez ici: Convertir des données.cadre des colonnes à partir des facteurs de caractèresComme d'autres l'ont souligné,
match
n'est pas juste ici. Ce que vous voulez, c'est l'égalité, à laquelle vous pouvez accéder par un test à==
, qui vous donneTRUE/FALSE
. Ensuite, à l'aide deas.numeric
vous donnera souhaité1/0
ou à l'aide dewhich
vous donnera des indices.Mais vous pouvez toujours avoir un problème avec les facteurs de!
stringsAsFactors
Ci-dessus, les données.cadre n'était pas construit avec
stringsAsFactors=FALSE
et a provoqué une erreur. Malheureusement, la sortie de la boîteR
va contraindre les chaînes de facteurs sur le chargement d'unecsv
ou la création d'undata.frame
. Cela peut être corrigé lors de la création des données.cadre en spécifiant explicitementstringsAsFactors=FALSE
Pour éviter le problème à l'avenir, exécutez
options(stringsAsFactors = FALSE)
au début de votre session R (ou le mettre en haut de votre.R
script). Plus la discussion ici:Voici une solution à l'aide d'un
data.table
avec comparaison des performances de ladata.frame
solution basée sur un nombre identique de dossiers comme dans votre cas.La
data.table
approche offre une accélération significative sur ma machine: à partir de 0.020 s à 0,008 s.L'essayer pour vous-même et voir. Je sais que ce n'est pas vraiment significatif avec un si petit nombre de lignes, mais multiplier par 1000, et vous verrez une grande différence!
data.table
au lieu dedata.frame
est en fait moins de frappe et prend avantage d'être beaucoup plus efficace mécanisme de stockage. Je suis heureux que j'ai eu dans la pratique de l'utilisation de ce package à un stade précoce, il m'a sauvé beaucoup de temps et je voudrais encourager les nouveaux R les utilisateurs à faire de même afin que, lorsque le vraiment besoin qu'ils ont les outils en place.data.table
de la syntaxe.col3:=
est absolument vide de sens pour quelqu'un qui ne comprend pasdata.table
de la syntaxe. C'est un très élégant de la ligne, et de loin plus efficace que pure "R" de code, mais de l'utiliser ou pas est un choix tout de même.data.table
méthode. Il sera certainement m'aider, si je peux réduire le temps de fonctionnement, normalement j'avais en face de 2 millions de lignes de dataset, et c'était une combinaison d'un sous-ensemble de 800 enregistrements. Merci pour le comprendre!!!