2
votes

R: Remplacement des chaînes par leur variante la plus courante

Je cherche à standardiser un ensemble de chaînes saisies manuellement, de sorte que:

library(tidyverse)  
library(stringdist)

index <- seq(1,5,1)
fruit <- c("Apple Pie", "Apple Pie.", "Apple. Pie", "Apple Pie", "Pear")

df <- data.frame(index, fruit) %>%
  mutate(grouping = phonetic(fruit)) %>%
  add_count(fruit) %>%
  # Missing Code
  select(index, fruit)

ressemble à:

index   fruit
1   Apple Pie
2   Apple Pie
3   Apple Pie
4   Apple Pie
5   Pear

Pour mon cas d'utilisation, les regrouper par son phonétique , c'est bien, mais je manque le morceau sur la façon de remplacer le moins commun chaînes avec les plus courantes.

index   fruit
1   Apple Pie
2   Apple Pie.
3   Apple. Pie
4   Apple Pie
5   Pear


0 commentaires

3 Réponses :


2
votes

Nous pouvons utiliser str_remove pour supprimer le .

Mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}


data.frame(index, fruit) %>%
   mutate(grouping = phonetic(fruit)) %>%
   group_by(grouping) %>% 
   mutate(fruit = Mode(fruit))
# A tibble: 5 x 3
# Groups:   grouping [2]
#  index fruit     grouping
#  <dbl> <fct>     <chr>   
#1     1 Apple Pie A141    
#2     2 Apple Pie A141    
#3     3 Apple Pie A141    
#4     4 Apple Pie A141    
#5     5 Pear      P600    

Si nous devons utiliser phonétique code> et trouvez la valeur la plus fréquente

library(dplyr)
library(stringr)
data.frame(index, fruit) %>% 
    mutate(fruit = str_remove(fruit, "\\."))
# index     fruit
#1     1 Apple Pie
#2     2 Apple Pie
#3     3 Apple Pie
#4     4 Apple Pie
#5     5      Pear


2 commentaires

Y a-t-il un avantage de flexibilité à créer la fonction Mode ?


@rsylatian Il peut être réutilisé comme un bloc dans d'autres fonctions.



2
votes

On dirait que vous avez besoin du groupement group_by , puis sélectionnez l'élément (Mode) le plus fréquent

df%>%mutate(grouping = phonetic(fruit))%>%
     group_by(grouping)%>%
     mutate(fruit = names(which.max(table(fruit))))

# A tibble: 5 x 3
# Groups:   grouping [2]
  index     fruit grouping
  <dbl>    <fctr>    <chr>
1     1 Apple Pie     A141
2     2 Apple Pie     A141
3     3 Apple Pie     A141
4     4 Apple Pie     A141
5     5      Pear     P600


0 commentaires

1
votes

Une autre façon pourrait être:

fruit %>%
 enframe() %>%
 mutate(grouping = phonetic(fruit)) %>%
 add_count(value, grouping) %>%
 group_by(grouping) %>%
 mutate(value = value[match(max(n), n)]) %>%
 select(-n) %>%
 ungroup()

   name value     grouping
  <int> <chr>     <chr>   
1     1 Apple Pie A141    
2     2 Apple Pie A141    
3     3 Apple Pie A141    
4     4 Apple Pie A141    
5     5 Pear      P600 


0 commentaires