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
Другие вопросы по тегам