[英]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.