Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Counting chars in sequences via SQL

I have a database with a sequence table. Each (amino acid) sequence in this table comprises of 20 different chars (A, V, ...). For instance "MQSHAMQCASQALDLYD...".

I would like to count the number of appearance of each char, so that I get something like "2xM, 3xQ, ...".

Furthermore, I would like to do this over all sequences in my DB, so I get the overall appearance of each char. ("248xM, 71x W,...").

How can I do this in PostgreSQL? At the moment, I am doing it with Ruby, but I have 25,000 sequences with a length of about 400 chars each. This takes a while and I hope it will be faster with SQL.

like image 924
Bjoernsen Avatar asked Jun 09 '11 12:06

Bjoernsen


2 Answers

This is How to find all A's in a string:

select length(regexp_replace('AAADDD', '[^A]', '', 'g'));

This is how to find all A's in a table:

select sum(length(regexp_replace(field, '[^A]', '', 'g'))) from table;
like image 109
Dmitry Negoda Avatar answered Sep 29 '22 13:09

Dmitry Negoda


I usually find defining a reusable function more flexible:

CREATE OR REPLACE FUNCTION numch(text, text) RETURNS integer AS
  $$ 
    SELECT length($2) - length(replace($2, $1, '')) 
  $$ LANGUAGE SQL;

And then you can use it like:

SELECT sum(numch('A', colname)) AS nA, sum(numch('V', colname)) AS nV
  FROM relname;

To get results like:

   na   |   nv   
--------+--------
 359541 | 296330
(1 row)

Adopted from this psql-performance thread.

like image 20
Amir Ali Akbari Avatar answered Sep 29 '22 12:09

Amir Ali Akbari