R: Построение фиктивных столбцов на основе частичных совпадений строк из двух столбцов - PullRequest
0 голосов
/ 04 марта 2019

У меня есть фрейм данных df1 с информацией о приобретениях по ID.Каждый получатель A и целевой B имеют свои четырехзначные коды SIC на одной строке, разделенные знаком "/".

df1 <- data.frame(ID = c(1,2,3,4),
              A = c("1230/1344/2334/2334","3322/3344/3443", "1112/9099", "3332/4483"),
              B = c("1333/2334","3344/8840", "4454", "9988/2221/4483"))

  ID                   A              B
   1 1230/1344/2334/2334      1333/2334
   2      3322/3344/3443      3344/8840
   3           1112/9099           4454
   4           3332/4483 9988/2221/4483

. Мне нужно классифицировать каждый идентификатор транзакции следующим образом:

  1. Если первичный код (то есть первые четыре цифры) либо А, либо В совпадает с любым другим кодом, чем первичный код В или А, тогда столбец Primary.other.match принимает значение 1 и 0, в противном случае,
  2. Если любой другой код, кроме первичного кода A или B, совпадает с любым другим, чем первичный код B или A, столбец Other.other.match принимает значения 1 и 0, в противном случае.

Желаемый результат показан ниже в обновленном df1.

df1 <- data.frame(ID = c(1,2,3,4),
              A = c("1230/1344/2334/2334","3322/3344/3443", "1112/9099", "3332/4483"),
              B = c("1333/2334","3344/8840", "4454", "9988/2221/4483"),
              Primary.other.match = c(0,1,0,0), #only if primary Code of A or B matches 
any other code of B or A
              Other.other.match = c(1,0,0,1)) # only if primary codes do not match 
primary or any other codes, but any other codes match
ID                   A              B Primary.other.match Other.other.match
 1 1230/1344/2334/2334      1333/2334                   0                 1
 2      3322/3344/3443      3344/8840                   1                 0
 3           1112/9099           4454                   0                 0
 4           3332/4483 9988/2221/4483                   0                 1

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 04 марта 2019

вот решение в пределах тидиверса.

Сначала вы создаете функцию, которая проверяет, есть ли первичное или другое совпадение, а затем применяете эту функцию в столбце с помощью purrr::map:

library(tidyverse)

fun1 <- function(str1, str2){
 str1 <- str1 %>% str_split("/") %>% unlist()
 str2 <- str2 %>% str_split("/") %>% unlist()

 str1p <- str1[1]
 str2p <- str2[1]

 pom <- ifelse(str1p %in% str2 | str2p %in% str1, 1, 0)
 oom <- ifelse(pom == 0 & length(intersect(str1, str2)) > 0, 1, 0)

 tibble(pom = pom, oom = oom)

}

df1 %>% as_tibble() %>% 
  mutate(result = map2(A, B, fun1)) %>% 
  unnest(result)

# A tibble: 4 x 5
     ID A                   B                pom   oom
  <dbl> <fct>               <fct>          <dbl> <dbl>
1     1 1230/1344/2334/2334 1333/2334          0     1
2     2 3322/3344/3443      3344/8840          1     0
3     3 1112/9099           4454               0     0
4     4 3332/4483           9988/2221/4483     0     1
...