Remplacer des valeurs dans un dataframe basé sur la table de recherche
Je vais avoir quelques difficultés à remplacer les valeurs dans un dataframe. Je voudrais remplacer les valeurs basée sur une table séparée. Ci-dessous est un exemple de ce que je suis en train de faire.
J'ai un tableau où chaque ligne est un client et de chaque colonne est un animal qu'ils ont acheté. Appelons cette dataframe table
.
> table
# P1 P2 P3
# 1 cat lizard parrot
# 2 lizard parrot cat
# 3 parrot cat lizard
J'ai aussi un tableau que je vais de référence appelé lookUp
.
> lookUp
# pet class
# 1 cat mammal
# 2 lizard reptile
# 3 parrot bird
Ce que je veux faire est de créer une nouvelle table appelée new
avec une fonction remplace toutes les valeurs dans table
avec le class
colonne dans lookUp
. J'ai essayé moi-même à l'aide d'un lapply
fonction, mais j'ai eu des avertissements.
new <- as.data.frame(lapply(table, function(x) {
gsub('.*', lookUp[match(x, lookUp$pet) ,2], x)}), stringsAsFactors = FALSE)
Warning messages:
1: In gsub(".*", lookUp[match(x, lookUp$pet), 2], x) :
argument 'replacement' has length > 1 and only the first element will be used
2: In gsub(".*", lookUp[match(x, lookUp$pet), 2], x) :
argument 'replacement' has length > 1 and only the first element will be used
3: In gsub(".*", lookUp[match(x, lookUp$pet), 2], x) :
argument 'replacement' has length > 1 and only the first element will be used
Toutes les idées sur la façon de faire ce travail?
OriginalL'auteur jbunk | 2016-02-25
Vous devez vous connecter pour publier un commentaire.
Vous avez posté une approche dans votre question, qui n'était pas mauvais. Voici une approche similaire:
Une approche alternative qui sera plus rapide est:
Noter que j'utilise des parenthèses vides (
[]
) dans les deux cas, pour conserver la structure denew
que c'était (un ensemble de données.image).(Je suis en utilisant
df
au lieu detable
etlook
au lieu delookup
dans ma réponse)OriginalL'auteur docendo discimus
L'autre des options est une combinaison de
tidyr
etdplyr
OriginalL'auteur Thierry
À tout moment vous avez deux
data.frame
s et essayer d'apporter des informations à partir de l'une à l'autre, la réponse est à de fusion.Tout le monde a son propre favori méthode de fusion dans R. le Mien est
data.table
.Aussi, puisque vous voulez faire cela pour de nombreuses colonnes, il sera plus rapide à
melt
etdcast
-- plutôt que de la boucle sur les colonnes, appliquer qu'une seule fois pour le remodelage du tableau, puis de les remodeler à nouveau.Dans le cas où vous trouver la
dcast
/melt
peu un peu intimidant, voici une approche juste passe en boucle sur les colonnes;dcast
/melt
est tout simplement esquiver la boucle de ce problème.OriginalL'auteur MichaelChirico
Faire un nommé vecteur, et une boucle dans chaque colonne et match, voir:
de données
OriginalL'auteur zx8754
La réponse ci-dessus montrant comment le faire dans dplyr ne répond pas à la question, le tableau est rempli avec NAs. Cela a fonctionné, j'apprécie les observations montrant une meilleure façon:
Noter qu'il serait probablement utile de garder la longue table qui contient le client, l'animal, l'animal de l'espèce(?) et leur classe. Cet exemple ajoute simplement un intermédiaire enregistrer dans une variable:
OriginalL'auteur dannit