在信件前后计数字母

时间:2017-03-07 20:54:42

标签: r excel

我有一个序列列表的excel文件。如何获得一个字母出现在方括号中的字母之前的次数?下面是一个条目示例。

GTCCTGGTTGTAGCTGAAGCTCTTCCC[A]CTCCTCCCGATCACTGGGACGTCCTATGT

我也想在方括号后面写这封信。

编辑:为混乱道歉。以下面的例子为例。我喜欢计算ACGT在方括号中的字母前后出现的次数(每行只有一个字母) )。因此要计算A[A]AA[A]CC[A]A等的出现次数。该文件是excel,我很高兴在excel,R或Linux中使用任何方法。

CCCACCCGCCAGGAAGCCGCTATCACTGTCCAAGTTGTCATCGGAACTCC[A]CCAGCCTGTGGACTTGGCCTGGTGCCGCCCATCCCCCTTGCGGTCCTTGC
ACCACTACCCCCTTCCCCACCATCCACCTCAGAAGCAGTCCCAGCCTGCC[A]CCCGCCAGCCCCTGCCCAGCCCTGGCTTTTTGGAAACGGGTCAGGATTGG
TTTGCTTTAAAATACTGCAACCACTCCAGGTAAATCTTCCGCTGCCTATA[A]CCCCGCCAATGAGCCTGCACATCAGGAGAGAAAGGGAAGTAACTCAAGCA
GAAATCTTCTGAAACAGTCTCCAGAAGACTGTCTCCAAATACACAGCAGA[A]CCAGCCAGTCCACAGCACTTTACCTTCTCTATTCTCAGATGGCAATTGAG
GGACTGCCCCAAGGCCCGCAGGGAGGTGGAGCTGCACTGGCGGGCCTCCC[A]GTGCCCGCACATCGTACGGATCGTGGATGTGTACGAGAATCTGTACGCAG
GGCCCAACGCCATCCTGAAACTCACTGACTTTGGCTTTGCCAAGGAAACC[A]CCAGCCACAACTCTTTGACCACTCCTTGTTATACACCGTACTATGTGGGT
TCTGCCTGGTCCGCTGGAGCTGGGCATTGAAGCCCCGCAGCTGCTCAGCC[A]CCTGCCCCGCCATCAAGAAGGCCCCACCGGCCCTGGGAAGGACACCCCTG
TTTGAAGCCCTTATGAACCAAGAAACCTTCGTTCAGGACCTCAAAATCAA[A]CCCCGCCACATGCAGCTCGCAGGCCTGCAGGAGGAAAGACAGGTTAGCAA
CTGCAGCCTACCTGTCCATGTCCCAGGGGGCCGTTGCCAACGCCAACAGC[A]CCCCGCCGCCCTATGAGCGTACCCGCCTCTCCCCACCCCGGGCCAGCTAC
ACTGGCAAACATGTTGAGGACAATGATGGAGGGGATGAGCTTGCATAGGA[A]CCTGCCGTAGGGCCACTGTCCCTGGAGAGCCAAGTGAGCCAGCGAGAAGG
CACCCTCAGAGAAGAAGAAAGGAGCTGAGGAGGAGAAGCCAAAGAGGAGG[A]GGCAGGAGAAGCAGGCAGCCTGCCCCTTCTACAACCACGAGCAGATGGGC
CCAGCCCTGTATGAGGACCCCCCAGATCAGAAAACCTCACCCAGTGGCAA[A]CCTGCCACACTCAAGATCTGCTCTTGGAATGTGGATGGGCTTCGAGCCTG
TTCCTGTGCGCCCCAACAACTCCTTTAGCTGGCCTAAAGTGAAAGGACGG[A]CCTGCCAATGAAAATAGACTTTCAGGGTCTAGCAGAAGGCAAGACCACCA
CTAACACCCGCACGAGCTGCTGGTAGATCTGAATGGCCAAGTCACTCAGC[A]CCTGCCGATACTCAGCCAGGTCAAAATTGGTGAGGCAGTGTTCATTCTGG
AGTTCTGCATCTGGAGCAAATCCTTGGCACTCCCTCATGCTGGCTATCAC[A]CCTGCCACGAATGTGCCATGGCCCAACCCTGCAGTCCATAAAGAAAACAA
CGTGCCCATGCAGCTAGTGCTCTTCCGAGAGGCTATTGAACACAGTGAGC[A]CCTGCCACGCCTATCCCCTTCCCCATCATCTCAGTGATGGGGTATGTCTA
ACAAGGACCTGGCCCTGGGGCAGCCCCTCAGCCCACCTGGTCCCTGCCTT[A]CCCAGCCAGTACTCTCCATCAGCACGGCCGAAGCCCAGCTTGTAGTCATT

5 个答案:

答案 0 :(得分:1)

您可以将原始字符串拆分为多个部分。从字符串的开头到第一个[和从第一个]到字符串的结尾。

int count = firstPart.Count(f => f == 'a');
count += secondPart.Count(f => f == 'a');

