r - read.table() 的问题,新行会创建不需要的空白字段

标签 r

我刚开始使用 R 并试图掌握一些内置函数。我正在尝试组织一个基本的 FASTA 文本文件,如下所示:

>ID1
AGAATAGCCAGAACCGTTTCTCTGAGGCTTCC
>ID2
TCCAATTAAGTCCCTATCCAGGCGCTCCG
>ID3
GAACCGGAGAACGCTTCAGACCAGCCCGGAC

变成一个看起来像这样的表:
ID   Sequence
ID1  AGAATAGCCAGAACCGTTTCTCTGAGGCTTCC
ID2  TCCAATTAAGTCCCTATCCAGGCGCTCCG
ID3  GAACCGGAGAACGCTTCAGACCAGCCCGGAC

或者至少以类似的方式组织一些东西。不幸的是,每当我尝试使用 read.table , 我被迫设置 fill = TRUE , 以避免出现以下错误:
> read.table("ReadingText.txt", header=F, fill=F, sep=">")
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
  line 2 did not have 2 elements

设置 fill = TRUE不能解决问题,因为它只是引入了不需要的空白字段。我觉得我的问题是 R 希望将输入中的每个新行都视为输出中的一个新行,而我希望它仅在每个 ">"处开始一个新行并移至输入的每个新行的同一行。

那么,你将如何让它发挥作用? read.table 只是尝试使用错误的函数来执行此操作还是还有其他功能?另外,我真的很想在不使用任何软件包的情况下完成此操作!我想很好地掌握 R 中的内置函数。

感谢您花时间阅读本文,如果我在这里发布错误,我深表歉意。这是我第一次问任何事情。

最佳答案

使用 read.table() 执行此操作需要一些棘手的后期处理。或 readLines() .有一个功能read.fasta()在 seqinr 包中,可以帮助您完成大部分工作。然后我们只需将结果列表转换为数据框。

library(seqinr)
(fasta <- read.fasta("so.fasta", set.attributes = FALSE, as.string = TRUE, forceDNAtolower = FALSE))
# $ID1
# [1] "AGAATAGCCAGAACCGTTTCTCTGAGGCTTCC"
#
# $ID2
# [1] "TCCAATTAAGTCCCTATCCAGGCGCTCCG"
#
# $ID3
# [1] "GAACCGGAGAACGCTTCAGACCAGCCCGGAC"

setNames(rev(stack(fasta)), c("ID", "Sequence"))
#    ID                         Sequence
# 1 ID1 AGAATAGCCAGAACCGTTTCTCTGAGGCTTCC
# 2 ID2    TCCAATTAAGTCCCTATCCAGGCGCTCCG
# 3 ID3  GAACCGGAGAACGCTTCAGACCAGCCCGGAC

so.fasta 文件在哪里
writeLines(">ID1
AGAATAGCCAGAACCGTTTCTCTGAGGCTTCC
>ID2
TCCAATTAAGTCCCTATCCAGGCGCTCCG
>ID3
GAACCGGAGAACGCTTCAGACCAGCCCGGAC", "so.fasta")

注:帕斯卡在评论中提出了一个很好的观点。当您的特定任务已经存在工具时,请利用它并使用它。当有人已经不厌其烦地创建这个工具并在一个包中共享它以帮助其他尝试解决问题的用户时,真的没有必要花时间尝试使用不适合工作的功能来执行此操作同样的问题。

更新:其实,使用 readLines() 并没有那么难,只要你有一个干净的文件。这是仅使用基本函数的可能解决方案。
x <- readLines("so.fasta")
ids <- grepl("^>", x)
data.frame(ID = sub(">", "", x[ids]), Sequence = x[!ids])
#    ID                         Sequence
# 1 ID1 AGAATAGCCAGAACCGTTTCTCTGAGGCTTCC
# 2 ID2    TCCAATTAAGTCCCTATCCAGGCGCTCCG
# 3 ID3  GAACCGGAGAACGCTTCAGACCAGCCCGGAC

关于r - read.table() 的问题,新行会创建不需要的空白字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34604668/

相关文章:

r - 如何使用R处理多天数据

r - 如何使用 dplyr 将行转换为列

r - 可格式化对象的粗体行名称

r - 有没有办法包含来自不同目录的子 Rmd 文件

RMarkdown : bookdown with plotly

r - 根据条件复制 data.table 中的行

r - 在 Linux 中替代 R 的 `memory.size()`?

r - distr包-如何在一个窗口中绘制两个图?

r - ggplot 使用小饼图作为带有 geom_point 的点

r - 通过 for 循环/lappy 对数据进行子集化和绘图