2
votes

Comment attribuer une valeur numérique au nouveau mot dans la colonne de R

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


0 commentaires

4 Réponses :


1
votes

À 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


0 commentaires

1
votes

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)


0 commentaires

1
votes

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

0 commentaires

1
votes

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


0 commentaires