R требует суммы строк для вхождений шаблона регулярных выражений, которые могут встречаться несколько раз в отдельных ячейках
Я использую r и ищу регулярные выражения для вычисления суммы строк для количества вхождений строкового шаблона, который встречается во всех столбцах фрейма данных, содержащих эпигенетическую информацию. Есть 40 столбцов, 15 из которых могут содержать или не содержать образец интереса. Код, который сделал меня ближе всего к тому, что я ищу:
# Looking to match following exact pattern ',.,' which will always be
# preceded and followed by a sequence of characters or numbers.
# Note: the full stop in the pattern above signifies any character
df$rowsum <- rowSums(apply(df, 2, grep, pattern = ".*,.,.*"))
Для каждой строки это количество столбцов, содержащих шаблон, однако у меня есть проблема в том, что любая отдельная ячейка может содержать этот шаблон более одного раза. Я попробовал несколько различных комбинаций функций, чтобы попытаться найти ответ, и понял, что grep, вероятно, не является решением, поскольку он выдает логическое всякий раз, когда находит шаблон, то есть он может сообщить максимум одно совпадение с шаблоном для любого конкретная клетка. Мне нужно решение, которое подсчитывает каждое вхождение шаблона в каждой отдельной ячейке в одной строке и добавляет эти значения, чтобы получить итоговую сумму строки. Эта сумма добавлена rowsum
столбец этой конкретной строки.
Для контекста типичное индивидуальное вхождение содержимого конкретной ячейки может быть:
2212(AATTGCCCCACA,-,0.00)
Принимая во внимание, что если бы было несколько вхождений, они существовали бы в ячейке в виде непрерывной строки, каждая запись разделялась запятой, например, для двух записей:
144(TGTGAGTCAC,+,0.00),145(GTGAGTCACT,-,0.00)
Я использую ,.,
в качестве уникального идентификатора каждой записи, так как все остальное для каждой записи является переменной.
Вот некоторые данные игрушки:
df <-data.frame(NAMES = c('A', 'B', 'C', 'D'),
GENE1 = c("144(TGTGAGTCAC,+,0.00),145(GTGAGTCACT,-,0.00)", "2(TGTGAGTCAC,+,0.00)", "NA", "NA"),
GENE2 = c("632(TAAAGAGTCAC,-,0.00),60(GTCCCTCACT,-,0.00),", "7(TGTGAGTCAC,+,0.00)", "7(TGTGAGTCAC,+,0.00)", "NA"),
stringsAsFactors = F)
Оптимальный код предоставил бы фрейм данных со столбцом суммы строк, к которому добавлены итоги:
# Omitted GENE column contents to save space
NAMES GENE1 GENE2 rowsum
A ... ... 4
B ... ... 2
C ... ... 1
D ... ... 0
Это было поставлено в тупик на 48 часов. Любая помощь будет принята с благодарностью.
1 ответ
Мы можем использовать str_extract
от stringr
library(stringr)
df$rowsum <- Reduce(`+`, lapply(df[-1],
function(x) lengths(str_extract_all(x, "\\d+\\("))))
df$rowsum
#[1] 4 2 1 0