позиция символа в строке

#string #r #perl

#строка #r #perl

Вопрос:

У меня есть фрейм данных с символьными строками column1 и идентификатором column2 . Строка содержит A,T,G or C . Я хотел бы напечатать строки, которые имеют A начальную позицию 1. Затем я хотел бы распечатать строки, которые A находятся в позиции 2 и так далее, и сохранить их в отдельных файлах. До сих пор я использовал biostrings в R для аналогичного анализа, но это точно не сработает для этой проблемы. Я хотел бы использовать perl.

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

Комментарии:

1. Ну, первый запуск был бы data[,1][order(substring(data[,1], 1, 1))] . Таким образом, вы должны иметь возможность перебирать буквы каждой строки

Ответ №1:

Биостринги будут работать отлично, и это будет довольно быстро. Давайте назовем ваш набор строк ДНК mydata

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

Теперь у вас есть вектор TRUE или FALSE, указывающий, какая последовательность имеет A в позиции 2. Вы можете превратить это в красивый фрейм данных, подобный этому

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

Комментарии:

1. Спасибо, я попробую это

Ответ №2:

Не уверен в ожидаемом результате,

  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
  

Вы можете использовать which для получения индекса строки, которая удовлетворяет условию для каждой позиции

   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
  

используйте индекс values для извлечения строк. Для 1-й позиции

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

Комментарии:

1. Как вы печатаете строки из исходной входной матрицы, которые являются ИСТИННЫМИ для каждой позиции?

Ответ №3:

Использование однострочного perl

 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