начальная и конечная позиции символа; R

#r

Вопрос:

Я пытаюсь получить

  1. начальная и конечная позиции символа «-» в столбце V1
  2. и соответствующие ему символы в этих позициях в столбце V2
  3. Затем длина его

Любая помощь будет оценена по достоинству!

 ip lt;- structure(list(V1 = c("ab---cdef", "abcd---ef", "a--bc--def"),   V2 = c("xxxxxxxyy", "xxxxxyyyy", "xxxyyyzzzz")), class = "data.frame", row.names = c(NA,  -3L))  

Я попробовал stringi_locate, но он выводится для отдельной позиции. Например, для этого «ab—cdef» вместо 3-5 он выводит 3-3, 4-4, 5-5.

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

 op lt;- structure(list(V1 = c("ab---cdef", "abcd---ef", "a--bc--def"),   V2 = c("xxxxxxxyy", "xxxxxyyyy", "xxxyyyzzzz"), output = c("x:x-3:5-3",   "x:y-5:7-3", "x:x-2:3-2; y-z:6:7-2")), class = "data.frame", row.names = c(NA,  -3L))  

в выходном столбце должно быть

  1. Символы в столбце V2 относительно начала и конца «-» в V1
  2. Затем начальная и конечная позиции
  3. Затем его длина
 V1 V2 output ab---cdef xxxxxxxyy x:x-3:5-3  

Спасибо!

Комментарии:

1. Извините, я исправил опечатку в выводе 3-й строки. Если их несколько, то код должен выводить значения с разделителями » ;»

Ответ №1:

Вот пример использования grepexpr , чтобы получить все совпадения в строке.

 x lt;- gregexpr("- ", ip$V1) mapply(function(m, s, r) {  start lt;- m  len lt;- attr(m, "match.length")  end lt;- start   len-1  part lt;- mapply(substr, r, start, end)  paste0(part, "-", start, ":", end, "-", len, collapse=";")   }, x, ip$V1, ip$V2) # [1] "xxx-3:5-3"  # [2] "xyy-5:7-3"  # [3] "xx-2:3-2;yz-6:7-2"  

Я не уверен, какова была ваша логика для превращения xxx в x:x или xyy в x-y или как это обобщается на другие последовательности, поэтому не стесняйтесь изменять эту часть. Но вы можете получить начало и длину совпадений, используя атрибуты возвращаемого объекта соответствия. Это просто важно использовать - в качестве шаблона, чтобы вы соответствовали набору тире, а не только одному тире.

Комментарии:

1. Отлично! Большое вам спасибо!!!