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 はおそらく解決策ではないことに気付きました。特定のセル。個々のセル内のパターンのすべての出現を 1 行でカウントし、これらの値を加算して行の合計を提供するソリューションが必要です。この合計はrowsum、その特定の行の列に追加されます。

文脈上、特定のセルの内容の典型的な個々の発生は次のようになります。

2212(AATTGCCCCACA,-,0.00)

一方、複数のオカレンスがある場合、それらはセル内に連続した文字列として存在し、各エントリはコンマで区切られます (たとえば、2 つのエントリの場合)。

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 に答える