簡體   English   中英

在 R 中將分組對組合成一個組

[英]Combining grouped pairs into a single group in R

我在 R 中執行大型模糊匹配任務,將相似的商店名稱相互匹配。 在某些情況下,有多個記錄鏈接到一個商店,這導致了 A = B、B = C 和 A = C 的配對。 我想將這些組合成一個組 id 代碼,以便它們都可以組合在一起。 見下表:

PairID   Store name
1        Quick Stop
2        TD's Food Shop
2        TD's Food Shops
3        TD's Food Shops
3        TD's Food Shop 1
4        TD's Food Shop
4        TD's Food Shop 1

使用 R/tidyverse,我想不出將本例中 2、3 和 4 的 PairID 組合成一個組的方法。 其他人有沒有找到辦法做到這一點?

###編輯

看起來 R 中的 refinr package 很容易做到這一點( https://github.com/ChrisMuir/refinr )。 這是 OpenRefine 的自動化實現,我需要超過 100,000 條記錄——無法手動匹配。 代碼看起來像這樣:

value           match
QuikStop        QuikStop
TJ's Foods      TJ's Food
TJs Foods       TJ's Food
TJ's Food       TJ's Food

結果看起來像這樣

value match QuikStop QuikStop TJ's Foods TJ's Food TJs Foods TJ's Food TJ's Food TJ's Food

可以使用 stringdist 中的參數調整匹配的權重。 感謝評論者的建議!

如果您想要或需要通過類似的商店名稱將行分組在一起,而無需外部指定有多少真實商店或它們的正式名稱是什么,這實際上可能成為一個極其困難的問題。 這是因為在任何給定的字符串距離閾值或最小化時,您將不可避免地得到模糊重疊的集群,以及違反傳遞性。 A會最接近B,B會最接近C,C不會最接近A,然后呢? A 和 B 不能是同一家商店,而 C 與 B 是同一家商店但不是 A!

假設您對指定規范商店名稱的向量感到滿意,那么我推薦以下方法,它只會在每行中找到最接近名稱的規范商店名稱,並為那些最接近的規范名稱創建一個新列。 然后,您可以按該新列的值進行分組,並將商店 ID 折疊為逗號分隔的向量或其他任何內容。

library(future)
library(stringdist)
library(tidyverse)
library(magrittr)
#> 
#> Attaching package: 'magrittr'
#> The following object is masked from 'package:purrr':
#> 
#>     set_names
#> The following object is masked from 'package:tidyr':
#> 
#>     extract

data <- tribble(
  ~PairID, ~`Store name`,
  1,       "Quick Stop",
  2,       "TD's Food Shop",
  2,       "TD's Food Shops",
  3,       "TD's Food Shops",
  3,       "TD's Food Shop 1",
  4,       "TD's Food Shop",
  4,       "TD's Food Shop 1"
)

standard_names <- c("Quick Stop", "TD's Food Shop")

plan(multiprocess)

data %<>% mutate(
  closest_name = 
    stringdistmatrix(`Store name`, standard_names, method = "jw") %>% 
    apply(1, function(x) which(x == min(x))) %>% 
    extract(standard_names, .)
)

data
#> # A tibble: 7 x 3
#>   PairID `Store name`     closest_name  
#>    <dbl> <chr>            <chr>         
#> 1      1 Quick Stop       Quick Stop    
#> 2      2 TD's Food Shop   TD's Food Shop
#> 3      2 TD's Food Shops  TD's Food Shop
#> 4      3 TD's Food Shops  TD's Food Shop
#> 5      3 TD's Food Shop 1 TD's Food Shop
#> 6      4 TD's Food Shop   TD's Food Shop
#> 7      4 TD's Food Shop 1 TD's Food Shop

combined_pairIDs <- 
  data %>% 
  group_by(closest_name) %>% 
  summarize_at("PairID", ~ toString(order(unique(.x)))) %>% 
  ungroup()

combined_pairIDs
#> # A tibble: 2 x 2
#>   closest_name   PairID 
#>   <chr>          <chr>  
#> 1 Quick Stop     1      
#> 2 TD's Food Shop 1, 2, 3

代表 package (v0.3.0) 於 2019 年 10 月 19 日創建

請注意,這里可能會出現錯誤,這是我故意留下的。如果其中一行的名稱與兩個或多個規范名稱同樣接近怎么辦? 它將嘗試從standard_names中提取多個值,這是不允許的。 如果確實發生了這種聯系,那么您必須決定如何打破它們,以及它們可能表明數據的性質。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM