3

我使用 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 小时。任何帮助将不胜感激。

4

1 回答 1

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
于 2016-11-22T12:17:56.123 回答