在R中连接模糊逻辑时选择最大权重

时间:2017-12-08 14:03:39

标签: r fuzzy-search fuzzy-logic fuzzy-comparison

我需要合并两个数据集

DF1

df1=structure(list(id = structure(c(1L, 4L, 5L, 6L, 2L, 3L), .Label = c("195/75 R16C-Tire CORDIANT Business CA", 
"215/75 R17,5-Tires KAMA NR-201 driving axle", "235/70 R16-Tire KAMA-221", 
"275/70 R22,5-Tire TYREX ALL STEEL VC-1 (Я-646)", "315/80 R22,5-Tire TYREX ALL STEEL DR-1 driving axle", 
"315/80 R22,5-Tire TYREX ALL STEEL FR-401 steering axle"), class = "factor")), .Names = "id", class = "data.frame", row.names = c(NA, 
-6L))

DF2

 df2= structure(list(id = structure(c(2L, 4L, 5L, 6L, 3L, 1L), .Label = c("Auto-cutting 245 / 70R16 K-214", 
    "Auto-rubber 195/75 R16C Cordiant Business CA 107 / 105R all-season", 
    "Auto-rubber 215 / 75R17,5 K-166", "Auto-rubber 275 / 70R22,5 (11 / 70R22,5) I-646 (Tyrex all steel VC-1)", 
    "Auto-rubber 315 / 80R22,5 DR-1Tyrex All Steel (Я-636)", "Auto-rubber 315 / 80R22,5 FR-401 Tyrex All Steel (Я-626)"
    ), class = "factor")), .Names = "id", class = "data.frame", row.names = c(NA, 
    -6L))

我使用fuzzylogic

library("RecordLinkage")
    #get weights
rpairs_jar <- compare.linkage(df1, df2,
                              strcmp = c("id"),
                              strcmpfun = jarowinkler)

rpairs_epiwt <- epiWeights(rpairs_jar)
#get wright to data frame
b=rpairs_epiwt$pairs
View(b)

在输出时我看到

enter image description here

我们在所有id之间都有权重。 例如,相对于所有6种面额计算权重id1。 但是我们看到df1(id1)的第一项和df2(id1)的第一项(0,61)之间的权重最大。

第二项(df1的id2)第三项(df2的id3)(0.58)之间的最大权重怎么样。

如何只留下那些比较,其中id是最重的?

即 在输出上,我们有表没有36个条目,但有六个

id1 id2     id
1   1   0,6106743
2   3   0,5994314
3   3   0,5874915
4   4   0,6288133
5   4   0,5552018
6   6   0,5642857

1 个答案:

答案 0 :(得分:1)

我会这样做,虽然我不确定我完全理解你的问题。啊,我刚发现它:你的数据与图片中的数据不同。以下是我获得的前12行:

   id1 id2        id is_match
1    1   1 0.6106743       NA
2    1   2 0.5014481       NA
3    1   3 0.4869703       NA
4    1   4 0.4752647       NA
5    1   5 0.4671400       NA
6    1   6 0.4358859       NA
7    2   1 0.4428541       NA
8    2   2 0.5752810       NA
9    2   3 0.6090623       NA
10   2   4 0.5946931       NA
11   2   5 0.5320353       NA
12   2   6 0.5055347       NA

如果你追求每个id的最大id1,那就是我要做的事情:

library(tidyverse)

b %>% 
  group_by(id1) %>% 
  summarise(maxId1 = max(id)) %>% 
  left_join(b, by = c("maxId1" = "id", "id1")) %>% 
  select(id1, id2, "id" = "maxId1")

这就是它的收益(这不是你上面所说的,鉴于不同的数据,但我认为是你所寻求的):

# A tibble: 6 x 3
    id1   id2        id
  <int> <int>     <dbl>
1     1     1 0.6106743
2     2     3 0.6090623
3     3     3 0.5837645
4     4     4 0.6249495
5     5     5 0.5889200
6     6     6 0.5642857

我希望这会对你有所帮助。