答案 1 :(得分:1)

答案 2 :(得分:1)

新R解决方案(经过OP澄清后)

假设已将数据从Excel读取到名为los(序列列表)的data.table中,该列只有一列名为sequence。然后,出现的次数可以计算如下:

library(data.table)
los[, .N, by = stringr::str_extract(sequence, "[ACGT]\\[[ACGT]\\][ACGT]")]
#   stringr N
#1:   C[A]C 8
#2:   A[A]C 5
#3:   C[A]G 1
#4:   G[A]G 1
#5:   G[A]C 1
#6:   T[A]C 1

str_extract()查找其中一个字母ACGT后跟[后跟其中一个字母ACGT后跟],后跟其中一个字母AC,{{列G中的1}},T并提取匹配的子字符串。然后,sequence按子串分组,并计算出现次数(los)。

数据

如果Excel文件以CSV格式存储,则可以使用.N data.table这样的功能来阅读

fread()

(或许,可能需要针对特定​​文件调整los <- fread("your_file_name.csv") 的某些参数。)

但是,问题中已经提供了一些数据。这些也可以使用fread()作为字符串读取:

fread()

旧解决方案(在OP澄清之前) - 留待此处参考

这是基础R的解决方案,在los <- fread("sequence CCCACCCGCCAGGAAGCCGCTATCACTGTCCAAGTTGTCATCGGAACTCC[A]CCAGCCTGTGGACTTGGCCTGGTGCCGCCCATCCCCCTTGCGGTCCTTGC ACCACTACCCCCTTCCCCACCATCCACCTCAGAAGCAGTCCCAGCCTGCC[A]CCCGCCAGCCCCTGCCCAGCCCTGGCTTTTTGGAAACGGGTCAGGATTGG TTTGCTTTAAAATACTGCAACCACTCCAGGTAAATCTTCCGCTGCCTATA[A]CCCCGCCAATGAGCCTGCACATCAGGAGAGAAAGGGAAGTAACTCAAGCA GAAATCTTCTGAAACAGTCTCCAGAAGACTGTCTCCAAATACACAGCAGA[A]CCAGCCAGTCCACAGCACTTTACCTTCTCTATTCTCAGATGGCAATTGAG GGACTGCCCCAAGGCCCGCAGGGAGGTGGAGCTGCACTGGCGGGCCTCCC[A]GTGCCCGCACATCGTACGGATCGTGGATGTGTACGAGAATCTGTACGCAG GGCCCAACGCCATCCTGAAACTCACTGACTTTGGCTTTGCCAAGGAAACC[A]CCAGCCACAACTCTTTGACCACTCCTTGTTATACACCGTACTATGTGGGT TCTGCCTGGTCCGCTGGAGCTGGGCATTGAAGCCCCGCAGCTGCTCAGCC[A]CCTGCCCCGCCATCAAGAAGGCCCCACCGGCCCTGGGAAGGACACCCCTG TTTGAAGCCCTTATGAACCAAGAAACCTTCGTTCAGGACCTCAAAATCAA[A]CCCCGCCACATGCAGCTCGCAGGCCTGCAGGAGGAAAGACAGGTTAGCAA CTGCAGCCTACCTGTCCATGTCCCAGGGGGCCGTTGCCAACGCCAACAGC[A]CCCCGCCGCCCTATGAGCGTACCCGCCTCTCCCCACCCCGGGCCAGCTAC ACTGGCAAACATGTTGAGGACAATGATGGAGGGGATGAGCTTGCATAGGA[A]CCTGCCGTAGGGCCACTGTCCCTGGAGAGCCAAGTGAGCCAGCGAGAAGG CACCCTCAGAGAAGAAGAAAGGAGCTGAGGAGGAGAAGCCAAAGAGGAGG[A]GGCAGGAGAAGCAGGCAGCCTGCCCCTTCTACAACCACGAGCAGATGGGC CCAGCCCTGTATGAGGACCCCCCAGATCAGAAAACCTCACCCAGTGGCAA[A]CCTGCCACACTCAAGATCTGCTCTTGGAATGTGGATGGGCTTCGAGCCTG TTCCTGTGCGCCCCAACAACTCCTTTAGCTGGCCTAAAGTGAAAGGACGG[A]CCTGCCAATGAAAATAGACTTTCAGGGTCTAGCAGAAGGCAAGACCACCA CTAACACCCGCACGAGCTGCTGGTAGATCTGAATGGCCAAGTCACTCAGC[A]CCTGCCGATACTCAGCCAGGTCAAAATTGGTGAGGCAGTGTTCATTCTGG AGTTCTGCATCTGGAGCAAATCCTTGGCACTCCCTCATGCTGGCTATCAC[A]CCTGCCACGAATGTGCCATGGCCCAACCCTGCAGTCCATAAAGAAAACAA CGTGCCCATGCAGCTAGTGCTCTTCCGAGAGGCTATTGAACACAGTGAGC[A]CCTGCCACGCCTATCCCCTTCCCCATCATCTCAGTGATGGGGTATGTCTA ACAAGGACCTGGCCCTGGGGCAGCCCCTCAGCCCACCTGGTCCCTGCCTT[A]CCCAGCCAGTACTCTCCATCAGCACGGCCGAAGCCCAGCTTGTAGTCATT") 包的帮助下,它将与&#34;列表一起使用&#34;序列(data.frame),方括号中的任何单个字母,以及序列的任意长度。它假定数据已经从文件读入到data.frame中,这里名为stringr

