/ / pozícia postavy v reťazci - string, r, perl

znaková pozícia v reťazci - string, r, perl

Mám dátový rámec s reťazcami znakov column1 a ID v column2, Reťazec obsahuje A,T,G or C, Chcel by som vytlačiť riadky, ktoré majú A v polohe 1. Potom by som chcel vytlačiť riadky, ktoré majú A v pozícii 2 atď. a uložte ich do samostatných súborov. Doteraz som použil biostrings v R pre podobnú analýzu, ale pre tento problém to nebude fungovať presne.

Sequence                ID
TATACAAGGGCAAGCTCTCTGT  mmu-miR-381-3p
TCGGATCCGTCTGAGCT       mmu-miR-127-3p
ATAGTAGACCGTATAGCGTACG  mmu-miR-411-5p
......
600 more lines

odpovede:

1 pre odpoveď č. 1

Biostrings bude fungovať perfektne a bude veľmi rýchly. Zavolajme si reťazec DNA mydata

HasA <- sapply(mydata,function(x) as.character(x[2]) == "A")

Teraz máte vektor TRUE alebo FALSE označujúci, ktorá sekvencia má A na pozícii 2. Môžete to urobiť v peknom dátovom rámci, ako je tento

HasA.df <- data.frame("SeqName" = names(mydata), "A_at_2" = HasA)

1 pre odpoveď č. 2

Nie ste si istí očakávaným výsledkom,

 mydata <- read.table(text="Sequence                ID
TATACAAGGGCAAGCTCTCTGT  mmu-miR-381-3p
TCGGATCCGTCTGAGCT       mmu-miR-127-3p
ATAGTAGACCGTATAGCGTACG  mmu-miR-411-5p",sep="",header=T,stringsAsFactors=F)

mCh <- max(nchar(mydata[,1])) #gives the maximum number of characters in the first column

sapply(seq(mCh), function(i) substr(mydata[,1],i,i)=="A") #gives the index

Môžeš použiť which získať index riadku, ktorý spĺňa podmienku pre každú pozíciu

  res <-  stack(setNames(sapply(seq(mCh),
function(i) which(substr(mydata[,1],i,i)=="A")),1:mCh))[,2:1]

tail(res, 5) #for the 13th position, 1st and 3rd row of the sequence are TRUE
ind values
#11  13      1
#12  13      3
#13  14      2
#14  15      3
#15  20      3

používať index values extrahovať riadky. Pre 1. pozíciu

 mydata[res$values[res$ind==1],]
#               Sequence             ID
# 3 ATAGTAGACCGTATAGCGTACG mmu-miR-411-5p

0 pre odpoveď č. 3

Použitie perl one-liner

perl -Mautodie -lane "
BEGIN {($f) = @ARGV}
next if $. == 1;
my @c = split //, $F[0];
for my $i (grep {$c[$_] eq "A"} (0..$#c)) {
open my $fh, ">>", "$f.$i";
print $fh $_;
}
" file