R 需要行总和才能出现在单个单元格中多次出现的正则表达式模式
R require row sums for occurrences of regex pattern that can occur multiple times in individual cells
我使用 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 小时。任何帮助将不胜感激。
我们可以使用 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
我使用 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 小时。任何帮助将不胜感激。
我们可以使用 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