sql >> Databáze >  >> RDS >> Mysql

Jak standardizovat více hodnot sloupce?

Vaše otázka je opravdu nepřesný. Postupujte prosím podle návrhů @RiggsFolly a přečtěte si odkazy na to, jak položit dobrou otázku.

Také, jak navrhuje @DuduMarkovitz, měli byste začít zjednodušením problému a vyčištěním dat. Několik zdrojů pro začátek:

Jakmile budete s výsledky spokojeni, můžete přistoupit k identifikaci skupiny pro každý Var1 vstup (to vám pomůže na cestě provádět další analýzy/manipulace s podobnými záznamy) To by se dalo udělat mnoha různými způsoby, ale jak uvádí @GordonLinoff, jedním z nich je Levenshtein Distance.

Poznámka :u 50 000 záznamů nebude výsledek 100% přesný, protože nebude vždy kategorizovat termíny do příslušné skupiny, ale to by mělo výrazně snížit manuální úsilí.

V R to můžete udělat pomocí adist()

Pomocí vašich příkladů dat:

d <- adist(df$Var1)
# add rownames (this will prove useful later on)
rownames(d) <- df$Var1

> d
#                  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#125 Hollywood St.    0    1    1   16   15   16   15   15   15    15
#125 Hllywood St.     1    0    2   15   14   15   15   14   14    14
#125 Hollywood St     1    2    0   15   15   15   14   14   15    15
#Target Store        16   15   15    0    2    1    2   10   10     9
#Trget Stre          15   14   15    2    0    3    4    9   10     8
#Target. Store       16   15   15    1    3    0    3   11   11    10
#T argetStore        15   15   14    2    4    3    0   10   11     9
#Walmart             15   14   14   10    9   11   10    0    5     2
#Walmart Inc.        15   14   15   10   10   11   11    5    0     6
#Wal marte           15   14   15    9    8   10    9    2    6     0

U tohoto malého vzorku můžete vidět 3 odlišné skupiny (shluky nízkých hodnot Leventheinovy ​​vzdálenosti) a můžete je snadno přiřadit ručně, ale pro větší sady budete pravděpodobně potřebovat shlukovací algoritmus.

Již jsem vás v komentářích upozornil na jeden z mých předchozí odpověď ukazuje, jak to udělat pomocí hclust() a Wardova metoda minimálního rozptylu, ale myslím, že zde by bylo lepší použít jiné techniky (jeden z mých oblíbených zdrojů na toto téma pro rychlý přehled některých nejpoužívanějších metod v R je tento podrobná odpověď )

Zde je příklad použití shlukování šíření afinity:

library(apcluster)
d_ap <- apcluster(negDistMat(r = 1), d)

V objektu APResult najdete d_ap prvky spojené s každým shlukem a optimální počet shluků, v tomto případě:3.

> [email protected]
#[[1]]
#125 Hollywood St.  125 Hllywood St.  125 Hollywood St 
#                1                 2                 3 
#
#[[2]]
# Target Store    Trget Stre Target. Store  T argetStore 
#            4             5             6             7 
#
#[[3]]
#     Walmart Walmart Inc.    Wal marte 
#           8            9           10 

Můžete také vidět vizuální znázornění:

> heatmap(d_ap, margins = c(10, 10))

Poté můžete pro každou skupinu provádět další manipulace. Jako příklad zde používám hunspell k vyhledání jednotlivých slov z Var1 v en_US slovníku pro pravopisné chyby a pokuste se najít v každé group , které id neobsahuje žádné pravopisné chyby (potential_id )

library(dplyr)
library(tidyr)
library(hunspell)

tibble(Var1 = sapply([email protected], names)) %>%
  unnest(.id = "group") %>%
  group_by(group) %>%
  mutate(id = row_number()) %>%
  separate_rows(Var1) %>%
  mutate(check = hunspell_check(Var1)) %>%
  group_by(id, add = TRUE) %>%
  summarise(checked_vars = toString(Var1), 
            result_per_word = toString(check), 
            potential_id = all(check))

Což dává:

#Source: local data frame [10 x 5]
#Groups: group [?]
#
#   group    id        checked_vars   result_per_word potential_id
#   <int> <int>               <chr>             <chr>        <lgl>
#1      1     1 125, Hollywood, St.  TRUE, TRUE, TRUE         TRUE
#2      1     2  125, Hllywood, St. TRUE, FALSE, TRUE        FALSE
#3      1     3  125, Hollywood, St  TRUE, TRUE, TRUE         TRUE
#4      2     1       Target, Store        TRUE, TRUE         TRUE
#5      2     2         Trget, Stre      FALSE, FALSE        FALSE
#6      2     3      Target., Store        TRUE, TRUE         TRUE
#7      2     4       T, argetStore       TRUE, FALSE        FALSE
#8      3     1             Walmart             FALSE        FALSE
#9      3     2       Walmart, Inc.       FALSE, TRUE        FALSE
#10     3     3          Wal, marte      FALSE, FALSE        FALSE

Poznámka :Protože jsme neprovedli žádné zpracování textu, výsledky nejsou příliš průkazné, ale máte představu.

Data

df <- tibble::tribble(
  ~Var1,                   
  "125 Hollywood St.",      
  "125 Hllywood St.",       
  "125 Hollywood St",       
  "Target Store",           
  "Trget Stre",             
  "Target. Store",          
  "T argetStore",           
  "Walmart",                
  "Walmart Inc.",           
  "Wal marte" 
)


  1. Jak získat data z Json do více sloupců PostgreSQL

  2. SELECT DISTINCT je na mém stole v PostgreSQL pomalejší, než se očekávalo

  3. Složený klíč ve srovnání

  4. Jaký komunikační protokol používá MySQL?