#r
Вопрос:
Я пытаюсь получить
- начальная и конечная позиции символа «-» в столбце V1
- и соответствующие ему символы в этих позициях в столбце V2
- Затем длина его
Любая помощь будет оценена по достоинству!
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))
в выходном столбце должно быть
- Символы в столбце V2 относительно начала и конца «-» в V1
- Затем начальная и конечная позиции
- Затем его длина
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. Отлично! Большое вам спасибо!!!