1
$\begingroup$

Im trying to classify my list into three type: XDR - A strain must be resistant to:

MDR + CIPROFLOXACIN/MOXIFLOXACIN/OFLOXACIN/LEVOFLOXACIN + AMYCACIN/CAPREOMYCIN/KANAMYCIN-> means ISONIAZID + RIFAMPICIN + any of these or two or three or all (CIPROFLOXACIN/MOXIFLOXACIN/OFLOXACIN/LEVOFLOXACIN) + any of these or two or three or all (AMYCACIN/CAPREOMYCIN/KANAMYCIN)

PRE-XDR - A strain must be resistant to:

MDR + CIPROFLOXACIN/MOXIFLOXACIN/OFLOXACIN/LEVOFLOXACIN -> means ISONIAZID + RIFAMPICIN + any of these or two or three or all (CIPROFLOXACIN/MOXIFLOXACIN/OFLOXACIN/LEVOFLOXACIN)

MDR - A strain must be resistant to:

ISONIAZID + RIFAMPICIN 
and if it is resistant to any one/two/three of these or all of these in 
addition to ISONIAZID + RIFAMPICIN than again it is MDR:- 
PYRAZINAMIDE, ETHIONAMIDE, STREPTOMYCIN, ETHAMBUTOL

SUSCEPTIBLE - A strain must be Susceptible to all drugs

I tried the code as follows for MDR:

tail -n +2 drug.txt |\
awk '{a[$1] = a[$1]","$2};END{for(i in a)print i"\t"a[i]}'|\
grep -P "\t,ISONIAZID,RIFAMPICIN$"

It gave me MDR starins correctly but than i had to first remove all Susceptible strains and applied it to Resistant one only.

But when i applied the code for Pre-XDR:

tail -n +2 drug.txt |\
awk '{a[$1] = a[$1]","$2};END{for(i in a)print i"\t"a[i]}'|\
grep -P 
"\t,ISONIAZID,RIFAMPICIN|CIPROFLOXACIN|MOXIFLOXACIN|OFLOXACIN|LEVOFLOXACIN"

It is giving me the result as below:

SRR671821       ,CAPREOMYCIN,ETHAMBUTOL,ETHIONAMIDE,ISONIAZID,KANAMYCIN,OFLOXACIN,RIFAMPICIN,STREPTOMYCIN
SRR671863       ,CAPREOMYCIN,ETHAMBUTOL,ISONIAZID,KANAMYCIN,OFLOXACIN,RIFAMPICIN
SRR671822       ,ETHAMBUTOL,ISONIAZID,OFLOXACIN,RIFAMPICIN,STREPTOMYCIN
SRR671864       ,CAPREOMYCIN,ETHAMBUTOL,ISONIAZID,KANAMYCIN,OFLOXACIN,RIFAMPICIN

Which is not correct for Pre-XDR.

So I'm looking for a the drugs if match than look for resistant and susceptible if these criteria match with any of the mention type (MDR,XDR...) it put those under that in a new file. Can anyone help? my file druglist.sxls

MDR eg from the file attached is:

ERR038736   ISONIAZID   RESISTANT
ERR038736   RIFAMPICIN  RESISTANT
ERR038737   ISONIAZID   RESISTANT
ERR038737   RIFAMPICIN  RESISTANT
SRR1270146  AMIKACIN    SUSCEPTIBLE 
SRR1270146  CAPREOMYCIN SUSCEPTIBLE 
SRR1270146  CYCLOSERINE SUSCEPTIBLE 
SRR1270146  ETHAMBUTOL  RESISTANT   
SRR1270146  ETHIONAMIDE SUSCEPTIBLE 
SRR1270146  ISONIAZID   RESISTANT   
SRR1270146  KANAMYCIN   SUSCEPTIBLE 
SRR1270146  PARA-AMINOSALICYLIC ACID    SUSCEPTIBLE 
SRR1270146  PYRAZINAMIDE    RESISTANT   
SRR1270146  RIFAMPICIN  RESISTANT   
SRR1270146  STREPTOMYCIN    RESISTANT
$\endgroup$
  • 2
    $\begingroup$ Why did you delete your original question hat already had an answer? $\endgroup$ – terdon Nov 28 '18 at 10:46
  • $\begingroup$ Hi @terdon I didn't deleted that question and the answers were removed by itself and it went to solved category it self thats why i have to repost the question. $\endgroup$ – Safina A.R Nov 28 '18 at 11:21
  • 2
    $\begingroup$ Well the answer was deleted by the user who posted it, yes, but the question was deleted by you. Note that there is no such thing as "solved category", I am not sure what you mean by that. Anyway, don't worry about it, just try not to delete and repost questions in general since it confuses things. But no big deal. $\endgroup$ – terdon Nov 28 '18 at 13:04
  • $\begingroup$ I deleted my answer as it was incorrect (your question was correct and could receive answers from other people). I could try to answer it again with base R, but I will need more time $\endgroup$ – llrs Nov 28 '18 at 13:30
  • 1
    $\begingroup$ Also asked 6 weeks ago on biostars: biostars.org/p/344050 $\endgroup$ – Wouter De Coster Nov 30 '18 at 9:25
2
$\begingroup$

Since this involves combining multiple conditions, it is easier (and certainly more readable if you ever need to come back to it later) to write a script to do this. For example, in perl:

#!/usr/bin/perl

use strict;
use warnings;

## This will hold the information for each strain
my %strains;

