Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak ujednolicić wiele wartości kolumny?

Twoje pytanie jest naprawdę nieprecyzyjny. Proszę, postępuj zgodnie z sugestiami @RiggsFolly i przeczytaj odniesienia, jak zadać dobre pytanie.

Ponadto, zgodnie z sugestią @DuduMarkovitz, powinieneś zacząć od uproszczenia problemu i oczyszczenia danych. Kilka zasobów na początek:

Gdy będziesz zadowolony z wyników, możesz przystąpić do identyfikacji grupy dla każdej Var1 wpis (pomoże ci to w dalszej analizie/manipulacji podobnymi wpisami) Można to zrobić na wiele różnych sposobów, ale jak wspomniał @GordonLinoff, jednym z nich jest odległość Levenshteina.

Uwaga :w przypadku 50 000 wpisów wynik nie będzie w 100% dokładny, ponieważ nie będzie zawsze kategoryzować terminy w odpowiedniej grupie, ale powinno to znacznie zmniejszyć ręczne wysiłki.

W R możesz to zrobić używając adist()

Korzystając z przykładowych danych:

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

W przypadku tej małej próbki można zobaczyć 3 odrębne grupy (klastry o niskich wartościach odległości Levenstheina) i można je łatwo przypisać ręcznie, ale w przypadku większych zestawów prawdopodobnie będziesz potrzebować algorytmu grupowania.

Wskazałem Ci już w komentarzach do jednego z moich poprzednia odpowiedź pokazuje, jak to zrobić za pomocą hclust() i metoda minimalnej wariancji Warda, ale myślę, że w tym przypadku lepiej byłoby użyć innych technik (jednym z moich ulubionych źródeł na ten temat zawierającym szybki przegląd niektórych z najczęściej używanych metod w R jest to szczegółowa odpowiedź )

Oto przykład użycia klastrowania propagacji powinowactwa:

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

Znajdziesz w obiekcie APResult d_ap elementy związane z poszczególnymi klastrami i optymalna liczba klastrów, w tym przypadku: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 

Możesz także zobaczyć reprezentację wizualną:

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

Następnie możesz wykonać dalsze manipulacje dla każdej grupy. Jako przykład tutaj używam hunspell aby wyszukać każde oddzielne słowo z Var1 w słowniku en_US dla błędów ortograficznych i spróbuj znaleźć w każdej group , który id nie zawiera błędów ortograficznych (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 daje:

#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

Uwaga :Tutaj, ponieważ nie wykonaliśmy żadnego przetwarzania tekstu, wyniki nie są zbyt jednoznaczne, ale masz pomysł.

Dane

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wstawić wartość NULL ze zmiennej PHP do MySQL, unikając wstrzykiwania SQL?

  2. Synchronizacja SQL Server z programem MySQL

  3. jak sprawić, by minutnik nie resetował się podczas odświeżania strony

  4. Laravel Eloquent podwójna wartość przechowywana w bazie danych zwrócona w zaokrągleniu

  5. Jak tworzyć indeksy na wielu kolumnach