【问题标题】:How to split string and count alphabet frequency using dplyr pipe如何使用 dplyr 管道拆分字符串并计算字母频率
【发布时间】:2018-04-04 08:58:32
【问题描述】:

我有以下数据框:

library(tidyverse)
dat <- structure(list(fasta_header = c(">seq1", ">seq2"), sequence = c("MPSRGTRPE", 
"VSSKYTFWNF")), .Names = c("fasta_header", "sequence"), row.names = c(NA, 
-2L), class = c("tbl_df", "tbl", "data.frame"))


dat
#> # A tibble: 2 x 2
#>   fasta_header sequence  
#>   <chr>        <chr>     
#> 1 >seq1        MPSRGTRPE 
#> 2 >seq2        VSSKYTFWNF

我想做的是计算每一行氨基酸的频率。想要的结果是这个(手动)

   fasta_header sequence    M  P   S  R  G   T  E  V  K  Y  F  W  N
   >seq1        MPSRGTRPE   1  1   1  2  1   1  1  0  0  0  0  0  0
   >seq2        VSSKYTFWNF  0  0   2  0  0   1  0  1  1  1  2  1  1

如何使用 dplyr 管道方法做到这一点?

【问题讨论】:

  • 那些“MPSRGTEVKYFWN”列名是固定的还是动态的?
  • @Vasim 动态,即氨基酸列是datsequence 列所有行的唯一值
  • 没有必要重新发明轮子。您应该使用来自BioconductorBiostrings 包。它有各种很棒的功能。
  • 我强烈支持@Amar 的建议。看看?Biostrings::letterFrequency?Biostrings::alphabetFrequency

标签: r dplyr tidyverse


【解决方案1】:

上面的 cmets 是对的,但是如果你真的想要一个 tidyverse 管道...

library(tidyverse)                     #uses dplyr, purrr, tidyr and stringr
dat %>% mutate(split=map(sequence, ~unlist(str_split(., "")))) %>% #split into characters
  unnest() %>%                         #unnest into a new column
  group_by(fasta_header, sequence) %>% #group
  count(split) %>%                     #count letters for each group
  spread(key=split, value=n, fill=0)   #convert to wide format

  fasta_header sequence       E     F     G     K     M     N     P     R     S     T     V     W     Y
  <chr>        <chr>      <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 >seq1        MPSRGTRPE     1.    0.    1.    0.    1.    0.    2.    2.    1.    1.    0.    0.    0.
2 >seq2        VSSKYTFWNF    0.    2.    0.    1.    0.    1.    0.    0.    2.    1.    1.    1.    1.

【讨论】:

    【解决方案2】:

    给你

    library(tidyverse)
    library(stringr)
    library(dplyr)
    dat <- structure(list(fasta_header = c(">seq1", ">seq2"), sequence = c("MPSRGTRPE", 
    "VSSKYTFWNF")), .Names = c("fasta_header", "sequence"), row.names = c(NA, 
                                                                                                                                                 -2L), class = c("tbl_df", "tbl", "data.frame"))
    # Vector of unique amino acids 
    uniqueaa <- as.character(dat$`sequence`) %>% strsplit(split="")  %>%
      c() %>% unlist() %>% unique() %>% data.frame(stringsAsFactors = F)   
    colnames(uniqueaa) <- "uniqueaa"
    # Count occurences
    result <- apply(uniqueaa,1,function(x) str_count(dat$sequence, x["uniqueaa"]))
    colnames(result) <- uniqueaa$uniqueaa
    rownames(result) <- dat$sequence
    result
               M P S R G T E V K Y F W N
    MPSRGTRPE  1 2 1 2 1 1 1 0 0 0 0 0 0
    VSSKYTFWNF 0 0 2 0 0 1 0 1 1 1 2 1 1
    

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 2018-09-25
      • 2018-09-08
      • 2021-12-31
      • 2012-06-04
      • 1970-01-01
      • 2012-10-24
      • 2017-04-20
      相关资源
      最近更新 更多