## These are the functions that will test each strain
sub isMDR{
  my $_strain = shift;
  my %thisStrain = %{$strains{$_strain}};
  if ($thisStrain{"ISONIAZID"} && $thisStrain{"RIFAMPICIN"}){
    foreach my $drug (keys(%thisStrain)) {
      next if $drug eq "ISONIAZID";
      next if $drug eq "RIFAMPICIN";
      next if $drug eq "PYRAZINAMID";
      next if $drug eq "ETHAMBUTOL";
      next if $drug eq "STREPTOMYCIN";
      ## discard this strain if it is resistant to any other drug
      if ($thisStrain{$drug}) {
        return 0;
      }
    }

    return 1;
  }
  return 0;
}

sub isPreXDR{
  my $_strain = shift;
  my %thisStrain = %{$strains{$_strain}};
  if (
  ($thisStrain{"ISONIAZID"} && $thisStrain{"RIFAMPICIN"}) &&
  (
   $thisStrain{"CIPROFLOXACIN"}  ||
       $thisStrain{"MOXIFLOXACIN"} ||
   $thisStrain{"OFLOXACIN"}  ||
       $thisStrain{"LEVOFLOXACIN"}
      )
     ) {
    return 1;
  }
  return 0;
}

sub isXDR{
  my $_strain = shift;
  my %thisStrain = %{$strains{$_strain}};
  if (
  isPreXDR($_strain) &&
      (
       $thisStrain{"AMYCACIN"} ||
   $thisStrain{"CAPREOMYCIN"} ||
       $thisStrain{"KANAMYCIN"}
      )
     ){
    return 1;
  }
  return 0;
}

sub isSusceptible{
  my $_strain = shift;
  foreach my $drug (keys(%{$strains{$_strain}})) {
if ($strains{$_strain}{$drug}) {
      return 0
    }
  }
  return 1
}

## Iterate over each line in the input file.
## For each iteration, the special variable $_
# will hold the contents of the line.
while (<>) {
  ## Skip first line
  next if $. == 1;
  ## remove Windows-style line endings
  s/\r//;
  ## remove trailing newline
  chomp;
  ## split the line on commas
  my ($strain, $drug, $status) = split(/,/);
  if ($status eq "SUSCEPTIBLE"){
$status = 0
  }
  else {
$status = 1;
  } 
  $strains{$strain}{$drug}=$status;
}

foreach my $strain (keys(%strains)) {
  print "$strain\t";
  if (isMDR($strain)) {
print "MDR\n";
  }
  elsif (isXDR($strain)) {
print "XDR\n"
  }
  elsif (isPreXDR($strain)) {
print "PRE-XDR\n"
  }
  elsif (isSusceptible($strain)) {
    print "SUSCEPTIBLE\n";
  }
  else {
    print "OTHER\n";
  }
}

If you save that script as foo.pl, you can run it on your file with:

perl foo.pl drug.csv

Selected output from running this on the drug.csv file you posted is:

$ foo.pl drug.csv | grep -E 'ERR038288|ERR038736|ERR038751|SRS553990|ERR133879'
ERR038751   OTHER
ERR038288   SUSCEPTIBLE
SRS553990   XDR
ERR038736   MDR
ERR133879   PRE-XDR

Various details about this question were added in chat: https://chat.stackexchange.com/transcript/message/47821646#47821646

$\endgroup$
  • $\begingroup$ It is again not correct like for MDR -ERR047000 - It is a Susceptible strain. ERR047000 ETHAMBUTOL SUSCEPTIBLE ERR047000 ISONIAZID SUSCEPTIBLE ERR047000 PYRAZINAMIDE SUSCEPTIBLE ERR047000 RIFAMPICIN SUSCEPTIBLE Same for MDR -> ERS389515: ERS389515 ETHAMBUTOL SUSCEPTIBLE ERS389515 ISONIAZID SUSCEPTIBLE ERS389515 PYRAZINAMIDE SUSCEPTIBLE ERS389515 RIFAMPICIN SUSCEPTIBLE ERS389515 STREPTOMYCIN SUSCEPTIBLE It is susceptible not MDR $\endgroup$ – Safina A.R Nov 29 '18 at 13:52
  • $\begingroup$ @SafinaA.R what is wrong? It is very hard to test since you haven't given examples of what we should see. The example in your question isn't listed in the drugs.csv file. Can you ping me (@terdon) in our chat room so we can discuss this? $\endgroup$ – terdon Nov 29 '18 at 13:54
  • $\begingroup$ HI. I think it is now running fine. So now i have the proper classification verified by my team. So any thing that is resistant to ISONIASID and RIfampicin is mdr but it can also be mdr if these two are there plus any of these or all of these: Pyrazinamid, Ethambutal, Streptomycin, ETHIONAMIDE. like these are the few example of mdr from the list: ERR038736 ERR038737 ERR038738 ERR038739 ERR038740 ERR038742 ERR038743 ERR038744 ERR038745 ERR038746 ERR038747 ERR038748 ERR038749 ERR038750 ERR038752 ERR046855 $\endgroup$ – Safina A.R Nov 30 '18 at 8:57
  • $\begingroup$ Few Examples: ERR038288 Susc ERR038736 MDR ERR038751 Others SRS553990 XDR ERR133879 Pre-XDR $\endgroup$ – Safina A.R Nov 30 '18 at 10:21
  • 1
    $\begingroup$ @SafinaA.R all of those are caught correctly by the latest version. $\endgroup$ – terdon Nov 30 '18 at 10:24

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.