Есть ли способ поиска текстовой строки (не ключевых слов) из одной ячейки в другую ячейку и цикл по всему набору данных? - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь выполнить поиск текстовой строки на основе значения 1 столбца (1-й кадр данных), если оно частично или полностью совпадает с другим столбцом (во 2-м кадре данных) (не с помощью ключевых слов).Оба набора данных различаются по размеру.(С использованием R 3.5.1)

Работает с 2 наборами данных, каждый из которых содержит наблюдения 900K и 80K.Первый набор данных содержит столбец, содержащий код продукта (prod_code: ABC-1562), а второй - столбец, содержащий Family_code (family_code: ABC-1563; ABC-1562; ABC-9892).Обе таблицы имеют идентификационный номер продукта (идентификатор продукта: 4772345), назначенный каждому уникальному коду продукта.

Я пытался использовать charmatch, match, string_detect, но до сих пор я не мог сделать голову с моим кодом.

Использование соответствия

df2<- df2%>% mutate_(check = match(df1$prod_code, df2$family_code)

Использование charmatch

df1$char_match <- charmatch(df1$prod_code, df2$family_code)

Использование str_detect

df1%>% mutate (String_check = str_detect(df2$family_code, df1$prod_code))

Ожидаемый результат

Мне нужно запросить:1. Если значение из 1-го столбца (код продукта) существует во 2-м столбце (код семейства) 2. Сохраните выходные данные в столбце, если код продукта существует в строке кода семейства

.

product_code(1-й набор данных)

Obs 1- ABC-1562
Obs n- ABC-1562

family_code (2-й набор данных)

Obs 1- ABC-1563;АВС-1562;ABC-9892
Obs n- ABC-1563;АВС-1564;ABC-9892

QC (Результат матча)

Obs 1 - TRUE Obs n- FALSE

QC может быть либо логическим, либо числовым, обоих случаев будет достаточно.

Заранее спасибо!

1 Ответ

0 голосов
/ 12 февраля 2019

Использование dplyr и grepl

df=data.frame(a=c("ABC-1562","ABC-1562"),
              b=c("ABC-1563; ABC-1562; ABC-9892","ABC-1563; ABC-1564; ABC-9892"),
              stringsAsFactors = FALSE)
> df%>%rowwise()%>%mutate(res=if_else(grepl(a,b),TRUE,FALSE))
Source: local data frame [2 x 3]
Groups: <by row>

# A tibble: 2 x 3
  a        b                            res  
  <chr>    <chr>                        <lgl>
1 ABC-1562 ABC-1563; ABC-1562; ABC-9892 TRUE 
2 ABC-1563 ABC-1563; ABC-1564; ABC-9892 FALSE 

РЕДАКТИРОВАТЬ

Насколько я понимаю, у вас есть два df, такие как:

> df1=data.frame(id=c(3,2,5),prod_code=c("ABC-1562","ABC-1562","ABC-1563"),
+                stringsAsFactors = FALSE)
> df1
  id prod_code
1  3  ABC-1562
2  2  ABC-1562
3  5  ABC-1563

> df2=data.frame(id=c(5,2,1),family_code=c("ABC-1563; ABC-1562; ABC-9892","ABC-1563; ABC-1564; ABC-9892",
+                                          "ABC-1561; ABC-1564; ABC-989"),
+                stringsAsFactors = FALSE)
> df2
  id                  family_code
1  5 ABC-1563; ABC-1562; ABC-9892
2  2 ABC-1563; ABC-1564; ABC-9892
3  1  ABC-1561; ABC-1564; ABC-989

Мы можем сделать left_join для сопоставления prod и family на id.Затем используйте ifelse с тем же условием, что и раньше, чтобы увидеть, есть ли совпадение.

> df=left_join(df1,df2,by="id")%>%rowwise()%>%
+   mutate(res=if_else(grepl(prod_code,family_code),
+                      TRUE,FALSE))
> df
Source: local data frame [3 x 4]
Groups: <by row>

# A tibble: 3 x 4
     id prod_code family_code                  res  
  <dbl> <chr>     <chr>                        <lgl>
1     3 ABC-1562  NA                           FALSE
2     2 ABC-1562  ABC-1563; ABC-1564; ABC-9892 FALSE
3     5 ABC-1563  ABC-1563; ABC-1562; ABC-9892 TRUE 

Таким образом, вы также можете увидеть, есть ли id без совпадения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...