即使fill = TRUE,read.table也不导入所有列

时间:2018-07-02 21:01:33

标签: r

基本上,一台机器会输出一些值,我需要能够运行此脚本来放入必要的标头,然后将其输入另一个程序。不幸的是,我无法更改输入或输出的格式。

这是我的代码,我将其简化到最低限度以复制我的错误,确信它确实很简单,这使我发疯了。我在此处https://files.fm/u/8jgde7kp

附加了输入的简化.txt文件。
DATA <- file.choose()  
DATA <- read.table(DATA, stringsAsFactors=FALSE, na.strings="--", header=FALSE, sep = "\t")

HDR <- file.choose()  
HDR <- read.table(HDR, stringsAsFactors=FALSE, na.strings="--", header=FALSE, sep = "\t", fill = TRUE)

FULL <- rbind(HDR,DATA)

等等等

问题是由于某种原因,即使使用Fill = True,当它读入标头(也是由另一个程序生成)时,它也会丢弃最后一列并将其推到新行。实际上,第11行应该是第10行的第四列。显然,由于列的不同,rbind每次都不起作用。

image of what DATA imports

因此,我导入标头数据的方式本质上是有问题的,目前我的解决方法是每次都进入并手动在第一行中输入更多标签。

重要说明:输入的列数始终会有所不同,具体取决于我们正在做的工作,但是无论如何,Header.txt的第10行和数据文件的列数总是相同。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

使用col.names使用显式定义的列名:

> HDR <- read.table(
+   "Header.txt",
+   stringsAsFactors=FALSE,
+   na.strings="--",
+   header=FALSE,
+   col.names = paste0("V", 1:4), # <- here
+   sep = "\t",
+   fill = TRUE)
> HDR
                V1                V2           V3           V4
1         [Header]                                            
2     GSGT Version             2.0.3                          
3  Processing Date 6/29/2018 2:31 PM                          
4          Content                     CLassified             
5         Num SNPs              9999                          
6       Total SNPs              9999                          
7      Num Samples              9999                          
8    Total Samples              9999                          
9           [Data]                                            
10        SNP Name         Sample ID Allele1 - AB Allele2 - AB

但是,正如注释中提到的那样,有一种比在输入中强制使用四列结构更好的方法。例如,您需要使用readLines读取标题,然后将DATA附加到其中:

HDR <- readLines("Header.txt")
## save your result
resultFile <- "result.txt"
writeLines(HDR, resultFile)
write.table(DATA,
            file = resultFile,
            append = TRUE, # <- keeps previous content, i.e. HDR
            col.names = FALSE)

答案 1 :(得分:0)

这可能是尝试通过强制转换为data.frame或类似名称而不会损坏(标题或数据)结构的最佳方式。由于它正在被另一个程序读取,因此推测输出是否具有类data.frame无关紧要。

header <- readLines("header.txt")
data <- readLines("data.txt")

fileConnection <- file("combined.txt")
writeLines(c(header, data), fileConnection)
close(fileConnection)

在这里,我们只是分别读取标题行和数据行,保留了它们各自的结构。然后c()将它们连接在一起,并写出到.txt。您可以添加新的行字符writeLines(c(header,"\n",data), fileConnection),以在标题和数据之间添加新行。

此外,无论标题或数据的行数/列数如何,这都应该起作用。标头和数据都保持制表符分隔。

[Header]
GSGT Version    2.0.3
Processing Date 6/29/2018 2:31 PM
Content     CLassified
Num SNPs    9999
Total SNPs  9999
Num Samples 9999
Total Samples   9999
[Data]
SNP Name    Sample ID   Allele1 - AB    Allele2 - AB
NGHS1   Sample1 A   A
NGHS1   Sample1 A   B