R需要在单个单元格中多次出现的正则表达式模式的行总和

时间:2016-11-22 12:13:45

标签: r regex rowsum

我使用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 个答案:

答案 0 :(得分:0)

我们可以使用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