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

R要求在单个单元格中多次出现正则表达式模式的行和,r,regex,rowsum,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

我使用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 = ".*,.,.*"))
然而,如果有多个实例,它们将作为连续字符串存在于单元格中,每个条目用逗号分隔,例如两个条目:

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)

在这件事上被难住了48小时。非常感谢您的帮助。

我们可以使用
stru 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
库(stringr)

df$rowsum Hi@akrun,不是Advancer用户,因此很难解释您的回答。您的代码适用于玩具数据,但不适用于我的完整数据集,它似乎高估了行和。@Darren我正在使用正则表达式匹配
。因此,在示例中,第一行有4个这样的实例,第二行、第二行,依此类推。经过一段时间的处理,结果表明高估是由R在导入文件时分配的NAs造成的。我在玩具数据中发送的NAs是以字符串形式发送的,因此它们不会导致相同的问题。当我将NAs更改为空白strin时gs高估的行和消失了,给了我预期的答案。知道为什么会发生这种情况吗?谢谢你的帮助,非常感谢!!@Darren我认为NAs将自动读取为缺失值。检查是否有任何空格前导/滞后空格或任何其他字符。在这种情况下,你可以在
na中指定该字符。strings
read.csv(“yourfile.csv”,na.strings=“na”)
谢谢@akrun!您的代码现在对我来说运行良好。
# Omitted GENE column contents to save space

NAMES    GENE1     GENE2     rowsum
  A       ...       ...         4
  B       ...       ...         2
  C       ...       ...         1
  D       ...       ...         0
library(stringr)
df$rowsum <- Reduce(`+`, lapply(df[-1], 
        function(x) lengths(str_extract_all(x, "\\d+\\("))))
df$rowsum
#[1] 4 2 1 0