【问题标题】:Split long string list into comma delimited vector and then convert to a df row将长字符串列表拆分为逗号分隔的向量,然后转换为 df 行
【发布时间】:2021-07-17 22:09:01
【问题描述】:

我收集到这个问题有些常见,但我遇到了一些我似乎无法找到答案的问题。

我的字符串很长:

line1 = "GGCTTATTTAACGGGCAGATATACGCTGGGCAAATC ..."

我希望它看起来像:

line1 = c("G", "G", "C", ...)

(顺便说一句,是否可以将上述字母作为整数 - 当我尝试使用 as.integer 函数时,它会将其全部转换为 NA?)

我尝试过: strsplit(line1, "")

这会产生一个列表:'G''G''C'...

为了解决这个问题,我尝试过: paste(line1, collapse = ", ")

哪种作品:c(\"G\", \"G\", \"C" ...)

当我尝试使用gsub 删除“\”时,它没有这样做,因为它突然将脚本中的所有内容都注册为引号。

此外,一旦完成,我想将其塑造成数据框的一行或一列,如下所示:

   [1] [2] [3] ...
[1] G   G   C

或者:

   [1]
[1] G
[2] G
[3] C

【问题讨论】:

    标签: r dataframe vector comma


    【解决方案1】:

    拆分 unlist 后的结果,将其转换为因子,然后转换为数字:

    fac <- factor(unlist(strsplit(line1, "")))
    as.numeric(fac)
    ## [1] 5 5 4 6 6 3 6 6 6 3 3 4 5 5 5 4 3 5 3 6 3 6 3 4 5 4 6 5 5 5 4 3 3 3 6 4 1 2 2 2
    
    # this gives the correspondence between numbers and characters
    # i.e. space is 1, dot is 2, A is 3, C is 4, G is 5 and T is 6
    levels(fac)
    ## [1] " " "." "A" "C" "G" "T"
    

    也可以使用levels= 参数显式指定级别,在这种情况下,其他字符将为NA,并且可以选择使用na.omit(...) 消除。

    fac <- factor(unlist(strsplit(line1, "")), levels = c("A", "C", "G", "T"))
    as.numeric(fac)
    ## [1]  3  3  2  4  4  1  4  4  4  1  1  2  3  3  3  2  1  3  1  4  1  4  1  2  3  2  4  3  3  3  2  1  1  1  4  2 NA NA NA NA
    

    注意

    问题中的输入如下。可能最后 4 个字符不打算成为数据的一部分,但如果是这样,那么它应该是这样写的,这样其他人就不必编辑它了。无论如何,上面的代码应该可以工作。

    line1 = "GGCTTATTTAACGGGCAGATATACGCTGGGCAAATC ..." 
    

    【讨论】:

      【解决方案2】:

      这个问题似乎要求dput 的输出,但这很少需要。

      x <- strsplit(line1, "")[[1]]
      dput(x)
      #c("G", "G", "C", "T", "T", "A", "T", "T", "T", "A", "A", "C", 
      #"G", "G", "G", "C", "A", "G", "A", "T", "A", "T", "A", "C", "G", 
      #"C", "T", "G", "G", "G", "C", "A", "A", "A", "T", "C")
      

      关于如何从字符串中获取整数的问题,这里有一个方法。输出是原始 line1 字符串中字母的 ASCII 码。

      charToRaw(line1)
      # [1] 47 47 43 54 54 41 54 54 54 41 41 43 47 47 47 43 41 47 41 54 41 54 41
      #[24] 43 47 43 54 47 47 47 43 41 41 41 54 43
      

      数据

      line1 <- "GGCTTATTTAACGGGCAGATATACGCTGGGCAAATC"
      

      【讨论】:

      • 这确实有效,谢谢!但是 dput() 的输出不能保存到向量中——这有关系吗?
      • @hemr3 不,没关系。您只需要它来保存或共享数据并在以后重建它。在每天的 R 编程中,您将不需要双引号,在问题中您将字符向量的打印方法误认为是 strsplitTL; DR:不用担心双引号。
      【解决方案3】:

      要将该列表转换为字符向量,您只需:

      x <- strsplit(line1, "")
      x <- x[[1]]
      

      要使其成为 df 的列,您可以执行以下操作:

      x <- as.data.frame(x)
      

      或者直接从第一行开始:

      x <- as.data.frame(strsplit(line1, ""))
      

      这会给它一个丑陋的列标题,你可以用它来修复

      names(x)[1] <- 'whatever'
      

      或者直接在一次通话中再次:

      x <- as.data.frame(strsplit(line1, ""), col.names = 'whatever')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多