Совпадение строк перед специальным символом - PullRequest
1 голос
/ 05 апреля 2020

Я пытаюсь сопоставить строки в двух столбцах и вернуть несоответствия перед ":". Он не должен возвращаться, если x2x, y67y, так как x остается x, а y остается как y.

Я не хочу совпадать с ": decimal". Если x2y находится в обоих столбцах, то это совпадение (независимо от несоответствия в десятичной дроби после специального символа) INPUT:

input <- structure(list(x = structure(c(1L, 2L, 3L, 3L), .Label = c("A", 
"B", "C"), class = "factor"), y = structure(c(2L, 3L, 1L, 4L), .Label = c("A", 
"B", "C", "D"), class = "factor"), x_val = c("x2x:0.12345,y67h:0.06732,d7j:0.032647", 
"x2y:0.26345,y67y:0.28320,d7r:0.043647", "x2y:0.23435,y67y:0.28310,d7r:0.043547", 
"x2y:0.23435,y67y:0.28330,d7r:0.043247"), y_val = c("x2y:0.33134,y67y:0.3131,d7r:0.23443", 
"x2y:0.34311,y67y:0.14142,d7r:0.31431", "x2x:0.34314,y67h:0.14141,d7j:0.453145", 
"x67b:0.31411,g72v:0.3134,b8c:0.89234")), row.names = c(NA, -4L
), class = "data.frame")

Вывод:

output <- structure(list(x = structure(c(1L, 2L, 3L, 3L), .Label = c("A", 
"B", "C"), class = "factor"), y = structure(c(2L, 3L, 1L, 4L), .Label = c("A", 
"B", "C", "D"), class = "factor"), x_val = c("x2x:0.12345,y67h:0.06732,d7j:0.032647", 
"x2y:0.26345,y67y:0.28320,d7r:0.043647", "x2y:0.23435,y67y:0.28310,d7r:0.043547", 
"x2y:0.23435,y67y:0.28330,d7r:0.043247"), y_val = c("x2y:0.33134,y67y:0.3131,d7r:0.23443", 
"x2y:0.34311,y67y:0.14142,d7r:0.31431", "x2x:0.34314,y67h:0.14141,d7j:0.453145", 
"x67b:0.31411,g72v:0.3134,b8c:0.89234"), diff_x = c("y67h:0.06732,d7j:0.03264", 
NA, "x2y:0.23435,d7r:0.043547", "x2y:0.23435,y67y:0.28330,d7r:0.043247"
), diff_y = c("x2y:0.33134,d7r:0.23443", NA, "y67h:0.14141,d7j:0.453145", 
"x67b:0.31411,g72v:0.3134,b8c:0.89234")), row.names = c(NA, -4L
), class = "data.frame")

Я сталкиваюсь с проблема, когда я просто хочу соответствовать до ":" символа. Следующий код взят из этого вопроса: { ссылка }.

library(dplyr)
library(purrr)

I %>% mutate(diff_x = map2_chr(strsplit(x_val, split = ", "), 
                               strsplit(y_val, split = ", "), 
                               ~paste(grep('([a-z])(?>\\d+)(?!\\1)', setdiff(.x, .y), 
                                           value = TRUE, perl = TRUE), 
                                           collapse = ", ")) %>%
               replace(. == "", NA), 
             diff_y = map2_chr(strsplit(x_val, split = ", "), 
                               strsplit(y_val, split = ", "), 
                               ~paste(grep('([a-z])(?>\\d+)(?!\\1)', setdiff(.y, .x), 
                                           value = TRUE, perl = TRUE),
                                           collapse = ", ")) %>%
               replace(. == "", NA))

Кто-нибудь может помочь? Спасибо!

1 Ответ

1 голос
/ 05 апреля 2020

Я изменил свой ответ в { ссылка }, чтобы соответствовать этому вопросу:

library(dplyr)
library(purrr)

df %>% 
  mutate(
    diff_x = map2_chr(
      strsplit(x_val, split = ","), 
      strsplit(y_val, split = ","), 
      ~ {
        setdiff(sub(":.+$", "", .x), sub(":.+$", "", .y)) %>%
          grep('([a-z])(?>\\d+)(?!\\1)', ., value = TRUE, perl = TRUE) %>%
          sapply(grep, .x, value = TRUE) %>%
          paste(collapse = ", ") %>%
          replace(. == "", NA)
      }
    ),  
    diff_y = map2_chr(
      strsplit(x_val, split = ","), 
      strsplit(y_val, split = ","), 
      ~ {
        setdiff(sub(":.+$", "", .y), sub(":.+$", "", .x)) %>%
          grep('([a-z])(?>\\d+)(?!\\1)', ., value = TRUE, perl = TRUE) %>%
          sapply(grep, .y, value = TRUE) %>%
          paste(collapse = ", ") %>%
          replace(. == "", NA)
      }
    )
  )

Вывод:

  x y                                 x_val                                 y_val                     diff_x
1 A B x2x:0.12345,y67h:0.06732,d7j:0.032647   x2y:0.33134,y67y:0.3131,d7r:0.23443 y67h:0.06732, d7j:0.032647
2 B C x2y:0.26345,y67y:0.28320,d7r:0.043647  x2y:0.34311,y67y:0.14142,d7r:0.31431                       <NA>
3 C A x2y:0.23435,y67y:0.28310,d7r:0.043547 x2x:0.34314,y67h:0.14141,d7j:0.453145  x2y:0.23435, d7r:0.043547
4 C D x2y:0.23435,y67y:0.28330,d7r:0.043247  x67b:0.31411,g72v:0.3134,b8c:0.89234  x2y:0.23435, d7r:0.043247
                                  diff_y
1               x2y:0.33134, d7r:0.23443
2                                   <NA>
3             y67h:0.14141, d7j:0.453145
4 x67b:0.31411, g72v:0.3134, b8c:0.89234

Примечания:

  1. Поскольку мы заинтересованы только в сравнении первой части строкового формата x1y:000000, я добавил sub(":.+$", "", .x) для каждого map2_chr входного аргумента в сначала удалите часть :000000.

  2. setdiff и следующие шаги grep работают, как ожидается, для возврата несоответствий и исключения строк с формой x1x.

  3. sapply(grep, .x, value = TRUE) после первого grep берет вектор несоответствий и ищет соответствующие им исходные строки (в форме x1y:000000).

  4. paste сворачивает вектор несоответствий в один список, разделенный запятыми.

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