используя stringdist для двух наборов данных с перекрестным соединением в R - PullRequest
0 голосов
/ 13 октября 2018

строка работает с вектором

stringdist("ca","abc")
[1] 3

, но я хочу сопоставить два набора данных: первый

structure(list(id = structure(c(5L, 2L, 4L, 3L, 6L, 1L, 7L), .Label = c("SOFT Ватные палочки 100 ПЭ (БЭЛЛ", 
"Лимоны 55+", "МАКФА макароныоны перья любит. в/с", "Пакет Магнит белый (Пластиктре", 
"Салфетки бумажные колор 100шт PL", "ТОБУС Сушки Челночок 0,5кг флоуп", 
"ФЕТАКСА Сырный продукт 60% 400г("), class = "factor")), .Names = "id", class = "data.frame", row.names = c(NA, 
-7L))

и второй

structure(list(id2 = structure(c(4L, 3L, 2L, 5L, 1L, 6L), .Label = c("ватные палочки ", 
"МАКФА макароныоны перья ", "пакет белый", "салфетки", "сушки", 
"сырный продукт"), class = "factor")), .Names = "id2", class = "data.frame", row.names = c(NA, 
-6L))

все эти строки должны соответствоватькросс-соединение IE выход

                                   id1  id2          weight.between.strings
1     Салфетки бумажные колор 100шт PL       салфетки                      1
2     Салфетки бумажные колор 100шт PL    пакет белый                      2
3     Салфетки бумажные колор 100шт PL    макфа перья                      3
4     Салфетки бумажные колор 100шт PL          сушки                      4
5     Салфетки бумажные колор 100шт PL ватные палочки                      5
6     Салфетки бумажные колор 100шт PL сырный продукт                      6
7                           Лимоны 55+       салфетки                      7
8                           Лимоны 55+    пакет белый                      8
9                           Лимоны 55+    макфа перья                      9
10                          Лимоны 55+          сушки                     10
11                          Лимоны 55+ ватные палочки                     11
12                          Лимоны 55+ сырный продукт                     12
13      Пакет Магнит белый (Пластиктре       салфетки                     13
14      Пакет Магнит белый (Пластиктре    пакет белый                     14
15      Пакет Магнит белый (Пластиктре    макфа перья                     15
16      Пакет Магнит белый (Пластиктре          сушки                     16
17      Пакет Магнит белый (Пластиктре ватные палочки                     17
18      Пакет Магнит белый (Пластиктре сырный продукт                     18
19  МАКФА макароныоны перья любит. в/с       салфетки                     19
20  МАКФА макароныоны перья любит. в/с    пакет белый                     20
21  МАКФА макароныоны перья любит. в/с    макфа перья                     21
22  МАКФА макароныоны перья любит. в/с          сушки                     22
23  МАКФА макароныоны перья любит. в/с ватные палочки                     23
24  МАКФА макароныоны перья любит. в/с сырный продукт                     24
25    ТОБУС Сушки Челночок 0,5кг флоуп       салфетки                     25
26    ТОБУС Сушки Челночок 0,5кг флоуп    пакет белый                     26
27    ТОБУС Сушки Челночок 0,5кг флоуп    макфа перья                     27
28    ТОБУС Сушки Челночок 0,5кг флоуп          сушки                     28
29    ТОБУС Сушки Челночок 0,5кг флоуп ватные палочки                     29
30    ТОБУС Сушки Челночок 0,5кг флоуп сырный продукт                     30
31    SOFT Ватные палочки 100 ПЭ (БЭЛЛ       салфетки                     31
32    SOFT Ватные палочки 100 ПЭ (БЭЛЛ    пакет белый                     32
33    SOFT Ватные палочки 100 ПЭ (БЭЛЛ    макфа перья                     33
34    SOFT Ватные палочки 100 ПЭ (БЭЛЛ          сушки                     34
35    SOFT Ватные палочки 100 ПЭ (БЭЛЛ ватные палочки                     35
36    SOFT Ватные палочки 100 ПЭ (БЭЛЛ сырный продукт                     36
37    ФЕТАКСА Сырный продукт 60% 400г(       салфетки                     37
38    ФЕТАКСА Сырный продукт 60% 400г(    пакет белый                     38
39    ФЕТАКСА Сырный продукт 60% 400г(    макфа перья                     39
40    ФЕТАКСА Сырный продукт 60% 400г(          сушки                     40
41    ФЕТАКСА Сырный продукт 60% 400г( ватные палочки                     41
42    ФЕТАКСА Сырный продукт 60% 400г( сырный продукт                     42

Как получить желаемый результат?здесь матрица 7х6 строк.В реальных данных 20 000, 20 000. Это украинские строки.Здесь названия товаров, содержание не имеет значения.Вопрос в том, как сопоставить эти строки.

1 Ответ

0 голосов
/ 13 октября 2018

Я не уверен, что понимаю ваш желаемый результат, но следующее вычисляет расстояния между всеми парами строк обоих фреймов данных, используя расстояние по умолчанию "osa".

В дальнейшем я назвал ваш первый data.frame first, а второй second.

library(stringdist)

res <- lapply(first$id, function(x){
    d <- stringdist(x, second$id2)
    setNames(d, second$id2)
  })
names(res) <- first$id
res <- do.call(rbind, res)
res <- reshape2::melt(res)
names(res)[1:2] <- c("id1", "id2")

head(res)
#                                 id1      id2 value
#1   Салфетки бумажные колор 100шт PL салфетки    25
#2                         Лимоны 55+ салфетки    10
#3     Пакет Магнит белый (Пластиктре салфетки    26
#4 МАКФА макароныоны перья любит. в/с салфетки    31
#5   ТОБУС Сушки Челночок 0,5кг флоуп салфетки    30
#6   SOFT Ватные палочки 100 ПЭ (БЭЛЛ салфетки    28

Также есть функция stringdistmatrix, которая вычисляет матрицу расстояний.Но, учитывая размеры ваших реальных матриц, это может быть нецелесообразно.

res2 <- stringdistmatrix(first$id, second$id2)
dimnames(res2) <- list(first$id, second$id2)
res2
...