J'attribue des valeurs à une liste de fruits comme celle-ci dans R.
fruits value apple 1 pineapple NA orange 11 pear NA mango 5 kiwi 10 fruits2 = data.frame(fruits = c("apple", "pineapple", "orange", "pear", "mango", "kiwi"))
Lorsque la liste de fruits est mise à jour, disons en ajoutant mangue et kiwi, je veux tout mot inattendu possible / le texte du fruit à attribuer la valeur numérique de 1 sans avoir à ajouter ce mot spécifique au mappage.
L'exécution du code avec de nouveaux fruits le produit.
#input csv of fruits fruits apple pineapple orange pear fruits <- data.frame(fruits = c("apple", "pineapple", "orange", "pear")) mapping <- c("apple" = 1, "orange"= 10, "pear" = 5,"pineapple" = 11) fruits$value <- mapping[fruits[,1]] #output fruits value apple 1 pineapple 11 orange 10 pear 5
Je m'attendrais à ce que le NA soit avec la mangue et le kiwi, mais ce n'est pas le cas.
Comment attribuer la valeur 1 à de nouveaux fruits non inclus dans la cartographie d'origine?
Merci
4 Réponses :
À partir de votre vecteur de mappage, créez la trame de données de mappage, puis en utilisant merge
yourdf$value[is.na(yourdf$value)] = 1
À propos de remplir le NA
à 1
mapdf = data.frame(fruits = names(mapping), value = mapping, row.names = NULL) yourdf = merge(df,mapdf,by = 'fruits',all.x = T) yourdf fruits value 1 apple 1 2 kiwi NA 3 mango NA 4 orange 10 5 pear 5 6 pineapple 11
Tout d'abord, si fruits
est un facteur, convertissez-le en caractère
df$value[is.na(df$value)] <- 1 df # fruits value #1 apple 1 #2 pineapple 11 #3 orange 10 #4 pear 5 #5 mango 1 #6 kiwi 1
Alors vous faites
df$value <- mapping[df$fruits] df # fruits value #1 apple 1 #2 pineapple 11 #3 orange 10 #4 pear 5 #5 mango NA #6 kiwi NA
Cela donnera des NA
s pour les fruits
qui ne sont pas dans le mapping
. Maintenant, transformez les NA
en 1.
df$fruits <- as.character(df$fruits)
Comment attribuer la valeur 1 à de nouveaux fruits non inclus dans le mappage d'origine?
Si vous recherchez une seule colonne,
match
est une option:mymapping = c(mapping, default = 1) m = match(fruits2$fruits, names(mymapping), nomatch=length(mymapping)) fruits2$value = mymapping[m] fruits value 1 apple 1 2 pineapple 11 3 orange 10 4 pear 5 5 mango 1 6 kiwi 1
Voici une solution tidyverse:
library(tidyverse) fruits2 %>% left_join(enframe(mapping),by=c(fruits="name")) %>% replace_na(replace = list(value=1)) # fruits value # 1 apple 1 # 2 pineapple 11 # 3 orange 10 # 4 pear 5 # 5 mango 1 # 6 kiwi 1 # Warning message: # Column `fruits`/`name` joining factor and character vector, coercing into character vector