【问题标题】:R: translate strings of numbers into strings of letters following a relationships table [duplicate]R:将数字字符串转换为关系表之后的字母字符串[重复]
【发布时间】:2021-11-21 00:41:14
【问题描述】:

我有一个向量mynumbers,上面有几串数字,比如说:

mynumbers <- c("122212", "134134", "134134", "142123", "212141", "213243", "213422", "214231", "221233")

我的目标是按照这些关系将这些字符串翻译成字母字符串:

1=A
2=C
3=G
4=T

我想把它封装在一个函数中,这样:

myletters <- translate_function(mynumbers)

myletters 因此将是:

myletters <- c("ACCCAC", "AGTAGT", "AGTAGT", "ATCACG", "CACATA", "CAGCTG", "CAGTCC", "CATCGA", "CCACGG")

我正在考虑这样的函数,显然不正确...在处理strsplit 和列表时我开始感到困惑...

translate_function <- function(numbers){
  map_df <- data.frame(num=1:4, nuc=c('A','C','G','T'))
  #strsplit numbers
  split_numbers <- strsplit(numbers, '')
  letters <- paste(sapply(split_numbers, function(x) map_df$nuc[which(map_df$num==x)]), collapse='')
  
  return(letters)
}

实现此目的最简单、最优雅的方法是什么?谢谢!

【问题讨论】:

    标签: r string function translate


    【解决方案1】:

    chartr 很容易,

    chartr("1234" , "ACGT", mynumbers)
    [1] "ACCCAC" "AGTAGT" "AGTAGT" "ATCACG" "CACATA" "CAGCTG" "CAGTCC" "CATCGA"
    [9] "CCACGG"
    

    【讨论】:

    • 哦,哇,我不知道chartr,谢谢!
    【解决方案2】:

    以这种方式在函数中使用它:

    translate_function <- function(numbers){
      map_df <- data.frame(num=1:4, nuc=c('A','C','G','T'))
      letters <- chartr(paste(map_df$num, collapse=''), paste(map_df$nuc, collapse=''), numbers)
      return(letters)
    }
    translate_function(mynumbers)
    

    输出:

    [1] "ACCCAC" "AGTAGT" "AGTAGT" "ATCACG" "CACATA" "CAGCTG" "CAGTCC" "CATCGA"
    [9] "CCACGG"
    

    但最好没有数据框:

    translate_function <- function(numbers){
      letters <- chartr("1234", "ACGT", numbers)
      return(letters)
    }
    translate_function(mynumbers)
    

    输出:

    [1] "ACCCAC" "AGTAGT" "AGTAGT" "ATCACG" "CACATA" "CAGCTG" "CAGTCC" "CATCGA"
    [9] "CCACGG"
    

    【讨论】:

      【解决方案3】:

      您可以使用stringr::str_replace_allmap_df 创建一个命名向量来替换。

      map_df <- data.frame(num=1:4, nuc=c('A','C','G','T'))
      stringr::str_replace_all(mynumbers, setNames(map_df$nuc, map_df$num))
      
      #[1] "ACCCAC" "AGTAGT" "AGTAGT" "ATCACG" "CACATA" "CAGCTG" "CAGTCC" "CATCGA" "CCACGG"
      

      【讨论】:

        【解决方案4】:

        使用gsubfn

        library(gsubfn)
        gsubfn("(\\d)", setNames(as.list(c("A", "C", "G", "T")), 1:4), mynumbers)
        [1] "ACCCAC" "AGTAGT" "AGTAGT" "ATCACG" "CACATA" "CAGCTG" "CAGTCC" "CATCGA" "CCACGG"
        

        【讨论】:

          猜你喜欢
          • 2019-12-01
          • 2018-05-31
          • 1970-01-01
          • 2014-07-06
          • 2018-01-08
          • 1970-01-01
          • 2019-10-10
          • 2018-02-01
          • 1970-01-01
          相关资源
          最近更新 更多