los

请注意,如果每个序列中只有一对方括号,则此代码最有效。任何其他括号都将被忽略。

如果括号中只包含一个字母,例如# create data: data frame with two sequences los <- data.frame( sequence = c("GTCCTGGTTGTAGCTGAAGCTCTTCCC[A]CTCCTCCCGATCACTGGGACGTCCTATGT", "GTCCTGGTTGTAGCTGAAGCTCTTCCCACT[C]CTCCCGATCACTGGGACGTCCTATGT")) # split sequences in three parts mat <- stringr::str_split_fixed(los$sequence, "[\\[\\]]", n = 3) los$letter <- mat[, 2] los$n_before <- stringr::str_count(mat[, 1], mat[, 2]) los$n_after <- stringr::str_count(mat[, 3], mat[, 2]) print(los) # sequence letter n_before n_after #1 GTCCTGGTTGTAGCTGAAGCTCTTCCC[A]CTCCTCCCGATCACTGGGACGTCCTATGT A 3 4 #2 GTCCTGGTTGTAGCTGAAGCTCTTCCCACT[C]CTCCCGATCACTGGGACGTCCTATGT C 9 9 ,它也会起作用。

我承认我沉迷于Hadley Wickham的[GT]包裹,因为我很难记住像stringr这样的字符串操作的不一致命名的基本R函数,strsplitgreplsubmatch等。要了解我的意思,请查看 Usage 另请参阅 gregexpr部分,并与stringr进行比较。

答案 3 :(得分:1)

_app.directive("animate", ['$timeout', function($timeout) {
  return {
    scope: {},
    template: '<div class="header">' +
      '     <ul>' +
      '         <li data-ng-repeat="item in items" data-ng-click="move($index)">' +
      '             <div>{{item}}</div>' +
      '         </li>' +
      '     </ul>' +
      '</div>' +
      '<div class="wrapper" style="position: relative; margin-top: 20px;">' +
      '     <div data-ng-if="index == 0" class="slide" ng-class="slideClass">Content 1</div>' +
      '     <div data-ng-if="index == 1" class="slide" ng-class="slideClass">Content 2</div>' +
      '     <div data-ng-if="index == 2" class="slide" ng-class="slideClass">Content 3</div>' +
      '</div>',
    link: function(scope, elem, attr) {
      scope.items = ["Item 1", "Item 2", "Item 3"]
      scope.index = 0;
      scope.slideClass = 'slide-left';

      scope.move = function(index) {
        scope.slideClass = index < scope.index
                         ? scope.slideClass = 'slide-right'
                         : scope.slideClass = 'slide-left';

        $timeout(function() {
          scope.index = index;
        });
      }
    }
  }
}]);

答案 4 :(得分:0)

我认为生物信息学的R包,例如seqinrBiostrings,将是一个很好的起点。但是,这是一个“自己动手”的解决方案。

第一步:将您的数据从Excel中提取到R.我将假设文件mydata.xlsx包含一个包含序列列且没有标题的表。您需要根据文件和表格格式对其进行调整。

library(readxl)
sequences <- read_excel("mydata.xlsx", col_names = FALSE)
colnames(sequences) <- "sequence"

现在你需要一个函数来提取方括号中的基数和-1和+1的基数。此函数使用stringr包来使用正则表达式提取基数。

get_bases <- function(seq) {
  require(stringr)
  require(magrittr)
  subseqs <- str_match(seq, "^([ACGT]+)\\[([ACGT])\\]([ACGT]+)$")
  bases <- list(
    before = subseqs[, 2] %>% str_sub(-1, -1),
    base   = subseqs[, 3],
    after  = subseqs[, 4] %>% str_sub(1, 1)
  )
  return(bases)
}

现在您可以将序列列传递给函数以生成列表列表,这些列表可以转换为数据框。

library(purrr)
sequences_df <- lapply(sequences, get_bases) %>% 
  map_df(as.data.frame, stringsAsFactors = FALSE)

head(sequences_df, 3)

  before base after
1      C    A     C
2      C    A     C
3      A    A     C

最后一步是使用dplyrtidyr中的函数来计算基数。

library(tidyr)
sequences_df %>% 
  gather(position, letter, -base) %>% 
  group_by(base, position, letter) %>% 
  tally() %>% 
  spread(position, n) %>% 
  select(base, letter, before, after)

使用17个示例序列的结果。如果我是你,我会使用比我更好的名字:base =方括号中的基数,letter =计算基数,before =计数为-1,{{1 }} =计数+1。

after